1. 程式人生 > >吳恩達《機器學習》--- 線性迴歸

吳恩達《機器學習》--- 線性迴歸

吳恩達老師Coursera《Machien Learing》

機器學習的模型表達

這裡寫圖片描述

線性模型

h ( x ) = θ 0

+ θ 1 x 1

誤差函式

這裡寫圖片描述
線性迴歸的過程就是通過對訓練集資料的學習,選擇使得誤差函式最小化的 θ


這裡寫圖片描述
實現這一過程主要有兩種方法:梯度下降和Normal Equation

梯度下降

梯度下降的思想是選取導數的相反方向更新 θ ,如圖所示:
這裡寫圖片描述
注意引數更新的時機:
這裡寫圖片描述
α

的選取決定了誤差函式收斂的速度,決定了學習的時間。
這裡寫圖片描述
選擇 α 嘗試如下方法:
這裡寫圖片描述
計算中誤差函式的導數是這樣的:
這裡寫圖片描述
實際應用中可以通過對特徵值進行Feature Scaling和Mean Normalization來加速梯度下降其原理示意圖如下:
這裡寫圖片描述
其方法是 x i = x i m e a n ( x ) m a x ( x ) m i n ( x )

Normal Equation

這是第二種優化誤差函式的方法,直接令誤差函式對 θ 0 導數等於0,進而可以求得 θ 表示式:
θ = ( X T X ) 1 X T y
與梯度下降法相比,Normarl Equation無需選擇 α ,無需多次迭代,但是計算 ( X T X ) 1 O ( n 3 ) 計算量較大,因而更適於特徵規模較小的情況,通常10000以下可以考慮。

上述討論了線性迴歸的模型、誤差函式、引數訓練方法,訓練方法中還討論了梯度下降法和Normal Equation兩種方法,以及訓練過程中需要注意的問題,想要探究內部機理的同學可以仔細研究。然而使用scikit-learn實現線性迴歸,根本無需考慮這麼多問題,請看下文。

scikit-learn實現

最小二乘法

線性模型,最小化方差,求解時採用梯度下降法。
sklearn線性迴歸非常簡單,如下所示:

>>> from sklearn import linear_model
>>> reg = linear_model.LinearRegression()
>>> reg.fit ([[0, 0], [1, 1], [2, 2]], [0, 1, 2])
LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False)
>>> reg.coef_
array([ 0.5,  0.5])

Ridge迴歸

線性模型的一種優化,主要是為了降低資料敏感性,通過減小||w||實現,在優化目標上新增2範數 α ||w||2

>>> from sklearn import linear_model
>>> reg = linear_model.Ridge (alpha = .5)
>>> reg.fit ([[0, 0], [0, 0], [1, 1]], [0, .1, 1]) 
Ridge(alpha=0.5, copy_X=True, fit_intercept=True, max_iter=None,
      normalize=False, random_state=None, solver='auto', tol=0.001)
>>> reg.coef_
array([ 0.34545455,  0.34545455])
>>> reg.intercept_ 
0.13636...

sklearn提供RidgeCV通過交叉驗證的方式選擇最好的 α

>>> from sklearn import linear_model
>>> reg = linear_model.RidgeCV(alphas=[0.1, 1.0, 10.0])
>>> reg.fit([[0, 0], [0, 0], [1, 1]], [0, .1, 1])       
RidgeCV(alphas=[0.1, 1.0, 10.0], cv=None, fit_intercept=True, scoring=None,
    normalize=False)
>>> reg.alpha_                                      
0.1

Lasso迴歸

目的與上述的Ridge迴歸一樣,只是優化目標是方差+|w|,新增的是1範數

>>> from sklearn import linear_model
>>> reg = linear_model.Lasso(alpha = 0.1)
>>> reg.fit([[0, 0], [1, 1]], [0, 1])
Lasso(alpha=0.1, copy_X=True, fit_intercept=True, max_iter=1000,
   normalize=False, positive=False, precompute=False, random_state=None,
   selection='cyclic', tol=0.0001, warm_start=False)
>>> reg.predict([[1, 1]])
array([ 0.8])

sklearn中有Lasso的多種交叉驗證方法。

Elastic Net

優化目標新增既有1範數又有2範數

歡迎關注微信公眾號“翰墨知道”,獲取最新更新。
這裡寫圖片描述