1.一元線性回歸與損失函數
在我們解決一元線性回歸進行擬合曲線的時候,常常會使用梯度下降法。
假設我們的數據集為
# 訓練數據
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])
我們想將其擬合成一條曲線,然后進行訓練。擬合曲線表示如下

我們如何去擬合呢?顯然兩點確定一條直線的。我們就其次,然后求得一個函數,各個點到該函數的方差和最小,於是,我們將其稱為損失函數(也叫代價函數、目標函數),該函數如下

該方程為凸函數,並且有極小值。
2.梯度下降法求解最小值
我們解決一個函數的最小值的時候,往往會想到使用導數來求。但是,在多維數據,或者大數據情況下,這種求解方法不適用。
於是,我們有了一個新的方法。
例題:求解y = x^2的極小值
1.我們可以隨機取一個點m,假設取到了10, 那么我們顯然偏離了,我們進行計算,發現y = 10^2=100,偏右邊了怎么辦呢?
2.我們將m減去導數,得到100-2*10,靠近了一點點,我們反復取值,即可靠近最低點。
3.在機器學習中,往往允許的誤差是極小的,所以,我們應該將m乘上一個alpha值,這個值是學習率,學習率越低,往往擬合函數越好,但是也不是無限低的。
3.梯度下降求解一元線性回歸
我們將梯度下降,用來求解一個線性回歸,那么任意取值w0, w1
w0, w1每次變動的值為對w0, w1的偏導數,即:

計算可得到:

4.由3我們可以得到python代碼和擬合圖像
import numpy as np
import matplotlib.pyplot as plt
def h(x):
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,這個小於誤差則擬合成功
5.常見問題
1.如果我們把alpha學習率設置為大於1,那么我們會error,因為,造成了梯度向上
2.如果我們采用絕對值代替方差,可行嗎?
不可行,因為平方,會擬合的更完善。而絕對值可能造成過擬合,使我們預測不准確。
