目錄
什么是線性回歸
最小二乘法
一元線性回歸
多元線性回歸
什么是規范化
Python代碼(sklearn庫)
什么是線性回歸(Linear regression) |
引例
假設某地區租房價格只與房屋面積有關,我們現有數據集,請用一條直線盡量去擬合所給的數據,從而達到預測房屋價格的效果。
在引例中,面積是自變量,租金是因變量。使用直線去擬合訓練集的數據,可得到面積-租金的函數:,即線性回歸模型。利用此模型,輸入面積后,便可預測出對應的租金。
百度百科定義
線性回歸是利用數理統計中回歸分析,來確定兩種或兩種以上變量間相互依賴的定量關系的一種統計分析方法,運用十分廣泛。回歸分析中,只包括一個自變量和一個因變量,且二者的關系可用一條直線近似表示,這種回歸分析稱為一元線性回歸分析。如果回歸分析中包括兩個或兩個以上的自變量,且因變量和自變量之間是線性關系,則稱為多元線性回歸分析。
最小二乘法(Least square method) |
均方誤差有很好的幾何意義,它對應了常用的歐幾里得距離,簡稱“歐氏距離”(Euclidean distance)。基於均方誤差最小化來進行模型求解的方法稱為“最小二乘法”。
結合引例中的數據解釋最小二乘法的應用:
第一步:
將訓練集數據放入坐標平面。
第二步:
假設一元線性回歸模型為,並繪制在坐標軸上。由於
和
是未知的,因此這里隨意畫一條。
第三步:
求每一個訓練集中的數據到直線的歐氏距離。圖中的紅線長度並非點到直線的歐氏距離,做這種替代的優點是簡化計算,又不影響最終求解結果。均方誤差便可以用紅線長度的累加表示。
第四步:
讓均方誤差最小化,便可求出最優的和
,即
求解過程是使(也稱損失函數或代價函數)最小化的過程,稱為線性回歸模型的最小二乘“參數估計”(parameter estimation)。可以證明
是凸函數(有最小值)。我們可以將
分別對
和
求導,得到
令(式1)和(式2)為0,聯立求解二元一次方程組,可以得到和
最優解的閉式解:
其中為x的均值。
第五步:
將和
代入假設一元線性回歸模型,得到
,即
,這就是最終的一元線性回歸模型。
至此,完成了最小二乘法的應用的講解。
注意:“最小二乘法”不要與“梯度下降法”並列看待。“最小二乘法”是基於均方誤差最小化來進行模型求解的方法,即用均方誤差衡量模型的好壞程度,然后可以用“梯度下降法”讓均方誤差降到最低從而求解和
,也可以像上文所述的求解析解的方法,即求導,令為0,解方程組,從而求解
和
。
一元線性回歸(Simple linear regression) |
引例其實就是典型的一元線性回歸模型的求解問題,即只包括一個自變量和一個因變量,且二者的關系可用一條直線近似表示。由於一元線性回歸模型只能考慮一個自變量的影響因素,看起來顯得有點無力,不過之前所述是通向復雜模型的必經之路,其中的思想是相通的。只要能理解,想必在多元線性回歸,乃至下一章的廣義線性回歸(logistic回歸)的學習中也能游刃有余。
多元線性回歸(Multivariate linear regression) |
引例
假設某地區租房價格不僅與房屋面積有關,還與房間數、距離地鐵站距離等等相關,比如有d種影響因素,那么訓練數據集形式將由一元的
變為
簡記為
相應的將簡記為
,為了便於討論,我們把
和
吸收入向量形式
,相應的,把數據集D表示為一個m×(d+1)大小的矩陣X,其中每一行對應於一個示例,該行前d個元素對應於示例的d個屬性值,最后一個元素恆置為常數1,目的是:點乘的時候讓常數1與
中的
相乘,從而保留一個待求解的截距項,即
再把標記也寫成向量形式。使用最小二乘法,通過均方誤差最小化求解最優的
,即
求解方法:
一、利用凸函數性質,可以使用梯度下降法(大數據下通常使用這個方法)求一個粗略的解。梯度下降法(Gradient descent)是求解無約束最優化問題的一種常用的方法,有實現簡單的優點。梯度下降法是迭代算法,每一步需要求解目標函數的梯度向量,然后一步一步迭代運算,使得均方誤差達到近似的最低。
二、利用凸函數性質,使用求解析解的方式,即求對
的導數,
,令為0,求解方程組,可得到最優解的閉式解(求解中有一步求矩陣逆的運算,復雜度很高,大數據量時不推薦使用)
注意:當遇到的任務含有大量變量,其數目甚至超過樣例數目時,導致X的列數多於行數,此時可以解出多個,它們都能使均方誤差最小化。常見的做法是引入正則化(Regularization)項。關於正則化的知識未來會在【黎明傳數==>機器學習速成寶典】工程篇中講到,敬請期待......
什么是規范化(Normalization) |
“規范化”是將不同變化范圍的值映射到相同的固定范圍中,常見的是[0,1],此時也稱“歸一化”。
好處是:
(1)在使用梯度下降法這種迭代最優化求解方法時,能提升模型的收斂速度,原理簡單形容就是:沒有規范化時,相當於要從一個橢圓邊緣走到橢圓中心;規范化后,相當於從一個圓的邊緣走向圓的中心。規范化會減少迭代計算的步數。
(2)提升模型的精度
Python代碼(sklearn庫) |
# -*- coding: utf-8 -*- from sklearn import linear_model reg = linear_model.LinearRegression(fit_intercept=True,normalize=True,copy_X=True,n_jobs=-1) ''' @param fit_intercept: 是否需要計算截距值b @param normalize: 是否將訓練樣本歸一化,歸一化可以提升模型的收斂速度,提升模型精度 @param copy_X: 真,X會被復制一份;假,X會被覆蓋掉 @param n_jobs: 任務並行時指定使用的CPU數,-1表示使用所有可用的CPU @attribute coef_: 權重向量 @attribute intercept_: 截距b @method fit(X,y[,sample_weight]): 訓練模型 @method predict(X): 預測 @method score(X,y[,sample_weight]): 計算在(X,y)上的預測的准確率 ''' #一元線性回歸 trainX = [[10], [25], [20]] trainY = [1200, 3600, 2350] reg.fit (trainX, trainY) print "權值:"+str(reg.coef_) print "截距:"+str(reg.intercept_) #多元線性回歸 trainX = [[10,600], [25,800], [20,500]] trainY = [1200, 3600, 2350] reg.fit (trainX, trainY) print "權值:"+str(reg.coef_) print "截距:"+str(reg.intercept_) '''運行結果 權值:[ 153.57142857] 截距:-432.142857143 權值:[ 134.28571429 1.92857143] 截距:-1300.0 '''