[斯坦福大學2014機器學習教程筆記]第四章-正規方程
- 2020 年 4 月 2 日
- 筆記
到目前為止,我們一直在使用梯度下降法來求解(通過一步步迭代來收斂到全局最小值)。相反地,正規方程提供的一種求解θ的解法。所以我們不再需要運行迭代演算法,而是可以直接一次性求解θ的最優值。
事實上,正規方程也有優點,也有一些缺點。但在講它的優缺點和如何使用正規方程之前,讓我們先對這個演算法有一個直觀的理解。下面我們來看一個例子。
我們假設有一個非常簡單的代價函數J(θ)。它就是一個實數θ的函數。所以現在假設θ只是一個標量,或者只是一個實數值,而函數是θ的二次函數。所以它的影像如下所示。
那麼,怎麼最小化一個二次函數呢?我們知道,我們可以對函數進行求導並讓導數值為0。這樣,我們就會求得使J(θ)最小的θ值。這是θ為實數的一個簡單的例子。但是,我們通常碰到的問題中,θ不是一個實數,而是一個n+1維的參數向量,代價函數J是這個向量的函數,也就是θ0,θ1,θ2,……θn的函數。(J(θ0,θ1,……θn)=(1/2m)Σ(hθ(xi)-yi)2) [Q1:這裡是m還是n呢?首先,我們要搞清楚n和m代表什麼。n表示特徵量的數目,m表示樣本的數量。]
我們要如何最小化這個代價函數?
事實上,微積分告訴我們有一個方法能做到:就是逐個對參數θj求J的偏導數,然後把它們全部置零。如果我們這樣做,並且求出θ0,θ1,……θn的值。這樣就能得到最小化代價函數J的值。如果你真的做完微積分,並求出θ0,θ1,……θn的值,這個偏微分最終可能很複雜。
下面讓我們來看一個例子。假如現在有m=4個訓練樣本。
為了實現正規方程法,我們要做的就是在數據集中再加上一列,對應額外特徵變數的x0,它的取值永遠是1。接下來我們要做的,就是構建一個矩陣X。這個矩陣包括了所有訓練樣本的所有特徵變數。我們要對y值進行類似的操作。我們取我們想要預測的值,然後構建一個向量y。所有,X是一個m*(n+1)的矩陣,y是一個m維向量。最後,我們用矩陣X和向量y計算θ值。設θ=(XTX)-1XTy,這樣我們就能得到使代價函數最小化的θ。
在一般情況下,假設現在有m個訓練樣本,從(x(1),y(1))一直到(x(m),y(m))和n個特徵變數。所有每個訓練樣本x(i)可能是一個如下所示的向量(一個n+1維特徵向量)。我們接下來構建矩陣的方法也被稱為設計矩陣。每個訓練樣本都給出一個像下圖左側一樣的特徵向量,我們要做的就是取第一個向量的轉置,然後讓第一個向量的轉置稱為設計矩陣X的第一行。同理,一直取到第m個向量的轉置。
舉個具體的例子,假如我們除了x0之外只有一個特徵變數,那麼我們的設計矩陣X如下圖所示。
我們就能得到一個m*2維矩陣。這就是如何構建矩陣X。而向量y就是把所有結果放在一起得到一個m維向量。
最後構建好設計矩陣X和向量y之後,我們就可以計算θ=(XTX)-1XTy。
下面我們就來講一下θ=(XTX)-1XTy這個式子。
- 什麼是(XTX)-1?
(XTX)-1是XTX的逆矩陣。具體的說,如果令A=XTX(XT是一個矩陣,XTX也是一個矩陣),那麼(XTX)-1就是矩陣A的逆(A-1)。先計算XTX,再計算它的逆。
- 在Octave中,計算這個量的命令為:pinv(X’ *X) *X’ *y。在Octave中X’用來表示X的轉置。(X’ *X)計算的是XTX;pinv是計算逆的函數,pinv(X’ *X)計算的是XTX的逆;然後再乘XT,再乘y。
- 根據數學知識,其實我們可以證出θ=(XTX)-1XTy這個式子算出的θ值,可以最小化線性回歸的代價函數J(θ)。
還記得我們之前講過的特徵縮放嗎?事實上,如果我們使用正規方程,我們就不需要特徵縮放。如果你使用正規方程,即使你的特徵量的取值如0≤x1≤1,0≤x2≤1000,0≤x3≤0.00001,也沒有關係。但是,如果使用的是梯度下降法,特徵縮放就非常重要了。
- 我們什麼時候使用梯度下降法,什麼時候使用正規方程法呢?下面我們講一下關於它們的優缺點。
假如我們有m個訓練樣本,n個特徵變數。
梯度下降法 | 正規方程法 |
缺點: 1.需要選擇學習速率α。這通常表示要運行很多次來嘗試不同的學習速率α。 2.需要更多次的迭代(取決於具體細節,計算可能會很慢)。 |
缺點: 正規方程法為了求解參數θ需要求解 (XTX)-1,而 XTX是一個n*n的矩陣,對於大多數計算應用來說,實現逆矩陣的計算代價以矩陣維度的三次方增長(O(n3))。因此,如果特徵變數n的數目很大的話,計算這個逆矩陣的代價是非常大的。此時計算速度也會非常慢。 |
優點: 1.梯度下降法在特徵變數很多的情況下,也能運行地很好,即使有上百萬個特徵變數。 |
優點: 1.不需要現在學習速率α,所有這就會很方便。 2.也不需要迭代,所以不需要畫出J(θ)的曲線來檢查收斂性,或者採取任何的額外步驟。 |
所以,如果n很大的話,使用梯度下降演算法會比較好。如果n比較小的話,正規方程法可能會好一點。那麼,什麼算大什麼算小呢?
如果n是上萬的,那麼這個時候應用正規方程法的求解速度會開始變得有點慢,此時可能梯度下降法會好點(但是也不是絕對的)。如果n遠大於此,那麼這個時候使用梯度下降法會好點。