【MindSpore:跟著小Mi一起機器學習吧!】多變數線性迴歸(二)
幾天不見,甚是想念!小Mi系列的活動正在如火如荼地進行中,小Mi看到大夥兒的熱情,動力更加十足,這不又迫不及待地更新來了!
在上期的多變數線性迴歸介紹中,我們學習了多維特徵、多變數的梯度下降法以及在實現梯度下降過程中的特徵縮放和如何選擇學習率這兩個技巧,今天小Mi在其基礎上,繼續帶領大家學習多項式迴歸、正規方程法以及介紹正規方程的不可逆性。好啦,廢話不多說啦,我們繼續開始吧!
5特徵和多項式迴歸
依舊是以預測房價為例,假設我們有兩個特徵,分別是房子臨街的寬度和垂直寬度。這就是我們想要賣出的房子的圖片,臨街寬度其實就是你擁有的土地的寬度,而這所房子的縱向深度就是你的房子正面的寬度(定義為長度這樣可能更好理解一點),因此我們便有兩個特徵,臨界寬度和縱深,這樣我們就可以建立一個線性迴歸模型,其中臨界寬度是第一個特徵,縱深是第二個特徵。這裡需要注意的是,當運用線性迴歸時,不一定非要用給出的和作為特徵,換個角度我們還可以自己創造新的特徵!(是不是腦洞大開!)因此,如果要預測房子的價格,小Mi可能會創造一個新的特徵,可以稱之為,即臨界寬度與縱深的乘積,也就是房屋的面積,這樣一來就只會用到一個特徵:
這邊小Mi需要提醒大家注意的是,有時候不一定需要直接使用臨界寬度和縱深,這兩個我們一開始使用的特徵,有時通過定義新的特徵,你可能會得到一個更好的模型。
就拿上圖來說,有這樣一個住房價格的資料集,可能會有多個不同的模型用於擬合,選擇之一是可能是二次模型,因為直線似乎並不能很好地擬合這些資料。用二次模型去擬合,但是最後發現可能二次函式似乎也有點不合理。因為,一個二次函式最終會降下來,隨著土地面積的增加,房子的價格必然不會下降下來。那麼小Mi又選擇使用三次方的函式,進行資料擬合發現,上圖中綠色的線對這個資料集擬合得更好,因為它不會在最後下降。
觀察曲線圖我們可以知道,通常情況下線性迴歸並不會適用於所有資料,有時我們需要曲線方程來適應我們的資料。那麼,我們又應該如何將模型與資料進行擬合呢?使用多元線性迴歸的方法,我們可以對演算法做一個簡單的修改來實現它,按照我們之前假設的形式,我們知道如何擬合,就像這樣:
如果我們想擬合這個三次模型,因為是預測一棟房子的價格,那麼對應起來,特徵設為房子的面積,第二個特徵設為房屋面積的平方,將第三個特徵設為房屋面積的立方,僅僅通過將這三個特徵這樣設定,然後再應用線性迴歸的方法就可以擬合這個模型。需要留意的是,如果房子的大小範圍在1~100之間,那麼房子面積的平方的範圍就是1~1000,而第三個特徵,立方的範圍則是1到10的6次方,因此這三個特徵的範圍有很大的不同,這時如果使用梯度下降法,特徵縮放將會非常重要。
6正規方程
到目前為止,在涉及線性迴歸演算法時我們通常會選用梯度下降法來最小化代價函式。使用迭代演算法,經過梯度下降的多次迭代,來收斂到全域性最小值。然而在面對某些線性迴歸問題時,正規方程法可能是一個更好的方法來幫助我們求得引數的最優值。總的來說,其提供了一種求的解析方法,不需要執行迭代演算法,而是可以直接一次性地求解的最優值,所以說基本上只需要一步就可以得到最優值。(是不是很簡單粗暴!)
那麼現在小Mi帶大家先對這個演算法有一個直觀的理解,上例子!
假設有一個非常簡單的代價函式,其實就是關於實數的函式(只是一個標量或者說只是一個實數值,是一個數字,並不是向量哦)。假設代價函式是這個實引數的二次函式,那麼如何最小化一個二次函式呢?這個問題應該大家都會解決,是不是!這時候只需要對J求關於的導數,並且將導數置零,這樣就可以求出使得最小的值。
當然在實際情況中,並不是一個實數,而是一個n+1維的引數向量。而代價函式則是這個向量的函式,也就是到的函式,這時候我們應該如何最小化這個代價函式呢?實際上,有一個方法能做到,就是逐個對引數求J的偏導數,並且把他們全部置零,求出,,...,一直到的值,這樣就能得到最小化代價函式J的值。但是如果真的手動求解出引數到,這個偏微分最終可能很複雜,這樣不僅浪費時間還很費事。如何求出使得代價函式最小化的值這個過程是需要了解的。
再上一個例子!假如有4個訓練樣本:
為了實現正規方程法,在資料集中,假設這四個訓練樣本是所有資料,在資料集中需要加上一列對應額外特徵變數的,它的取值永遠是1。接下來我們要做的就是構建一個矩陣X,這個矩陣基本包含了訓練樣本所有的特徵變數,同時對y值進行類似的操作,構建向量y。
即:
運用正規方程方法求解引數:
通常情況來看,我們可以知道X是一個m*(n+1)維矩陣,y會是一個m維向量,其中m是訓練樣本數量,n是特徵變數數,由於我們多加了一列額外特徵變數,所以其實是n+1維。最後,用矩陣X和向量y來計算,從而得到的解:
X轉置乘以X的逆乘以X轉置乘以向量y,這樣就能夠得到使得代價函式最小化的。
而就是更加通用的形式為:假設我們有m個樣本,一直到和n個特徵變數。所以每一個訓練樣本可能是這樣的一個向量,是n+1維的。每個訓練樣本給出這樣的n+1維特徵向量,構建設計矩陣X的方法就是取第一個訓練樣本,也就是一個向量,取它的轉置,最後是一個扁長型的,讓轉置作為矩陣X的第一行,然後把第二個訓練樣本進行轉置,作為X的第二行,以此類推,直到最後一個訓練樣本取它的轉置,作為矩陣X的最後一行,這就是矩陣X,一個m*(n+1)維矩陣。
舉個例子:
假如我只有一個特徵變數,除了之外只有一個特徵變數,而始終為1,如果我的特徵向量等於某個實際的特徵變數,比如說房屋大小,那麼我的X會是這樣:,這樣就是一個m*2的矩陣。而向量y則是把訓練集中所有房子的價格放在一起,得到一個m維的向量。最後,構建出矩陣X和向量y,就可以求出結果。
那麼,如果具體求出這個結果呢?是的逆矩陣,令A等於X轉置乘以X,那麼就是,可以藉助程式語言計算這個值。這樣的式子會給出最優的值而不需要進行特徵縮放,即使特徵,,的範圍相差很大。
最後,何時應該使用梯度下降法,而何時應該使用正規方程法,給大家進行一個總結,假如有m個訓練樣本,n個特徵變數,梯度下降法的缺點之一就是需要選擇學習速率,並且需要執行多次,嘗試不同的學習速率,直到找到執行效果最好的那個,所以這會有額外的工作和麻煩,梯度下降的另一個缺點是,需要更多次的迭代,這需要取決於具體情況,計算可能會更慢。至於正規方程,不需要選擇學習速率,這樣就比較方便,並且容易實現,只需要執行一步就行了,同時也不需要迭代,所以不需要畫出的曲線來檢測收斂性或者其他額外的工作。這麼一看,似乎正規方程法會更受歡迎,但是我們需要重視的是,正規方程法也有一些缺點。梯度下降法中,在特徵變數很多的情況下,也可以正常工作,即使有上百萬個特徵變數,梯度下降法通常很有效果,相反,正規方程法為了求解引數,需要求出這一項,這個結果是一個n*n的矩陣,如果有n個特徵變數的話。而對於大多應用來說,實現逆矩陣計算的代價以矩陣維度的三次方增長,大致為n的三次方,所以如果特徵變數數目n特別大的話,那麼這個計算會非常浪費時間,速度上會慢很多。因此,如果n很大的情況下,我們更傾向於選擇梯度下降法,當然啦,如果n比較小的話,那麼正規方程就是更優選擇。那麼,如何定義大小呢?這裡需要說明一下,如果n是上百的,計算百位數乘以百位數的逆矩陣,對於計算機來說是沒有任何問題的,如果n是上千的,還是可以使用正規方程法的,但是當n上萬了,就需要考慮梯度下降法了,當然也不完全絕對,但是當n遠大於此,就一定是選用梯度下降法了。這裡我們也很難給出確切的數字,到底特徵數量應該達到多少時,需要選用梯度下降法,正常來看就是在一萬左右,可以選用梯度下降或者其他演算法,
因此,只要特徵變數的數目並不大,正規方程是一個很好的計算引數的替代方法,但是隨著我們需要學習的學習演算法越來越複雜,例如當涉及分類演算法的時候,logistic迴歸演算法時,正規方程是不太適用的,仍然需要使用梯度下降法。因此,梯度下降法是一個非常有用的演算法,在有大量特徵的線性迴歸問題中,在更加複雜的學習演算法中,但是對於線性迴歸的這個特定的模型,正規方程在小樣本的特徵變數下,是一個比梯度下降實現更快的替代演算法。所以,根據具體的演算法,具體的問題,以及特徵變數的數目,這兩個演算法都是值得學習和深入研究的。
梯度下降與正規方程的比較:
正規方程的python實現:
xxxxxxxxxx
import numpy as np
def normalEqn(X, y):
theta = np.linalg.inv(X.T@X)@X.T@y #X.T@X等價於X.T.dot(X)
return theta
好啦,至此,小Mi已經把線性迴歸的所有問題帶著大家一起學習啦,下期我們將開始著手學習新的學習演算法。我們下期見哦~