1. 程式人生 > >線性迴歸 (Linear Regression)

線性迴歸 (Linear Regression)

1.基本問題

線性迴歸屬於有監督的演算法,用來做迴歸預測。在實際的有監督迴歸問題中,我們通過擬合係數 的線性模型,以最小化資料集中觀察到的響應y與線性近似預測的響應之間的殘差平方和。我們的目標便是選擇出可以使得殘差平方和最小的模型引數,即得到代價函式

表達方式:

(1)單變數線性迴歸(因為只含有一個特徵/輸入變數)

其中,是此線性模型的引數,x是輸入變數,m是樣本個數,y是真實值。

(2)多變數線性迴歸(含有n個特徵/輸入變數)

這個公式中有n+1個引數和n個變數,為了使公式能夠簡化一些,引入一個變數,則公式轉化為:

此時模型中的引數是一個n+1維的向量,將公式簡化如下:

其中,

 ,

2.公式推導(求解代價函式

(1)梯度下降

梯度下降背後的思想是:開始時我們隨機選擇一個引數的組合,計算代價函式,然後我們尋找下一個能讓代價函式值下降最多的引數組合。我們持續這麼做直到得到一個區域性最小值(local minimum),因為我們並沒有嘗試完所有的引數組合,所以不能確定我們得到的區域性最小值是否便是全域性最小值(global minimum),選擇不同的初始引數組合,可能會找到不同的區域性最小值。

批量梯度下降(batch gradient descent)演算法的公式為:

其中是學習率,它決定了我們沿著能讓代價函式下降程度最大的方向向下邁出的步子有多大,在批量梯度下降中,我們每一次都同時讓所有的引數減去學習速率乘以代價函式的導數。

梯度下降中,我們要更新

求導過程(單變數):

演算法為:{

求導過程(多變數):

”批量梯度下降”,指的是在梯度下降的每一步中,我們都用到了所有的訓練樣本,在梯度下降中,在計算微分求導項時,我們需要進行求和運算,所以,在每一個單獨的梯度下降中,我們最終都要計算這樣一個東西,這個項需要對所有m個訓練樣本求和。

由上面的單變數求導過程我們可以得到多變數的求導結果:

同時,我們也可以類似於簡化多變數模型一樣來對此公式向量化。

其中,

(2)正規方程:

對於某些線性迴歸問題,正規方程方法是更好的解決方案,個人覺得在寫程式碼的時候用著也方便。正規方程是通過求解方程:

來找出使得代價函式最小的引數的。解得 :   

正規方程求解過程(以多變數為例):

帶入得到(即向量表示式轉化為矩陣表示式):  

其中mn列的矩陣(m為樣本個數,n為特徵個數),ym行1列的矩陣,n行1列的矩陣,對J進行如下變換

θ求偏導,其中用到兩個公式,因此:

  令可得:  

3.程式碼部分:

在sklearn中可以直接呼叫,下面是一個簡單的例子。

from sklearn import datasetsfrom sklearn.linear_model import LinearRegressionfrom sklearn.metrics import mean_squared_error, r2_score

diabetes = datasets.load_diabetes()

diabetes_X = diabetes.data diabetes_X_train = diabetes_X[:-20] diabetes_X_test = diabetes_X[-20:] diabetes_y_train = diabetes.target[:-20] diabetes_y_test = diabetes.target[-20:] regr = LinearRegression()    # Create linear regression objectregr.fit(diabetes_X_train, diabetes_y_train)    # Train the model using the training setsdiabetes_y_pred = regr.predict(diabetes_X_test)  # Make predictions using the testing setprint('Coefficients: \n', regr.coef_)   # The coefficients

# The mean squared errorprint("Mean squared error: %.2f"  % mean_squared_error(diabetes_y_test, diabetes_y_pred)) # Explained variance score: 1 is perfect predictionprint('Variance score: %.2f' % r2_score(diabetes_y_test, diabetes_y_pred))

4.參考

(2)Coursera-ML-AndrewNg-Notes-master