1. 程式人生 > >機器學習--線性回歸與梯度算法

機器學習--線性回歸與梯度算法

方法 nbsp methods 大循環 href 一次 sha 4.3 最優

線性回歸(Linear Regression),亦稱為直線回歸,即用直線表示的回歸,與曲線回歸相對。若因變量Y對自變量X1、X2…、Xm的回歸方程是線性方程,即μy=β01X12X2 +…βmXm,其中β0是常數項,βi是自變量Xi的回歸系數,M為任何自然數。這時就稱Y對X1、X2、…、Xm的回歸為線性回歸。

簡單回歸:

只有一個自變量的線性回歸稱為簡單回歸,如下面示例:

X表示某商品的數量,Y表示這些不同數量商品的總價格

x=[0, 1, 2, 3, 4, 5]

y=[0, 17, 45, 55, 85, 99]

二維坐標中繪圖如下圖:

技術分享圖片

現在當商品數量 X = 6時,估計商品總價是多少?

我們可以很明顯的看到,商品總價隨商品的數量上升而上升,這是一個典型的線性回歸。

因為只有一個自變量X,我們假設線性回歸模型: Y = a * X + b

我們需要求出最合適的a,b值,使得直線:Y = a * X + b 與上圖的趨勢相擬合,這時候才能去預測不同商品數量X下的總價Y。

最小二乘法:

為了求出最合適的a b ,我們引入最小二乘法。

最小二乘法,亦稱最小二乘法估計。由樣本觀測值估計總體參數的一種常用方法。它用於從n對觀測數據(x1,y1),(x2,y2),……,(xn,yn)確定x與y之間對應關系y=f(x)的一種最佳估計,使得觀測值與估計值之差(即偏差)的平方和 H為最小。

技術分享圖片

最小二乘法能盡量消除偶然誤差的影響,從而由一組觀測數據求出最可靠、最可能出現的結果。

由上圖我們可以很明顯的看出直線Y = a * X + b過原點,即 b = 0

我們嘗試不同的a值 得到的結果如下:

a = 19 時 H = 154

a = 20 時 H = 85

a = 21 時 H = 126

圖像分別如下:

技術分享圖片 技術分享圖片 技術分享圖片

我們可以粗略得出結論 a = 20,b = 0 時,線性模型 Y = 20 * X 與樣本數據擬合的比較好。

所以當商品數量 X = 6 時,我們可以粗略估計總價Y = 20 * 6 = 120

多元回歸:

大於一個自變量的線性回歸叫做多元回歸。

上面的例子只是一個自變量,處理起來比較簡單,但是若自變量有很多,假設自變量有m個,為 [ x1

,x2,x3,x4.....xm ]

這時候我們假設的回歸系數(即權重)也需要有m個,即我們假設的線性模型是 Y = X0 + X1*W1 + X2*W2 + X3*W3 + ....... + Xm*Wm

為了計算方便,我們去W0 = 1

這樣:Y = X0*W0 + X1*W1 + X2*W2 + X3*W3 + ....... + Xm*Wm

寫成向量形式:

W = [W0,W1 , W2 ,W3 , .... ,Wm]

X = [ X0, X1 , X2 , X3 , .... , Xm]

Y = WT * X (WT為向量W的轉置)

觀測值與估計值之差(即偏差)的平方和:

技術分享圖片

為了方便後面計算,我們在H的左邊乘上二分之一,即:

技術分享圖片

上面公式中 n 表示訓練樣本的數目,m 表示每條訓練樣本 的特征(自變量)個數,技術分享圖片上標表示屬於第 j 個 樣本,下標表示第 i 個特征(自變量值),技術分享圖片表示第 j 個樣本總價觀測值

現在H是關於W0,W1,W2....Wm的函數,我們需要通過合適的方法求出最適合的W值,才能得出一個比較好的線性回歸方程。與簡單回歸相比,這裏我們很難通過觀察與嘗試不同的w值來求解,我們需要采用最優化算法。

梯度算法:

常見的最優化算法有梯度下降法(Gradient Descent)、牛頓法和擬牛頓法(Newton‘s method & Quasi-Newton Methods)、共軛梯度法(Conjugate Gradient)、 啟發式優化方法等,本文詳細介紹梯度算法。

明確下我們現在的目標:我們需要通過梯度算法求出---當在H取得最小的情況下,W0 ,W1 ,W2 ,W3 , ....... ,Wm的值,從而寫出回歸方程。

梯度算法分為梯度上升算法 和 梯度下降算法。梯度下降算法的基本思想是:要找到某函數的最小值,最好的方法是沿著該函數的梯度方向探尋,梯度上升則相反。對於一個有兩個未知數x,y的函數f(x,y),梯度表示為:

