看圖說話之線性迴歸算法

一.從線性迴歸的故事說起

相信大家都聽過著名的博物學家,達爾文的大名,而今天這個故事的主人公就是他的表弟高爾頓。

高爾頓是一名生理學家,在1995年的時候,他研究了1078堆父子的身高,發現他們大致滿足一條公式,那就是

Y=0.8567+0.516*x

這條式子中的x指的是父親的身高,Y指的是兒子的身高。可以明顯看出,這就是我們中學時代學的二元一次方程,反應在平面上就是一條直線

通過這條公式,我們或許會直觀得以為高個的父親總會有高個的兒子,矮個的父親會有矮個的兒子。但高爾頓進一步觀察後發現,並非所有的情況都是這樣的。特別高的父親的兒子會比他父親矮一些,特別矮的父親的兒子會比他父親高一些,父子不會說一直不斷得更高或更矮下去。這個現象,其實就是迴歸。趨勢不會一直持續下去,而是會回到某個中心。

通過這個故事,相信你已經明白了什麼是線性迴歸,那麼接下來我們就來說說更加詳細的內容。

二.理解線性迴歸

看圖說話之線性迴歸算法

平面座標點

拋出問題:假設有這樣的一些點,這些都是現有的數據,我們要找到擬合這些點的線,然後預測接下來的點。那我們要怎麼找出這條線呢?

h(x)=a0 + a1 * x(a1是斜率,a0是截距)

或者說換個問法,我們要怎麼求出a_1和a_0呢?

Cost Function(代價函數)

第一次接觸線性迴歸的同學可能不知道什麼叫cost function,其實當碰到不知道的概念的時候,只要想清楚兩件事,這個概念是什麼,有什麼用。想清楚這兩點,起碼就不會犯迷糊了。

代價函數是什麼?

我們先隨便畫兩條線來擬合那些點,如圖所示,可以看到,明顯圖二更加擬合,也就是說圖二的線更接近我們理想中的線。

看圖說話之線性迴歸算法

代價函數介紹

OK,再仔細觀察,圖二的線和圖一的線有什麼不同呢?最明顯的,就是圖一中,各個點沿y軸到那條直線的距離更遠,而圖二中各個點到線的距離更近。

看圖說話之線性迴歸算法

各點到西線的距離

這所有點沿y軸到直線的誤差,也就是各個點的誤差,的平均值。就是代價函數。公式如下:

看圖說話之線性迴歸算法

代價函數公式

pred(i) 就是第i個點上,直線的y值,y(i)就是第i個點,這個點的y值,加上平方主要是避免了負數的情況。這就是代價函數。

代價函數有什麼用?

代價函數有助於我們找出a0和a1的最佳可能值。前面說到,代價函數就是每個點在y軸到直線的距離的平均值。我們的目標就是最小化這個值,在普遍情況下,代價函數是凸函數,如下圖所示,

看圖說話之線性迴歸算法

看到這個函數是不是比較熟悉?在學習導數的時候不就經常看到這樣的圖嘛,這種圖通常也是通過求導來解的。

看圖說話之線性迴歸算法

最小化過程

從y=a0+a1*x,這條直線開始。到寫出代價函數,我們的目標一直沒變,就是要找出a0和a1,讓這條直線更貼緊那些點(就是讓代價函數最小)。當然,我們還沒說到如何讓代價函數最小化,下面我們就接著說說如何讓代價函數最小化吧。

Gradient Descent(梯度下降)

梯度下降是什麼?

梯度下降是一種不斷迭代更新a0和a1以降低代價函數的方法。 我們可以通過對代價函數求導的方式,看出應該讓a0或a1加還是減。

看圖說話之線性迴歸算法

梯度下降公式

上面部分其實就是對代價函數的求導,通過對其求導,我們能夠知道a0和a1應該是增大還是減少。


看圖說話之線性迴歸算法


這條公式其實就是(a0-代價函數的偏導數)。當然,其中還有一個控制速率的α(Alpha),對代價函數的求導能知道是對a0和a1增大還是減少,那麼α就是應該增大多少,減少多少。

舉個例子,假設你現在在半山坡,你要做的是下山,代價函數的偏導數,就是告訴你應該向下還是向上。而速率α就是來控制步子要邁多大。

步子小(α小)意味著小步快跑下山,缺點是跑比較久。大步向前(α大)意味著比較快,但可能一下子邁太大,跑到對面半山腰去了。

看圖說話之線性迴歸算法

速率α的作用

梯度下降有什麼用?

通過梯度下降,能夠讓我們找到一個局部最優解的a0和a1,為什麼是局部最優解呢?因為現實中的問題可能沒一開始的例子那麼清晰,很多時候你發現可能這條線也可以,這條線也不錯,那條好像也可以。計算機也會這樣,它可能也會覺得某條線就已經夠好了。就不去找其他的線了。

反應到我們求的問題裡面,可以說因為是最小化問題(最小化代價函數),但可能像右圖一樣,它已經在一個局部裡面是最小的了,向左向右都是升高,既然如此那就安心當鹹魚嘍。這種現象和初始的隨機選擇有關,也和訓練的速率有關。

看圖說話之線性迴歸算法

局部最優和全局最優

當選擇了一個合適的α值,當更新迭代足夠多次之後。理論上就會到達某個底部,這時候也就意味著代價函數是某個範圍內最小的。這個時候的a0喝a1就被我們求出來了,我們就能夠得到一條擬合空間中點的直線了。

最後再說一下,剛剛介紹的都只是在二維空間中的計算,也就是隻有一個特徵。而現實中往往不止會有一個特徵,而是多個特徵,如下面的形式:

h(x)=a0 + a1 * x1 + a2 * x2 + a3 * x3 ...

不過計算方式和計算的方法都是類似的。只是數據量會變多,計算會更加複雜些。


分享到:


相關文章: