一:多維特征
目前為止,我們探討了單變量/特征的回歸模型,現在我們對房價模型增加更多的特征,例如房間數樓層等,構成一個含有多個變量的模型,模型中的特征為(X_1,X_2,...,X_n)
每一行都是一個訓練集樣本。
二:多元梯度下降法
與單變量線性回歸類似,在多變量線性回歸中,我們也構建一個代價函數,則這個代價函數是所有建模誤差的平方和。
我們的目標和單變量線性回歸問題中一樣,是要找出使得代價函數最小的一系列參數。 多變量線性回歸的批量梯度下降算法為:
即:
當n>=1時:
我們開始隨機選擇一系列的參數值,計算所有的預測結果后,再給所有的參數一個新的值,如此循環直到收斂。
代價函數代碼實現:
def computeCost(X, y, theta): inner = np.power(((X * theta.T) - y), 2) return np.sum(inner) / (2 * len(X))
三:梯度下降法實踐---特征縮放
在我們面對多維特征問題的時候,我們要保證這些特征都具有相近的尺度,這將幫助梯度下降算法更快地收斂。
以房價問題為例,假設我們使用兩個特征,房屋的尺寸和房間的數量,尺寸的值為 0-2000平方英尺,而房間數量的值則是0-5,以兩個參數分別為橫縱坐標,繪制代價函數的等高線圖能,看出圖像會顯得很扁,主要下降方向在數值較大方向,梯度下降算法需要非常多次的迭代才能收斂。
解決的方法是嘗試將所有特征的尺度都盡量縮放到-1到1之間。如圖:
另外:對於范圍在-1到1的范圍附件,我們可以不進行歸一化處理。但是對於差距較大(過大或者過小),則需要進行歸一化處理。
兩種常用的歸一化操作(均值標准化和標准差標准化):https://blog.csdn.net/luckoovy/article/details/82346223
相似范圍即可,其主要目的是為了使得梯度下降速度加快
四:梯度下降法實踐---學習率α
(一)根據圖表查看是否收斂:
梯度下降算法收斂所需要的迭代次數根據模型的不同而不同,我們不能提前預知,我們可以繪制迭代次數和代價函數的圖表來觀測算法在何時趨於收斂。
可以看到,在300-400之間的下降並不是很大,明顯趨於收斂。
也有一些自動測試是否收斂的方法,也就是說讓一種算法,來告訴你梯度下降算法是否已經收斂。如果代價函數J(θ)一步迭代后的下降小於一個很小的值ε,這個測試九判斷函數以及收斂。ε可以是1e-3。通常要選擇一個合適的閾值ε是相當困難的。因此,為了檢查梯度下降算法是否收斂,通常看上圖表更好。而不是依靠自動收斂測試。
例如將代價函數的變化值與某個閥值(例如0.001)進行比較,但通常看上面這樣的圖表更好。
(二)並且通過看圖,我們可以知道算法有沒有正常工作,是否正常收斂:
1.J(θ)實際上在不斷上升,則梯度下降算法沒有正常工作。---針對這樣曲線圖,我們應該使用較小的學習率α
如果學習率太大,可能導致並不會在每次迭代之后都下降,甚至導致發散。
如果J(θ)在上升,最常見的原因是:我們在嘗試最小化時,選取的學習率α過大,導致最小化時,沖過最小值,一直增加,得到越來越大的代價值J(θ)
當我們獲取了上面的代價函數圖表,一般也是因為我們選取了較大的學習率α。解決方法依舊是減少學習率。
2.如果學習率過小,則達到收斂所需的迭代次數會非常高。
3.通常可以考慮嘗試些學習率:
應該選取一系列α值,直到找到一個太小的值比如0.03,再找到一個太大的值1,然后選取最大可能值,或者比最大值略小一些的比較合理的值。通常我們就可以獲取一個不錯的學習率。
五:特征和多項式回歸
(一)選擇新的特征的方法
了解一些用來選擇特征的方法以及如何得到不同的學習算法,當選擇了合適的特征后,這些算法往往是非常有效的。
了解多項式回歸,使得我們能夠使用線性回歸的方法來擬合非常復雜的函數 甚至是非線性函數。
如房價預測問題:假設你有兩個特征,分別是房子臨街的寬度和垂直寬度
運用線性回歸時,你不一定非要直接用給出的 x1 和 x2 作為特征,可以自己創造新的特征。
因此 如果我要預測房子的價格,我真正要需做的,也許是確定真正能夠決定我房子大小的因素是什么?是我們擁有土地的大小
因此 我可能會創造一個新的特征,我稱之為x(擁有的土地大小) 它是臨街寬度與縱深的乘積:
於是我們將下面這個式子作為假設,只用一個特征(上面式中x),也就是我的土地的面積
因此,這取決於我們從什么角度去看一個特定的問題,不是直接去使用臨街寬度和縱向深度。這兩個我們只是碰巧在開始時使用的特征,有時 通過定義新的特征,確實會得到一個更好的模型。
(二)與選擇特征的想法密切相關的一個概念被稱為多項式回歸
比方說:你有這樣一個住房價格的數據集
為了擬合它,可能會有多個不同的模型供選擇。比如上面的數據集,我們選擇不同的多項式模型:可以使用二次函數(后面下降),或者三次函數(后面上升)進行擬合。
線性回歸並不適用於所有數據,有時我們需要曲線來適應我們的數據,比如一個二次方模型:
或者三次方模型:
那么我們如何將模型與數據進行擬合?
通常我們需要先觀察數據然后再決定准備嘗試怎樣的模型。使用多元線性回歸的方法 我們可以通過將我們的算法做一個非常簡單的修改來實現它。按照我們以前假設的形式 ,我們知道如何對這樣的模型進行擬合,如下圖所示:
僅僅通過將這三個特征這樣設置 :
然后再應用線性回歸的方法,我們就可以擬合這個模型:
最終將一個三次函數擬合到我的數據上。
注意:如果我們向上面選擇特征:
那么特征縮放就變得更加重要了:
因為這三個特征的范圍有很大不同,因此特征縮放非常重要。這樣才能將值的范圍變得具有可比性。
補充:除了二次,三次函數可以擬合模型數據集之外,我們還可以使用:
來擬合數據,因此,對於一個數據集,我們可以存在多種模型進行數據擬合。
補充:我們可以自由選擇使用什么樣的特征和模型,並且通過設計不同的特征,我們可以使用更復雜的函數擬合數據。后面課程會學習到一些算法,他們可以自動選擇使用什么樣的特征,所以可以讓算法觀察給出的數據,並自動為我們選擇模型函數。
六:正規方程
(一)正規方程了解
對於某些線性回歸問題,用標准方程法(正規方程)求解參數θ的最優值更好。
到目前為止,我們一直在使用的線性回歸的算法,是梯度下降法。
梯度下降法,為了最小化代價函數 J (θ),我們使用的迭代算法,需要經過很多步,也就是說通過多次迭代來計算梯度下降,來收斂到全局最小值。
相反地,標准方程法提供了一種求θ的解析解法,所以與其使用迭代算法,我們可以直接一次性求解θ的最優值,所以說基本上,一步就可以得到優化值,標准方程法有一些優點,也有一些缺點。
但是在我們講解這個和何時使用標准方程之前,讓我們先對這個算法有一個直觀的理解。
我們假設 有一個非常簡單的代價函數J(θ),它就是一個實數θ的函數。所以現在假設θ只是一個標量,或者說θ只有一行。它是一個數字,不是向量。假設我們的代價函數J,是這個實參數θ的二次函數。 所以J (θ)如上圖所示。
那么如何最小化一個二次函數呢?最小化的一個函數的方法是對它求導 ,並且將導數置零,就能求得θ值
當θ不是一個標量,而是一個n+1維的參數向量時,如何求解?就是對每個θ_j求導,然后把他們全部置零。
但實際上如果你真的做完微積分和求解參數θ0到θn,這個偏微分最終可能很復雜。
(二)案例講解
假如說我有m=4個訓練樣本:
在我的訓練集中加上一列對應額外特征變量的x0,就是那個取值永遠是1的。
其中X是一個M*(n+1)維矩陣,y會是一個m維向量。其中m是訓練樣本數量,n是特征變量數。n+1是因為我加的這個額外的特征變量x0。
最后,如果你用矩陣X和向量y來計算θ:
這樣就得到能夠使得代價函數最小化的θ。
對於那些不可逆的矩陣(通常是因為特征之間不獨立,如同時包含英尺為單位的尺寸和米為單位的尺寸兩個特征,也有可能是特征數量大於訓練集的數量),正規方程方法是不能用的。
梯度下降與正規方程的比較:
總結一下,只要特征變量的數目並不大,標准方程是一個很好的計算參數的替代方法。具體地說,只要特征變量數量小於一萬,我通常使用標准方程法,而不使用梯度下降法。
隨着我們要講的學習算法越來越復雜,例如,當我們講到分類算法,像邏輯回歸算法,我們會看到,實際上對於那些算法,並不能使用標准方程法。對於那些更復雜的學習算法,我們將不得不仍然使用梯度下降法。因此,梯度下降法是一個非常有用的算法,可以用在有大量特征變量的線性回歸問題。或者我們以后在課程中,會講到的一些其他的算法,因為標准方程法不適合或者不能用在它們上。但對於這個特定的線性回歸模型,標准方程法是一個比梯度下降法更快的替代算法。所以,根據具體的問題,以及你的特征變量的數量,這兩種算法都是值得學習的。
(三)推導過程
補充:矩陣求導
(四)代碼實現
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