線性回歸與梯度下降法

2021-09-07 01:11:27 字數 4198 閱讀 2727

原文:

最近在看斯坦福的《機器學習》的公開課,這個課程是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...