技術分享圖片

對於Z = f(x,y),使用梯度下降算法的意味著 沿X軸方向移動技術分享圖片,沿Y的方向移動技術分享圖片,函數f(x,y)必須要在待計算的點上有定義並且可微。

可以通俗理解為:

梯度實際上是函數值變化最快的方向。比如說,你站在一個山上,梯度所指示的方向是高度變化最快的方向。你沿著這個方向走,能最快的改變(增加或是減小)你所在位置的高度,但是如果你亂走,可能走半天所在位置高度也沒有變化多少。也就是說,如果你一直沿著梯度走,你就能最快的到達山的某個頂峰或低谷。所以實際上,梯度算法是用來搜索局部極小值或極大值的,它是實際應用中一種非常高效,高速且可靠的方法。

用梯度下降法找出最小H

我們前面看到:

技術分享圖片

H是關於W = [W0 ,W1 ,W2 ,W3 , ....... ,Wm]的函數,H的梯度如下:

技術分享圖片

這個時候對於每一個Wi的梯度:

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

我們假設每次沿著梯度方向更新的步長為 α,所以W的值更新公式可寫為:

技術分享圖片

所以梯度下降算法的偽代碼如下:

每個回歸系數(即每個W值)的每個值都為1

重復R次:

  計算整個數據集的梯度技術分享圖片

使用技術分享圖片 更新回歸系數W

實例:

用梯度下降 算法求下面商品數據的線性回歸方程

技術分享圖片

我們假設線性回歸模型為總價Y = a + b * X1 + c * X2 (X1 X2 分別表示商品1,2的數量)

我們需要求出回歸系數W = [ a, b, c]

梯度下降算法如下:

 1 import numpy as np
 2 
 3 def grad_desc(train_data, train_labels):
 4     """梯度下降"""
 5     data_mat = np.matrix(train_data)
 6     label_mat = np.matrix(train_labels).transpose()
 7     n = np.shape(data_mat)[1]
 8     # 步長
 9     alpha = 0.001
10     # 最大循環次數
11     max_cycles = 100
12     # 初始化回歸系數weights
13     weights = np.ones((n, 1))
14     for index in range(max_cycles):
15         h = data_mat * weights-label_mat
16         weights = weights - alpha * data_mat.transpose() * h
17         # 返回壓平的系數數組
18     return np.asarray(weights).flatten()

我們用上面算法得到的回歸系數為

[ 1.7218815 4.24881047 5.28838946] 隨機梯度算法: 上述梯度算法中,循環R = 100次,每一次更新回歸系數都需要遍歷整個數據集,如果數據樣本很大,那麽計算時間復雜度將會非常高。 所以一般每次使用一個樣本點來更新回歸系數,稱為隨機梯度算法。 隨機梯度下降算法偽代碼如下: 所有回歸系數初始化為1   重復R次:     循環每一個樣本:       計算該樣本的梯度技術分享圖片

    使用技術分享圖片 更新回歸系數W

修改後的算法如下:

 1 import numpy as np
 2 
 3 def advanced_random_grad_desc(train_data, train_labels):
 4     """隨機梯度下降改進"""
 5     data_mat = np.asarray(train_data)
 6     label_mat = np.asarray(train_labels)
 7     m, n = np.shape(data_mat)
 8     # 步長
 9     alpha = 0.001
10     # 初始化回歸系數weights
11     weights = np.ones(n)
12     max_cycles = 500
13     for j in range(max_cycles):
14         data_index = list(range(m))
15         for i in range(m):
16             random_index = int(np.random.uniform(0, len(data_index)))
17             h = sum(data_mat[random_index] * weights)-label_mat[random_index]
18             weights = weights - alpha * h * data_mat[random_index]
19             del data_index[random_index]
20     return weights

計算得到的回歸系數為:

[ 1.27137416 4.31393524 5.2757683 ]

我們可以得到線性回歸方程為:

Y = 1.27 + 4.31 * X1 + 5.28 * X2

寫在後面的話:

本文的完整代碼已上傳:https://gitee.com/beiyan/machine_learning/tree/master/gradient

隨機梯度下降(上升)算法使用非常廣泛,效果也非常好,後續文章將使用梯度算法來解決一些問題。不例外,梯度算法也是有缺點的,如靠近極小值時收斂速度減慢、直線搜索時可能會產生一些問題、可能會“之字形”地下降等,另外下降或上升步長的選擇也會影響最後得到的回歸系數,我們可以通過改變一些參數來測試回歸的效果。

機器學習--線性回歸與梯度算法