Linear Regression總結


轉自:http://blog.csdn.net/dongtingzhizi/article/details/16884215

 

Linear Regression總結

 

作者:洞庭之子

微博:洞庭之子-Bing

(2013年11月)

 

關於linear regression,Andrew Ng老師的課程中介紹了兩種方法:gradient descent(梯度下降法)和normal equation,《機器學習實戰》中直接使用的normal equation及其改進方法,本文記錄對着兩種方法的學習筆記。

 

第一部分,Gradient Descent方法

 

上一篇博客總結的是logistic regression(http://blog.csdn.net/dongtingzhizi/article/details/15962797),這一篇反過來總結linear regression,實際上這篇應該寫在前面的。由於在上一篇中對regression問題的步驟、遞歸下降方法、向量化(vectorization)等都做了很詳細的說明,在這一篇中將不再重復,需要的話可以回過頭去看上一篇。

上一篇中介紹的regression問題的常規步驟為:1,尋找h函數(即hypothesis);2,構造J函數(損失函數);3,想辦法是的J函數最小並求得回歸參數(θ),下面一次看看這些步驟。

(一)h函數

每個訓練樣本有n個特征,例如Andrew Ng老師的課程中給的房價預測的例子,影響房價的因素有n個,如下圖:

一般表示格式按如下約定,第i條樣本的輸入x(i):

所有訓練樣本的輸入表示為x,輸出表示為y:

θ就是我們要求的回歸參數,因為是線性回歸,所以為沒個特征x(i)添加一個參數θ(i),所以h函數的形式如下:

為了公式表示方便,將x0設定為1,同時將所有θ表示成向量:

則有:

.

 

(二)J函數

linear regression中一般將J函數取成如下形式:

 

至於為什么取成該式,這里不進行深入的分析和推導,網上有一篇文章《Standford機器學習+線性回歸CostFunction和Normal+equation的推導》進行了推導,可供參考。

 

(三)gradient descent

用梯度下降法求J(θ)的最小值,梯度下降法就是如下的過程(α表示學習率):

 

 

對於上面給出的J(θ),有:

所以θ的迭代公式為:

(四)其他問題

1. Feature scaling

Feature scaling可以通俗的解釋為:將不同特征的取值轉換到差不多的范圍內。因為不同特征的取值有可能有很大的差別(幾個數量級),例如下圖中的x1和x2差別就非常大。這樣會帶來什么后果呢?從左圖中可以看出,θ1-θ2的圖形會是非常狹長的橢圓形,這樣非常不利於梯度下降(θ1方向會非常“敏感”,或者說來回“震盪”)。進行scaling處理后,不同特征的規模相似,因此右圖中的θ1-θ2圖形會近似為圓形,這樣更加適合梯度下降算法。
scaling也有不同的方法:
(1)例如上圖中就是用特征值除以該組特征的最大值;
(2)下圖中的mean normalization方法(姑且稱為“均值歸一化”),即用特征值先減去該組特征的平均值,然后再除以該組特征的最大值;
(3)上面兩種方法顯然還不是最合理的,下圖的底部給出的公式x(i) = (x(i) - u(i)) / s(i),x(i)表示x的第i組特征(例如房屋面積,或者卧室數目等),u(i)表示第i組特征的均值,s(i)表示第i組特征的范圍(最大值減最小值)或者標准差。
使用(3)中標准差的方法對前面的訓練樣本x矩陣進行歸一化的代碼如下:

2. vectorization

vectorization是盡量多的使用矩陣計算盡量少的使用for循環,以簡化計算過程,提高效率。vectorization的推導在上一篇logistic regression( http://blog.csdn.net/dongtingzhizi/article/details/15962797)中有詳細的介紹,這里不再重復,結論是:對於前面約定的x,y和θ矩陣的格式,vectorization后的更新過程如下:
這樣,不需要for循環,使用矩陣計算可以一次更新θ矩陣。

3. 關於學習率α

α的選取對於梯度下降法是非常關鍵的,選取合適的話J(θ)能順利下降並最終收斂,如果選取不合適的話J(θ)可能下降非常緩慢,也有可能最終發散。
下圖是J(θ)隨迭代過程順利下降的情況,圖中還提到:可以聲明當一次迭代后J(θ)減小的幅度小於某個閾值(如10e-10)時認為已經收斂,此時可以停止迭代過程。
下圖是遞歸下降失敗的情況,J(θ)未能隨每次迭代順利下降,說明α太大,當α充分小時,每一步迭代J(θ)都會下降的。所以,此時可以嘗試減小α。
但是,當α過於小時,J(θ)會下降的非常緩慢,因此需要迭代更多次數才能達到效果,浪費計算資源。所以要選擇合適的α值,太大太小都不合適。一般在訓練樣本時,多次嘗試不同的α值,對比結果(可以繪制出J(θ)迭代的圖形)后進行選擇。Andrew Ng老師在課程中也給出了α嘗試的方法:先選擇一個較小的α值,收斂太慢的話以3倍來增加α值。
 

第二部分,Normal equation方法

 
因為gradient descent方法需要迭代很多次是的J(θ)達到最小值求得θ,自然而然的會有一種疑問:能不能不迭代,一次求得所需的θ呢?答案是肯定的,normal equation就是這樣一種方法。關於normal equation,Andrew ng老師的課程中介紹的非常簡單,幾乎是直接給出了下面的公式。《機器學習實戰》中也沒有講具體的推導,也是給出了該公式(P138頁)。但是,二者都提到一個基本的數學原理,那就是當J(θ)對所有θj的偏導等於0時,J(θ)取最小值(高等數學中有當導數等於0時函數達到極值)。
《機器學習實戰》中(P138頁)提到對矩陣(y-Xw)T(y-Xw)求導,得到XT(y-Xw),令其等於零可以解得上面的公式,這里我真心沒有明白,求高手解釋。
文章( http://www.cnblogs.com/elaron/archive/2013/05/20/3088894.html)中給出了一個推導過程,並沒有提到求導並令導數等於零的原理,直接解出上面的公式,看着推導過程貌似合理,但總覺得不對,求高手解釋。
網上的一篇文章《Standford機器學習+線性回歸CostFunction和Normal+equation的推導》給出了推導過程,應該是靠譜的。
此時,真心覺得自己的線性代數太弱爆了,急需惡補啊!(等補補線性代數再回過頭來看看吧)
正如Andrew ng老師所說,不管對該公式的推導過程理不理解,並不妨礙使用該公式進行Linear Regression處理。

(1)關於non-invertibility

當|XTX|=0時XTX是不可求逆矩陣的,如何使用normal equation呢?下面是Andrew ng老師的課程中給出的:
兩種可能的解決方法:1.如果存在冗余的特征(冗余特征間存在線性依賴),去掉冗余特征;2.特征數量太大(m<=n,即樣本數小於特征數),應該去掉一些特征或者使用regularization。regularization是一種消除overfitting的方法,Andrew ng老師的課程中有詳細的介紹,使用了regularization的normal equation方法就不存在non-invertibility的問題了,貌似就是《機器學習實戰》中介紹的局部加權線性規划方法。
《機器學習實戰》中甚至介紹了更多的normal equation改進方法:局部加權線性規划,嶺回歸,lasso,前向逐步回歸。 功力不夠,還沒能好好理解,得繼續努力啊!
 
 

總結

對比一下上面兩種方法,下圖是Andrew ng老師的課程中給出的:
總結一下二者的優缺點:
(1)gradient descent需要選擇一個合適的學習率α,前面講到過,要尋找一個合適的α的過程時比較繁瑣的(繪制J(θ)的收斂趨勢圖進行對比);
(2)gradient descent需要迭代很多次,而normal equation只需一次計算;
(3)當n(特征數)非常大時,gradient descent沒有問題,但是normal equation的效率會非常低。解釋一下:normal equation方法使用的是矩陣計算,上面公式中的(XTX)-1是計算一個(n*n)矩陣的逆,時間復雜度是O(n3),所以當n非常大時,效率會非常低。Andrew ng老師說到,當n多大時使用gradient descent多大時使用normal equation,沒有一個明確的分界線。當n較小時一般使用normal equation比較快捷方便,一般當 n達到1000,000時,應該開始考慮gradient descent;
(4)我覺得還有一點也是比較突出的差別吧,gradient descent需要進行Feature scaling處理,而normal equation不用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM