在我們解決一元線性回歸進行擬合曲線的時候,常常會使用梯度下降法。
假設我們的資料集為
# 訓練資料
x_train = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
y_train = np.array([1, 3, 4, 5, 6, 7, 8, 9, 10])
我們想將其擬合成一條曲線,然後進行訓練。擬合曲線表示如下
我們如何去擬合呢?顯然兩點確定一條直線的。我們就其次,然後求得乙個函式,各個點到該函式的方差和最小,於是,我們將其稱為損失函式(也叫代價函式、目標函式),該函式如下
該方程為凸函式,並且有極小值。
我們解決乙個函式的最小值的時候,往往會想到使用導數來求。但是,在多維資料,或者大資料情況下,這種求解方法不適用。
於是,我們有了乙個新的方法。
例題:求解y = x^2的極小值
1.我們可以隨機取乙個點m,假設取到了10, 那麼我們顯然偏離了,我們進行計算,發現y = 10^2=100,偏右邊了怎麼辦呢?
2.我們將m減去導數,得到100-2*10,靠近了一點點,我們反覆取值,即可靠近最低點。
3.在機器學習中,往往允許的誤差是極小的,所以,我們應該將m乘上乙個alpha值,這個值是學習率,學習率越低,往往擬合函式越好,但是也不是無限低的。
我們將梯度下降,用來求解乙個線性回歸,那麼任意取值w0, w1
w0, w1每次變動的值為對w0, w1的偏導數,即:
計算可得到:
return w0 + w1 * x // 函式
if __name__ == '__main__':
# alpha學習率
rate = 0.02
# y = w0 * x + w1
w0 = np.random.normal()
w1 = np.random.normal()
# 訓練資料
x_train = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
y_train = np.array([1, 3, 4, 5, 6, 7, 8, 9, 10])
err = 1
# 計算誤差函式
while (err > 0.1):
for (x, y) in zip(x_train, y_train):
w0 -= (rate * (h(x) - y) * 1)
w1 -= (rate * (h(x) - y) * x)
# 代入找誤差
err = 0.0
for (x, y) in zip(x_train, y_train):
err += (y - h(x)) ** 2
err /= float(x_train.size * 2)
# 列印
print("w0的值為%f" % w0)
print("w1的值為%f" % w1)
print("誤差率的值為%f" % err)
# 畫圖
x = np.linspace(0, 10, 10)
y = h(x)
plt.figure()
plt.plot(x_train, y_train, 'ro')
plt.plot(x, y)
plt.title("linear_regression")
plt.xlabel('x')
plt.ylabel('h(x)')
plt.show()
擬合影象如下:
我們發現在編碼的過程中,我們有2個停止迭代的條件:
1.嘗試次數,嘗試次數 < 給定次數(因為有時候你的閾值設定不對會造成死迴圈)
2.誤差值mse,這個小於誤差則擬合成功
1.如果我們把alpha學習率設定為大於1,那麼我們會error,因為,造成了梯度向上
2.如果我們採用絕對值代替方差,可行嗎?
不可行,因為平方,會擬合的更完善。而絕對值可能造成過擬合,使我們**不準確。
梯度下降法 一元線性回歸
import numpy as np import matplotlib.pyplot as plt 載入資料,delimite表示分隔符為逗號 data np.genfromtxt data.csv delimiter x data data 0 y data data 1 plt.scatter...
梯度下降法 一元線性回歸
import numpy as np import matplotlib.pyplot as plt 載入資料 data np.genfromtxt data.csv delimiter x data data 0 y data data 1 plt.scatter x data,y data pl...
線回與非線回 梯度下降法的一元線性回歸
對於線性回歸問題,通常有兩種方法可以解決,即梯度下降法和標準方程法,兩者各有優缺點 梯度下降法對於引數多的回歸方程仍然適用,但並不是每次都能達到最優解,神經網路也需要梯度下降法來解決 標準方程法適用於引數少的回歸方程,但是時間複雜度較高 首先來看一下梯度下降法的 import numpy as np...