Stanford-Andrew Ng《Machine Learning》week2

多變量線性迴歸 (Linear Regression with Multiple Variables)

1.1 多維特徵 (Multiple Features)

在之前我們研究過的線性迴歸中,我們只有一個單一特徵量,房屋面積x,我們希望用這個特徵量來預測y,房屋的價格。

 

 

現在假設我們不僅有房屋面積作爲預測房屋價格的一個特徵或者變量,我們還知道臥室的數量,樓層的數量,以及房屋的年齡。這構成了一個含有多個變量的模型,模型中的特徵爲(x1,x2,...,xn)。仍然用y來表示我們想要預測的輸出變量。

 

現在引入更多的表示方式:

n:表示特徵量的數目。因此在這個例子中,n等於4。

x(i):表示第i個訓練樣本的輸入特徵值,是特徵矩陣中的第i行,是一個向量(vector)。例如x(2)表示第二個訓練樣本的特徵向量。

 

x^(i)_ j,(i是上標,j是下標)代表第i個訓練樣本中第j個特徵量的值,比如在上圖中x^(2)_3爲2。

在單變量線性迴歸中,假設函數是hθ(x) = θ0 + θ1∗x。x是我們唯一的特徵量。但現在我們有了多個特徵量,我們就不能再使用這種簡單的表示方式了。

取而代之的,現在的線性迴歸假設應該改爲 hθ(x) = θ0 + θ1*x1 + θ2*x2 +⋯ + θn*xn = (θ^T)*x。

爲了讓表示更方便,將x0的值設爲1。具體而言,這意味着對於第i個樣本,都有一個向量x^(i)_0=1。你可以認爲我們定義了一個額外的第0個特徵量。過去有n個特徵量,x1,x2......xn,由於又另外定義了額外的第0個特徵量(並且這個特徵量的取值總爲1),所以現在的特徵向量x是一個從0開始標記的n+1維的向量。同時也可以把所有的參數都看做一個向量,所以參數就是θ0,θ1,θ2......θn。將θ和x的所有參數寫成如下的向量形式,再由向量內積的原理就可以將假設函數寫成如下形式。這就爲我們提供了一個便利的方式來表示假設。其中上標T代表矩陣的轉置。

 

 

1.2 多變量梯度下降(Gradient Descent for Multiple Variables)

與單變量線性迴歸類似,在多變量線性迴歸中,我們也構建一個代價函數,則這個代價函數是所有建模誤差的平方和,即

我們的目標和單變量線性迴歸問題中一樣,要找出使得代價函數最小的一系列參數。

多變量線性迴歸的批量梯度下降算法爲:

我們要通過θj - α*導數項來不斷更新每個θj參數。

1.3 特徵縮放(Feature Scaling)

如果你有一個機器學習問題,這個問題有多個特徵,如果你能確保這些特徵都處在一個相近的範圍,這樣就能讓梯度下降法更快地收斂。具體地說,如果你有一個具有兩個特徵的問題,其中x1是房屋面積大小,它的取值在0~2000之間。x2是臥室的數量,取值在1~5之間。如果畫出代價函數J(θ)的等值線,假設J(θ)是一個關於參數θ0,θ1和θ2的函數,但是這裏暫時先不考慮θ0,假設這個函數的變量只有θ1和θ2。但如果x1的取值範圍遠遠大於x2的取值範圍的話,那麼最終畫出來的代價函數J(θ)的等值線就會呈現出一種非常歪斜並且橢圓的形狀。如果在這種代價函數上運行梯度下降的話,最終可能需要花很長一段時間,並且可能會來回波動,然後會經過很長時間,最終纔會收斂到全局最小值。

在這種情況下一種有效的解決方法是進行特徵縮放。具體來說,把特徵x1定義爲房子的面積大小除以2000。並且把x2定義爲臥室的數量除以5,那麼代價函數J(θ)的等值線就會變得偏移沒那麼嚴重,看起來就更圓一些了,如果在這樣的代價函數上來執行梯度下降的話,那麼梯度下降算法就會找到一條更直接的路徑通向全局最小,而不是曲折地沿着一條複雜得多的路徑通向全局最小值。因此通過特徵縮放來使x1和x2的值的範圍變得相近。在這個例子中,我們最終使兩個特徵x1和x2都在0和1之間。這樣得到的梯度下降算法就會更快地收斂。

