@tocpython
迴歸能夠作任何事情。然而大多數公司經常使用迴歸法作一些比較沉悶的事情,例如:算法
固然也能夠作有新意的應用,例如:數組
從咱們最熟悉的開始, 已知兩點,求直線公式設 y = ax+b, 帶入兩點,求得解析解爲 y = 3x-60dom
這個例子是預測住房價格的,咱們要使用一個數據集,數據集包含西安市的住房價格。在這裏,我要根據不一樣房屋尺寸所售出的價格,畫出個人數據集。比方說,若是你朋友的房子是40平方米大小,你要告訴他們這房子能賣多少錢。那麼,你能夠作的一件事就是構建一個模型,也許是條直線,從這個數據模型上來看,也許你能夠告訴你的朋友,他能以大約78萬(人民幣)左右的價格賣掉這個房子。這就是監督學習算法的一個例子。機器學習
m:表示訓練集數據的總量 x:表示輸入變量 y:表示輸出變量 (x,y): 表示一個訓練樣本 (x(i),y(i)): 表示第i個訓練樣本
對於一元線性迴歸(單變量線性迴歸)來講,學習算法爲 y = ax + b
咱們換一種寫法: hθ(x) = θ0 + θ1x1函數
from sklearn.linear_model import LinearRegression import numpy as np # 1).模擬數據 X = np.random.rand(100, 1) Y = 4 + 2 * X + np.random.randn(100, 1) # 2). 調用sklearn擬合數據, 把theta0 theta1求出來 # 導入線性迴歸類 lin_reg = LinearRegression() # 讓線性迴歸類作訓練 lin_reg.fit(X, Y) # 輸出theta0 theta1; intercept_是截距, coef_是斜率係數; print("\ntheat0, theta1:", lin_reg.intercept_, lin_reg.coef_) # 3). 預測 X_new = np.array([[0], [1]]) print("\nx=0, x=1預測結果:\n", lin_reg.predict(X_new))
下面的三張圖, 展現了擬合的三種狀態:學習
咱們選擇的參數決定了咱們獲得的直線相對於咱們的訓練集的準確程度,模型所預測的值與訓練集中實際值之間的差距(下圖中藍線所指)就是建模偏差(modeling error)。
上圖是參考吳恩達視頻的圖片, 咱們會發現隨着theta1的不斷變化, 均方偏差MSE會找到一個最小值。 若是從數學角度來看, 就是求解函數的導數,計算函數的最小值。測試
上圖是參考吳恩達視頻的圖片, 咱們會發現隨着theta0和theta1的不斷變化, 均方偏差MSE會找到一個最小值。爲了經過圖形化看到最小的均方差, 三維圖片並不直觀。 一般使用等高線實現。以下圖:spa
咱們會遇到更復雜、更高維度、更多參數的狀況,而這些狀況是很難畫出圖的,所以更沒法將其可視化,所以咱們真正須要的是編寫程序來找出這些最小化代價函數的和的值,而梯度降低算法就是可以自動地找出能使代價函數最小化的參數和的值。3d
梯度降低是一個用來求函數最小值的算法,咱們將使用梯度降低算法來求出代價函數的最小值。
梯度降低背後的思想是:開始時咱們隨機選擇一個參數的組合,計算代價函數,而後咱們尋找下一個能讓代價函數值降低最多的參數組合。咱們持續這麼作直到到到一個局部最小值(local minimum),由於咱們並無嘗試完全部的參數組合,因此不能肯定咱們獲得的局部最小值是否即是全局最小值(global minimum),選擇不一樣的初始參數組合,可能會找到不一樣的局部最小值。
想象一下你正站立在山的這一點上,站立在你想象的公園這座紅色山上,在梯度降低算法中,咱們要作的就是旋轉360度,看看咱們的周圍,並問本身要在某個方向上,用小碎步儘快下山。這些小碎步須要朝什麼方向?若是咱們站在山坡上的這一點,你看一下週圍,你會發現最佳的下山方向,你再看看周圍,而後再一次想一想,我應該從什麼方向邁着小碎步下山?而後你按照本身的判斷又邁出一步,重複上面的步驟,從這個新的點,你環顧四周,並決定從什麼方向將會最快下山,而後又邁進了一小步,並依此類推,直到你接近局部最低點的位置。
理解
批梯度降低:指的是每降低一步,使用全部的訓練集來計算梯度值
""" 線性迴歸實現梯度降低的批處理(batch_gradient_descent ) """ import numpy as np X = 2 * np.random.rand(100, 1) y = 4 + 3 * X + np.random.randn(100, 1) X_b = np.c_[np.ones((100, 1)), X] # print(X_b) learning_rate = 0.1 # 一般在作機器學習的時候,通常不會等到他收斂,由於太浪費時間,因此會設置一個收斂次數 n_iterations = 100000 m = 100 # 1.初始化theta, w0...wn theta = np.random.randn(2, 1) count = 0 # 4. 不會設置閾值,之間設置超參數,迭代次數,迭代次數到了,咱們就認爲收斂了 for iteration in range(n_iterations): count += 1 # 2. 接着求梯度gradient gradients = 1/m * X_b.T.dot(X_b.dot(theta)-y) # 3. 應用公式調整theta值, theta_t + 1 = theta_t - grad * learning_rate theta = theta - learning_rate * gradients print(count) print(theta)
隨機梯度降低:指的是每降低一步,使用一條訓練集來計算梯度值
「Mini-Batch」梯度降低:指的是每降低一步,使用一部分的訓練集來計算梯度值