原文:
最近在看斯坦福的《機器學習》的公開課,這個課程是2023年的,有點老了,不過講的還是很好的,廓清了一些我以前關於機器學習懵懂的地方。我的一位老師曾經說過:
什麼叫理解?理解就是你能把同乙個事情用自己的語言表達出來,並且能讓別人聽得懂。本著這樣的原則,同時也為了證明自己是」理解」的,於是決定打算在學習《機器學習》公開課的時候,寫一些系列文章類鞏固學到的東西。機器學習中的很多內容都是和數學推導相關的,而我本人的數學功底並不紮實,所以文章也許會寫得比較慢。另外,這個系列的文章大體上是按照公開課的課程來的,但也不一定侷限於它,因為同時手頭還有很多其他的學習資料,學到**就寫到**吧,但我也會盡量保持連貫性1
1之前已經發布了兩篇文章,當時還沒考慮到要寫成系列文章,所以那兩篇文章暫時不算做這個系列,以後修改之後也許會加進來。
這篇文章的關注點在於線性回歸問題,重點是求解線性回歸問題的梯度下降法(gradient descent),之前在學習感知機模型的時候,使用過這個演算法,並且還實現了它。可是那只是僅僅停留在使用的層面上,這次是要充分理解梯度下降法的原理及其計算方法。
從數學上說,回歸問題其實就是函式擬合問題:給定一些點的集合,然後用乙個曲線2
2這裡的曲線不再侷限於二維的,而是高維空間的,甚至有時候會是無窮維的。
或方程去擬合,使得集合中的所有點都大致符合給出的曲線或方程。當擬合的曲線是一條直線的時候,就稱為是線性回歸問題。
回歸問題的意義在於,它使得我們能夠在已知資料的基礎上對未知資料進行**:通過對已知資料進行回歸分析,得到乙個曲線,我們就能夠利用這個曲線對未知的資料進行很好的**。其實,我們在初高中就遇到過這種問題了,只是我們當時被沒有意識到這是乙個回歸問題。
例如給定兩個點(x1,y1)
,(x2,y2)
,求過這兩個點的直線。當然,現在我們的問題複雜得多,而且不僅僅侷限在二維平面,很多時候都是處理高維資料。
舉了例子3
3公開課中的例子,詳細可以參考公開課的講義。
,現在我們有如下的資料:
living area
bedrooms
price
2104
3400
1600
3330
2400
3369
1416
2232
3000
4540
現在的問題是,我給定乙個組新的living area 和 bedrooms資料,你能否**正確的price是多少?這裡的資料是三維的,但是更多時候是多維的,影響房價的因素還包括很多,如有浴室的數目、有沒有壁爐等。這裡的輸入是living area和beadrooms,輸出則是price。
在統計機器學習4
4更多的統計機器學習的內容參見這裡。事實上,回歸問題是統計機器學習的乙個分支,屬於監督學習(supervisedlearnig)的範疇。
中,影響輸出的因素被稱為是特徵(features),輸入資料稱為訓練集(training set)或訓練資料(training data),訓練資料的維度稱為特徵的個數。
因為我們的重點是線性回歸問題,所以這裡我們簡單地假設能夠擬合的方程是:
hθ(x)=θ0+θ1x1+θ2x2(1)
這裡θi
稱為引數(也稱作是權重),這裡的變數是x1
和x2,在我們的例子中分別代表living area和bedrooms,hθ(x)
就是輸出值,這裡是就是price。現在任務很明確,就是根據已知的資料計算出相應的θi
引數。整個過程可以用下圖表示:
上圖是整個統計機器學習的流程,不僅僅侷限於回歸問題。
為了一般化我們的公式,可以引入乙個常量x0=1
,這樣我們的公式就可以表示為:
hθ(xn×1)=∑i=0nθixi=θtn×1xn×1(2)
注意,這裡有幾個貫穿全文的約定:
現在我們已經有了乙個假設的函式了,那麼我們該如何衡量這個函式的好壞呢?這就要引入損失函式(cost function),這個函式用來衡量我們的**值和真實值之間的差距。它是這樣定義的:
j(θn×1)=12∑i=1m(hθ(x(i)n×1)−y(i))2(3)
這個函式很好理解,它是關於引數θn×1
的函式,直觀上就是(**值-真實值)的平方,然後對每一組訓練資料進行累加,用這個累加和來衡量我們學習到的函式(2)
。這裡的12
其實並不是必須的,只是為了簡化後面的推導而人為的乘上乙個係數,這對結果不影響。如果搞過數模的話,就知道,這其實就是最小二乘法的思想。
現在我們的問題就轉化為乙個求最小值的問題了:
j(θn×1)=12∑i=1m(hθ(x(i)n×1)−y(i))2minθjθ(4)(5)
如何求解這個問題呢?這裡我們就要引入最小梯度法了。還記得當年學高數,在學到梯度的時候,記得老師曾經說過,負梯度方向是函式下降最快的方向。最小梯度法就是利用這個性質。具體的思路是:
對θn×1
進行賦值,這個值可以是隨機的,但通常都賦值為乙個全零的向量。
不停迭代,每次迭代都改變θn×1
,使得j(θn×1)
按梯度下降的方向進行減少。
上面的比較數學化的說法,其實比較直觀的說法是這樣的:想象你站在一座高山上,你想要用最短的時間下山,但是你每次只能走一步。那你需要做的就是檢視你周圍360度的範圍,找到乙個最陡峭的(下降的最快的)方向,然後轉移到那個點上;轉移到新的位置之後,重複相應的步驟,環顧360度,找到最陡峭的(下降的最快的)方向,然後轉移過去,這樣每次都是選擇最陡峭的方向走,那麼很快就能到達山下了。
這就是梯度下降法的基本思路,其中對陡峭的方向就是負梯度的方向。
為了更加易於理解,給出下圖:
我們θn×1
按照梯度下降的方向進行調整,就會使得j(θn×1)
往更低的方向進行變化,如上圖所示,演算法的結束將是在θn×1
下降到無法繼續下降為止。
其中,梯度方向由j(θ)
對θ的偏導數確定。用公式來表達就是:
θj=θj−α∂∂θjj(θn×1)(6)
其中α稱為學習率(learning rate),直觀的意義是,在函式向極小值方向前進時每步所走的步長。太大一般會錯過極小值,太小會導致迭代次數過多。
具體的梯度方向是(此處為了方便計算,假設只有一組資料):
∂∂θjj(θn×1)=∂∂θj12(hθ(xn×1)−y)2=2⋅12(hθ(xn×1)−y)⋅∂∂θj(hθ(xn×1)−y)=(hθ(xn×1)−y)⋅∂∂θj(∑i=0nθixi−y)=(hθ(xn×1)−y)xj
上面式子中的j
表示的是第j
個特徵。從這個推導過程就可以知道,當初我們為什麼要在公式前乘上12
了。這樣,對於每一組訓練資料,每乙個特徵分量θj
的變化是這樣的(注意:此時括號中的符號改變了,因為是負梯度的方法向):
θj=θj+α(y(i)−hθ(x(i)n×1))x(i)j(7)
在得到上面的公式之後,我們的演算法也就形成了:
上述演算法中的式子是針對所有的訓練資料的,這是從公式7
變化而來,只是加入了乙個累加的過程,此處不再證明。從公式中可以看到,每次迭代的時候,該演算法都會遍歷整個訓練資料集,這個就被稱為批梯度下降法(bath gradient descent)。需要注意的是,此處的梯度下降法是只能找到區域性最優解,而非全域性最優解。它有以下兩個特點:
得到的結果是區域性最優解,這依賴於初始值
每次迭代它的梯度大小都在變化,且越來越趨近於0
在利用批梯度下降法(bath gradient descent)進行計算的時候,你會發現,每計算乙個引數分量,都需要遍歷整個訓練資料集,這樣做的效率明顯不高,因此我們有乙個替代的演算法:
可以看到,這個演算法每次都只利用了一組資料進行計算,這樣就大大減少了計算量。這個演算法稱為隨機梯度下降法(stochastic gradient descent)。但是,帶來的相應後果就是,它最終得到的解可能是在真正的最小值的附近,而不是最小值本身。因此只有在資料量很大的情況下才會使用這個演算法。
字數:3463
20191008 線性回歸 梯度下降法
不斷的迭代,還是波士頓房價 獲取資料 資料清洗預處理 劃分資料集 特徵工程 預估器流程 coef intercept 模型評估 from sklearn.datasets import load boston from sklearn.model selection import train tes...
梯度下降法求解線性回歸
梯度下降法 英語 gradient descent 是乙個一階最優化演算法,通常也稱為最速下降法。要使用梯度下降法找到乙個函式的區域性極小值,必須向函式上當前點對應梯度 或者是近似梯度 的反方向的規定步長距離點進行迭代搜尋。如果相反地向梯度正方向迭代進行搜尋,則會接近函式的區域性極大值點 這個過程則...
梯度下降法 3 實現線性回歸中的梯度下降法
構造資料集 import numpy import matplotlib.pyplot as plt 設定隨機數種子 numpy.random.seed 666 x 2 numpy.random.random size 100 y x 3.4.numpy.random.normal size 100...