更一般地來說,我們執行特徵縮放時,我們通常的目的是將特徵的取值約束到-1到1的範圍內。具體來說,特徵x0是總是等於1的,因此這已經是在這個範圍內了。但對於其他的特徵,可能需要通過除以不同的數來讓它們處於同一範圍內,-1和1這兩個數字並不是太重要。所以,如果你有一個特徵x1,它的取值在0和3之間,這是沒問題的。如果你有另外一個特徵取值在-2到0.5之間,這也非常接近-1到1的範圍,這也是可以的。但如果你有另外一個特徵比如x3,假如它的範圍在-100到100之間,那麼這個範圍就和-1到1相差太大了,所以這可能是一個不太合適的特徵。類似地,如果你的特徵在一個非常非常小的範圍內,比如另一個特徵x4的範圍在-0.0001到0.0001之間,那麼這是一個比-1到1小得多的範圍,因此這個特徵的範圍也不太合適。所以可能你認可的範圍也許可以大於1,或者小於1,但是也別太大,比如100,或者也別太小,比如0.0001。因此總的來說,不用過於擔心你的特徵是否在完全相同的範圍或區間內,但是隻要它們足夠接近的話,梯度下降法就會正常地工作。

除了將特徵除以最大值以外,在特徵縮放中,有時候我們也會進行一個稱爲均值歸一化的工作。如果你有一個xi,就可以用xi-μi來替換,讓你的特徵值具有爲0的平均值。很明顯不用將這一步應用到x0中,因爲x0總是等於1,所以它不可能有爲0的平均值。但對其他的特徵來說,比如房子的大小,取值介於0到2000,並且假設房子面積的平均值是1000,那麼就可以用(size-1000)/2000作爲x1的值。類似地,如果這些房子有1到5間臥室,並且平均一套房子有兩間臥室,那麼就可以用(bedrooms-2)/5來均值歸一化第二個特徵x2。這樣x1和x2的範圍就會在大體在-0.5~0.5(實際上是-0.5~0.6),當然x2的值可以略大於0.5,但很接近。更一般的規律是可以把x1替換爲(x1-μ1)/s1,其中定義μ1是訓練集中特徵x1的平均值,而s1是該特徵值的範圍,也可以把s1設爲變量的標準差。(在下圖中,或許s2應該等於5-1=4而不是5),但特徵縮放其實並不需要太精確,只是爲了讓梯度下降能夠運行得更快一點而已。

通過使用特徵縮放這個簡單的方法,可以將梯度下降的速度變得更快,收斂所需的迭代次數更少。

 

1.4 學習率(Learning Rate)

對於每一個特定的問題,梯度下降算法所需的迭代次數可能會相差很大。實際上,我們很難提前判斷梯度下降算法需要多少步迭代才能收斂,我們可以繪製代價函數隨迭代步數增加的變化曲線來觀測算法在何時趨於收斂。

注意,上圖中的x軸代表的是迭代次數。之前的J(θ)曲線中,x軸表示參數向量θ,但在這幅圖中不是這樣。

 

另外,也可以進行一些自動的收斂測試,也就是說讓一種算法來告訴我們梯度下降算法是否已經收斂。下面是自動收斂測試一個非常典型的例子,如果代價函數J(θ)一步迭代後的下降小於一個很小的值,這個測試就判斷函數已經收斂,這個值可以是1e-3。但通常要選擇一個合適的閥值是相當困難的。因此爲了檢查梯度下降算法是否已經收斂,實際上還是更傾向於看左邊的這種曲線圖,而不是依靠自動收斂測試。

看這種曲線圖還可以告訴你或提前警告你算法沒有正常工作。具體地說,如果你畫出代價函數J(θ)隨迭代步數的變化曲線是下圖中的這個樣子,J(θ)在不斷地上升,這就表明梯度下降算法沒有正常工作。而這樣的曲線圖通常意味着你應該使用較小的學習率α。

如果J(θ)在上升,那麼最常見的原因是,你在嘗試最小化下圖這樣一個函數,但如果你的學習率開始太大的話,比如從紅點開始,那麼梯度下降算法可能會衝過最小值,然後將不斷衝過最小值,得到越來越糟的結果,將得到越來越大的代價函數J(θ)的值。

 

