新宇教你機器學習之 Linear Regression (Least Square Regression)
http://blog.sina.com.cn/s/blog_a18c98e50101108a.html
部分資料和內容摘自斯坦福大學Andrew Ng教授的Machine Learning Online Class。
監督學習(supervised learning)通常有下列步驟:
首先通過某種學習演算法訓練已有的資料,得到function h。H叫做hypothesis。給定x值,它可以預測對應的y值。舉個例子,x可以是住房的面積,y是房子的價格。當你給h輸入任意一個面積值,他就可以預測出這個房子價值多少錢。
當輸出Y的值是連續性的時候,這個問題叫做regression。
當輸出Y的值是離散性的時候,這個問題叫做
上面的例子大致符合線性的關係(房子價格大致和麵積成線性關係)。
Linear Regression就是一種可以解決如上問題的監督學習演算法。
假設有如下資料,x軸是房子面積,y軸是房子價格。假設我們用Least square的方法,實際上就是求一條直線,它可以讓每個點資料到直線距離的平方的和最小。
如果是上面的例子,x 是一維的(房子面積),那麼H可以寫成:
如果房子價格不僅僅依據房子面積,同時也依據房子的房間數,那麼H可以被寫成:
如果假設x0等於 1,那麼這個式子就可以寫成:
H(x)是預測的值,y是真實的值,我們就是要找到一個
寫成公式的話,Cost Function可以定義成:
我們的目標就是計算出一個Ө值,使J最小。
下列方法可以解決這個問題:
Gradient Descent:
這個演算法理解起來很簡單,首先初始化一個Ө值。之後望向四面八方,看那條路可以接近正確的值就向那個方向邁一步。更新Ө值,再重複上面過程,直到J的值不怎麼變化為止。數學表達為:
當然上述演算法有可能得到的只是local minimum。所以重複幾次上面的過程,用不同的初始值,如果得到相同的結果,那麼就可以認為當前的Ө值可以讓J最小。
Stochastic Gradient Descent (Incremental gradient descent)
前面的方法,需要處理完所有的訓練資料之後才會每次更新一次Ө,如果訓練資料很多的話,就會變得很慢。Stochastic Gradient Descent每處理完一個訓練資料,就會立即更新Ө。在某種程度上,這可以提高程式的效率。
The Normal Equation
這種方法不需要經過任何迴圈,也不需要假設初始值。雖然推導本身有點複雜,但是結果一步到位,簡單又效率。非常牛逼的方法啊。
我剛看完這個推導之後,不得不佩服那些數學家,居然可以如此簡單的算出上述需要迴圈才能得到的複雜的結果。唉,感嘆一下數學之美。
準備工作:
定義function f(A):Mapping from M-by-n matrices to the real numbers。
定義f(A)的微分為:
定義trace operator。對於一個n by n的matrix A, the trace of A is:
Trace有如下特性:
如果a是一個real number, 那麼tr a = a
矩陣微分有如下特性:
開始推導:
首先,設計一個m行n列的(實際上是n+1列,應為我們假設x0 =1 )矩陣X,他的每一行都是一個training sample,每列都是一個特徵。
設計y成為一個m列的目標值(輸出值)向量,也就是房子的價格在我們例子中。
因為:
所以:
因為對於一個向量z來說:
所以:最後我們用之前提到的矩陣微分特性的第二和第三條:
所以:
因為我們要讓J最小,所以J的微分必須等於0。
所以:
這就是最後的結果了。非常簡單明瞭也很容易實現出來。
需要注意的是,當你實現的時候,記得把資料X最右邊加上全部是“1”的一列,因為我們前面的時候假設
X0 = 1。
下圖是Matlab的結果:
"x"是原始資料,藍線是用Matlab的polyfit()方法算出來的linear regression。紅圈就是用normal method計算出來的預測值,可以看到他們全部都完美的對齊在藍線上。
不記得在哪裡看到的了,有人說,當資料量過大的時候normal equation method會變得不穩定。QR Factorization是一種更好的方法。我還沒研究過,以後懂了再更新吧。