線性迴歸的有關概念已在筆者相關文章中進行介紹。本篇內容將介紹梯度下降(BGD)相關內容。
1.梯度下降
梯度下降常用於機器學習中求解符合最小損失函數的模型的參數值,梯度下降也是BP神經網絡的核心,本文將介紹批量梯度下降法(BGD)。
如上圖所示,梯度下降的過程便是沿梯度方向,按照一定的步伐求解極小(大)值。這裏舉一個簡單的例子,假如你在一座山上,你怎樣才能最安全最快速地下山,這裏有兩個條件,一是安全下山,二是快速下山。答案便是沿着較爲陡峭(梯度)的地方,且容易落腳(步伐大小,即學習率)的地方一步一步地下山。
梯度,也就是“山”的斜度,在上圖中,便是每個點處的斜率,即導數。下面給出梯度下降的數學公式:
上式中,便是下一步,是當前所處的位置,是步伐大小(學習率),爲梯度,也就是對的偏導數。
另外,上式中的爲損失函數,也就是描述結果準確程度的函數,在這裏,我們定義損失函數爲:
理論上,當損失函數取最小值0時,便爲最優的結果。對於上述,其實還有其他的損失函數也能很好地發揮作用,但是平方誤差損失函數是解決迴歸問題最常用的手段。
在上式中,表示當前與矩陣的點乘。如:
,
則
在上式中,是我們的實際數據。
對求偏導,得:
即最終表達式爲:
按照上式,便可求出最終參數。
關於學習率的說明:如果學習率太小,會導致學習時間變長,消耗資源變大。如果學習率太大,可能會越過最低(高)點,誤差變大,甚至導致函數無法收斂。
2.python實現
一元參數測試:
import numpy as np
X = mat([1, 2, 3]).reshape(3, 1) # x爲1,2,3
Y = mat([5, 10, 15]).reshape(3, 1) # y爲5,10,15
theta = 1 #初始爲1
alpha = 0.1 # 學習率爲0.1
for i in range(100):
theta = theta + np.sum(alpha * (Y - dot(X, theta)) * X.reshape(1, 3))/3 # 公式實現
print(theta)
由代碼的初始數據可知,方程應爲,下面我們測試theta是否爲5:
測試結果正確。
實戰:
同樣,這裏準備了最小二乘法的測試數據,待下面測試結束後,讀者可檢查結果是否與最小二乘法的結果一致。
數據示例截圖如下:
上述數據爲某一商品的銷售量與售價、服務投資和其它投資的對應關係,即我們要求出:
,,
中,矩陣。
代碼如下:
import numpy as np
import pandas as pd
from numpy import dot
dataset = pd.read_csv('C:\\Users\\57105\\Desktop\\data.csv') # 讀入數據
X = dataset.iloc[:, 2: 5] # x爲所有行,2到4列
Y = dataset.iloc[:, 1] # y爲所有行,第1列
theta = np.array([1.0, 1.0, 1.0]).reshape(3, 1) # theta初始值
alpha = 0.1 # 學習率
temp = theta
X0 = X.iloc[:, 0].values.reshape(60, 1)
X1 = X.iloc[:, 1].values.reshape(60, 1)
X2 = X.iloc[:, 2].values.reshape(60, 1)
Y = Y.values.reshape(60, 1)
for i in range(1000): # 這裏特別注意,在完成一次循環後,整體更新theta
temp[0] = theta[0] + alpha * np.sum((Y - dot(X, theta)) * X0) / 60.0
temp[1] = theta[1] + alpha * np.sum((Y - dot(X, theta)) * X1) / 60.0
temp[2] = theta[2] + alpha * np.sum((Y - dot(X, theta)) * X2) / 60.0
theta = temp
print(theta)
測試結果:
即,結果與最小二乘法幾乎一致,如想再精確,可調整學習率。即,該回歸方程反應了商品銷售量與售價、服務投資和其它投資的關係。
上述便爲梯度下降的相關內容。