數學家已證明,只要學習率α足夠小,那麼每次迭代之後代價函數J(θ)都會下降,因此如果代價函數沒有下降,那可能是因爲學習率過大,這時你就該嘗試一個較小的學習率,當然你也不希望學習率太小,因爲如果這樣做的話,那麼梯度下降算法可能收斂得很慢,需要迭代很多次,才能到達最低點。

總結一下,如果學習率α太小的話,收斂速度會很慢。而如果學習率太大的話,代價函數J(θ)可能不會在每次迭代都下降,甚至可能不收斂,在某些情況下,如果學習率α過大,也可能會出現收斂緩慢,但更常見的問題是,代價函數J(θ)並不會在每次迭代之後都下降。所以爲了調試所有的情況,通常繪製J(θ)隨迭代步數變化的曲線,可以幫助你弄清楚到底發生了什麼。

通常可以考慮嘗試這些學習率:α = 0.01,0.03,0.1,0.3,1,3,10。

 

2. 多項式迴歸和正規方程

2.1 多項式迴歸(Polynomial Regression)

以預測房價爲例,假設你有兩個特徵,分別是房子鄰街的寬度(其實就是它的寬度或者說是擁有土地的寬度)和垂直寬度(房子的縱向深度),那麼就可以建立一個這樣的線性迴歸模型,hθ(x) = θ0+θ1*x1+θ2*x2(x1 = frontage(臨街寬度),x2 = depth(縱向深度))。當在運用線性迴歸的時候,不一定非要直接用給出的x1和x2特徵,可以自己創造新的特徵。因此如果我要預測房子的價格,需要做的也許是確認真正能夠決定房子大小的是我所擁有土地的面積,因此可以創造一個新的特徵設爲x,即臨街寬度與縱深的乘積,於是假設函數可以寫爲 hθ(x) = θ0+θ1*x ,也就是只需要土地面積這一個特徵。因此,這取決於你從什麼樣的角度去審視一個特定的問題,不是直接去使用臨街寬度和縱深這兩個我們一開始使用的特徵,有時通過定義新的特徵,你可能會得到一個更好的模型。

 

與選擇特徵的想法密切相關的一個概念被稱爲多項式迴歸。線性迴歸並不適用於所有數據,有時我們需要曲線來適應我們的數據。比如說你有這樣一個住房價格的數據集,可能會用多個不同的模型用於擬合。比如一個二次方模型:hθ(x)=θ0+θ1*x+θ2*x^2,但是可能會覺得二次函數模型不合理,因爲一個二次函數最終會下降。但我們並不認爲隨着土地面積的增加,房屋的價格會降低。因此我們也許會選擇一個不同的多項式模型,比如說使用一個三次函數hθ(x)=θ0+θ1*x+θ2*x^2+θ3*x^3,用這個模型來擬合這個數據集可能擬合得更好,因爲它不會在最後降下來。


那麼我們如何將模型與數據進行擬合呢?使用多元線性迴歸的方法,我們可以對算法做一個簡單的修改來實現它。按照我們以前的假設形式,我們知道如何擬合,讓hθ(x) = θ0 + θ1*x1 + θ2*x2 + θ3*x3。而現在爲了預測房子的價格,如果我們想擬合這個三次模型,則現在的假設函數是hθ(x) = θ0 + θ1*x + θ2*x^2 + θ3*x^3 ,爲了使這兩個假設函數對應起來,就可以將第一個特徵x1設爲x,第二個特徵x2設爲x^2,第三個特徵x3設爲x^3,僅僅通過將這三個特徵這樣設置,然後再應用線性迴歸的方法,我們就能擬合這個模型,最終將一個三次函數擬合到數據上。如果像這樣選擇了特徵,那麼特徵縮放就變得更重要了。因此如果房子的面積範圍在1到1e3之間,那麼房子面積的平方的範圍就是1到1e6之間,第三個特徵x3(房子面積的立方)範圍是1到1e9。因此這三個特徵的範圍有很大的不同,所以,如果你使用梯度下降法,特徵縮放非常重要,需要將值的範圍變得具有可比性。

 

 

