1. 程式人生 > >線性迴歸模型和最小二乘法

線性迴歸模型和最小二乘法

1. 線性迴歸基本概念

  線性迴歸假設因變數與自變數之間存線上性關係,因變數可通過自變數線性疊加而得到,即因變數和自變數之間可用如下方式表示。

  

  式中為自變數,為權重係數,為偏置。

  線性迴歸就是要解決如何利用樣本求取擬合出上述表示式,獲得最佳直線的問題,最常用的就是最小二乘法。

  最小二乘法:最佳擬合線性,將已知樣本的自變數代入擬合直線,得到的觀測值與實際值之間的誤差平方和最小。

2、一元線性迴歸

  為了好理解,先從簡單的情況開始,即一元線性迴歸。

(1)利用方程組來解係數

  假設因變數和自變數可用如下函式表示:

  對於任意樣本點有誤差誤差平方和

  

  那什麼樣的a和b會使得誤差平方和最小呢?

  上面是求最值的問題,我們會想到導數和偏導數,這裡在偏導數等於0的地方能取到極值,並且也是最值。
分別對a和b求偏導得到如下表達式:

  

  通過對二元一次方程組

  

  進行求解,可以得到如下解:

  

  上面的數學過程用程式碼表示如下:

import numpy as np
import matplotlib.pyplot as plt

def calcAB(x,y):
    """
    一元線性迴歸
    """
    n = len(x)
    sumX, sumY, sumXY, sumXX 
= 0, 0, 0, 0 for i in range(0, n): sumX += x[i] sumY += y[i] sumXX += x[i] * x[i] sumXY += x[i] * y[i] a = (n * sumXY - sumX * sumY) / (n * sumXX - sumX * sumX) b = (sumXX * sumY - sumX * sumXY) / (n * sumXX - sumX * sumX) return a, b xi = [1,2,3,4,5,6,7,8,9,10] yi
= [10,11.5,12,13,14.5,15.5,16.8,17.3,18,18.7] a,b=calcAB(xi,yi) print("y = %10.5fx + %10.5f" %(a,b)) x = np.linspace(0,10) y = a * x + b plt.plot(x,y) plt.scatter(xi,yi) plt.show()

  python資料散點和擬合的直線如下:

  

(2)利用矩陣的方法來求解係數

  函式

  也可以表示成如下的形式

  

  式中

  對於n個樣本,此時損失函式(即誤差平方和)為:

  

  假如我們將樣本表示成如下形式:

  

  則

  

  進一步,可以將損失函式表示如下形式:

  

  L對W求導,可得到

  

  令導數為0,則有

  

  從而

  

  進而可以求得

  

x = [1,2,3,4,5,6,7,8,9,10]
y = [10,11.5,12,13,14.5,15.5,16.8,17.3,18,18.7]
X = np.vstack([np.ones(len(x)),x]).T
Y = np.array(y).T
W=np.dot(np.matrix(np.dot(X.T,X))**-1,np.dot(X.T,Y))
yi=np.dot(X,W.T)#這裡公式裡是不需要轉置的,但由於矩陣運算時W自動儲存成一行多列的矩陣,所以多轉置一下,配合原公式的計算。
print(X)
print(Y)
print(W)
print(yi)#擬合出的預測點
plt.plot(x,y,'o',label='data',markersize=10)
plt.plot(x,yi,'r',label='line')
plt.show()

 結果如下:

  X=

  [[ 1. 1.]

  [ 1. 2.]

  [ 1. 3.]

  [ 1. 4.]

  [ 1. 5.]

  [ 1. 6.]

  [ 1. 7.]

  [ 1. 8.]

  [ 1. 9.]

  [ 1. 10.]]

  Y=

  [ 10. 11.5 12. 13. 14.5 15.5 16.8 17.3 18. 18.7]

  W=

  [[ 9.30666667 0.98606061]]

  yi=

  [[ 10.29272727]

  [ 11.27878788]

  [ 12.26484848]

  [ 13.25090909]

  [ 14.2369697 ]

  [ 15.2230303 ]

  [ 16.20909091]

  [ 17.19515152]

  [ 18.18121212]

  [ 19.16727273]]

  

3、多元線性迴歸

  將一元線性迴歸及迴歸係數的計算公式推廣到多元線性迴歸也是一樣。
  損失函式可表示如下:

  

  對L求導有

  

  不防令

  

  則上式可化簡為

  

  

  

  

  

  記

  

  則

  

(1)當矩陣滿秩時(資料點的個數大於x的維度時)

  令導數為0的方程組有足夠的已知條件求解,令導數為0,則有

  

  而

  

  則有

  

  從而有

  

(2)當矩陣不滿秩時

  此時利用導數為0方程組個數不夠,不能夠全部解出引數,
可利用梯度下降法求近似最優解

  

  而梯度下降步長初始化可隨機設定,因而上式不防寫成

  

  最小二乘法多項式曲線擬合

  多項式曲線擬合與多元線性迴歸擬合不同點在於,多元線性迴歸自變數有多個,因變數是多個自變數的線性組合,其形式為

  

  而多項式擬合自變數還是一個,只不過因變數可以看作是自變數不同多項式的線性組合,其形式為

  

  但利用矩陣計算時,如果滿秩,兩者係數的表達方式是一樣的

  

  概念

  預設地認為因變數是自變數的多項式的線性組全,即有如下形式

  

  最小二乘法多項式曲線擬合,根據給定的m個點,並不要求這條曲線精確地經過這些點,而是擬合曲線上的資料點到原資料點的誤差平方和最小。即有

  

  迴歸係數求解

  求最值問題,如果直接求解那麼必然在可能的極值點獲得(此時沒有邊界限制)。對(1)式求偏導,如下

  

  
為便於理解,我們每次都只對w的一個維度求偏導,則有

  

  即

  

  即

  

  即

  

  寫成矩陣形式有

  

  將這個範德蒙得矩陣化簡後可得到:

  

  

  

  便得到了係數矩陣 A,同時,我們也就得到了擬合曲線。
其實我想說的是看到(2)中的矩陣等式,這個等式都不用推導的,因為函式的表示式就是這樣的代入,代入樣本後自然會有這樣的等式。
而(3)通過矩陣運算自然就能得到。

  用python程式碼編寫多項式迴歸程式碼,結果如下:

  

注:以上內容轉載自 http://dy.163.com/v2/article/detail/DQ00ILDU0538057A.html,寫得清晰明瞭,感謝博主分享!