2.2 正規方程(Normal Equation)

對於某些線性迴歸問題,正規方程解法會給我們更好的方法來求得參數θ的最優值。

到目前爲止,我們一直在使用的線性迴歸算法是梯度下降法,爲了最小化代價函數J(θ),我們使用這種迭代算法。經過很多步,也就是梯度下降的多次迭代來收斂到全局最小值。

 

相反地,正規方程提供了一種求θ的解析解法,所以我們不再需要運行迭代算法。而是可以直接一次性求解θ的最優值,所以說基本上只需要一步就可以得到最優值。事實上,正規方程法,有一些優點也有一些缺點。在闡明優缺點和什麼時候使用正規方程之前,先對這個算法進行一個解釋。舉一個例子來解釋,假設有一個非常簡單的代價函數J(θ),它是一個實數θ的函數,所以現在θ只是一個變量,或者說θ只是一個實數值。它是一個數字,不是向量。假設代價函數J是關於實參數θ的二次函數,那麼如何最小化一個二次函數呢?如果你瞭解一點微積分的話,很明顯可以對這個代價函數進行求導,將導數置爲0,這樣就可以求得使得J(θ)最小的θ值,這是θ爲實數的一個比較簡單的例子。

 

正規方程是通過求解這樣的方程來找出使得代價函數最小的參數的:

假設我們的訓練集特徵矩陣爲X(包含了x0=1)並且我們的訓練集結果爲向量y,則利用正規方程解出向量

T代表矩陣的轉置,-1代表矩陣的逆。

上圖中m是訓練樣本的數量,n是特徵變量的數量,特徵變量的數量實際上是n+1(增加了x0)。

另外提一點,如果使用正規方程解法,是不需要使用特徵縮放的。

下面將正規方程法和梯度下降法的優缺點進行比較:

在 Octave 中,正規方程寫作:pinv(X'*X)*X'*y

對於這個方程你可能會有疑惑,如果矩陣X^T*X是不可逆的話怎麼辦?(T是轉置),XT*X不可逆的情況其實很少發生,在Octave裏,如果你用 pinv(X'*X)*X'*y來計算θ,實際上你將會得到正解,這是技術性問題。Octave裏有兩個函數可以求解矩陣的逆,一個是pinv,另一個是inv,這兩者之間的差異是技術性的,一個是所謂的僞逆,另一個被稱爲逆。數學上可以證明,只要你使用pinv函數,它就能計算出你想要的θ值,即使矩陣X'*X是不可逆的。在pinv和inv之間又有哪些具體的區別,這是數值計算的概念,在此並不深入解釋。

下面來解釋一下X'*X的不可逆是什麼意思?

如果X'*X是不可逆的,通常有兩種最常見的原因。

第一個原因是,如果由於某些原因,你的學習問題包含了多餘的特徵,例如,在預測住房價格時,如果x1是以平方英尺爲單位的房子面積,x2是以平方米爲單位的房子面積,因爲1米等於3.28英尺(四捨五入到兩位小數),這兩個特徵值將始終滿足x1等於3.28²乘以x2,由於這兩個特徵是線性關係的,所以矩陣X'*X是不可逆的。

X'*X不可逆的第二個原因是,你在運行的學習算法有很多特徵,具體地說,在m ≤ n的時候,例如你有m=10的訓練樣本,但你有n=100的特徵數量,你要找到適合的參數向量θ,這是一個n+1維的向量,也就是101維的向量,你要從10個訓練樣本中找到101個參數值,有時可能會成功,但這並不總是一個好方法,因爲要配置100或101個參數,10個樣本還是有些少。如果m ≤ n,我們通常會看能否刪除某些特徵或者使用一種叫正則化的方法(這種方法可以讓你使用很多的特徵來配置很多參數,即使你有一個相對較小的訓練集)。

這就是有關正規方程的內容以及矩陣X'*X不可逆是什麼意思,但通常來說,不會出現這種情況,如果你在Octave裏,用pinv函數來實現,也就是僞逆函數(不同的線性代數庫叫法不同),即使X'*X是不可逆的,算法也能正確運行。出現不可逆矩陣的情況極少發生,所以在大多數線性迴歸的實現中,這不是一個大問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章