機器學習: 線性迴歸

第一次基礎線性迴歸這個概念的時候是在高中,當時也就做做題對XX大廠做銷售預測,沒想到會在機器學習裏再次見到。一說到迴歸就是對給定的 X 值做預測的了,線性迴歸就是一種方法。這篇文章將討論線性迴歸裏的重要概念,並一步步地進行優化。

什麼是線性迴歸

下面的圖就是線性迴歸(線性規劃),圖裏面的點是數據集裏的數據,而直線是我們所說的迴歸方程,顯然這個方程是一次的,也就是線性的。

如果將 X 看成時間,Y 看成銷售額,那麼我們就可以預測 n 年後的銷售額啦,這就是線性迴歸的應用。

這裏的迴歸方程一般我們這樣表示。

\hat{y}(x)=\theta_0+\theta_1x_1+\theta_2x_2+...

其中 x_1,x_2,...,x_n 是特徵值,對應的 \theta 值是 \theta_1,\theta_2,...,\theta_n,一般使用向量表示。

\theta=[\theta_0,...,\theta_n],x=[x_0,...,x_n]

整理一下回歸方程如下:

\hat{y}(x)=\theta x^T

現在的問題就是怎麼確定這些 \theta 值。

確定 \theta

Cost Function

這些 \theta 是可以反映出這個函數是否擬合好的,我們應該儘可能地將這個迴歸函數往數據上靠才行,也就是預測值儘可能等於真實值,進一步來說就是錯誤率要儘可能低。OK,我們好像找到一個約束條件了——錯誤率要低。這裏複習一下回歸方程的錯誤率公式:

MSE, J(\theta)=\frac{1}{m}\sum_j{(y^{(j)}-\hat{y}(x^{(j)}))}^2

我們還發現這樣的求和跟矩陣相乘有點關係呀,其中 y={[y^{(1)},...y^{(m)}]}^T,而且 x 值是矩陣 X 的一部分

所以將上面的式子再整理一下

J(\theta)=\frac{1}{m}(y^T-\theta X^T) {(y^T-\theta X^T)}^T

梯度下降

假設有初始值 \theta=[\theta_1,...,\theta_n] 了,現在目標是改變這些值使得 MSE(或者說 J(\theta)) 最小就可以了,所以在改動的過程中 J(\theta) 是下降的趨勢。這裏我們可以用導數完成。求導之前爲了看得更清楚,規定:

J(\theta) 求導數,其中對於單個 \theta_0 的求導過程爲

所以整個 Cost Function 的求導結果爲

然後將裏面的同類項提出來

如果

  1. 導數 > 0,說明上升趨勢,\theta 值應該減小某個數
  2. 導數 < 0,說明下降趨勢,\theta 值應該加大某個數

僞代碼表示

這裏的某個數就是 α*∇J(θ)。每次迭代都會更新 \theta 值,\theta 值更新完後 J(\theta) 又會更新,然後再次求導再更新 \theta 值,如此反覆,直到誤差小於某個小數,這裏是 ε。這整個迭代過程叫做梯度下降,有沒有坐滑滑梯的感覺呢?下面的圖可以形象地反映整個梯度下降的過程

一直走到極值點才停止。

隨機梯度下降

如果你理解了上面的梯度下降,那麼這個方法很容易理解。它的主要思想是每次更新 \theta 值的時候,從數據集裏隨機選一個數據,只用這個數據的 xy 值去做更新,而不是使用全部數據的 xy 值。僞代碼如下

和上面的代碼相比就多了一行 for j=1:m,意思是從 m 個數據裏選一個出來,拿這個數據去更新 \theta 值。當改變這 \theta 時,它會使得迴歸方程趨向這個點。又因爲這個過程是隨機的,所以多次迭代後,迴歸方程會趨向於所有的數據。圖下表示迴歸方程趨向於某個隨機選中的點。

當然這種方法有好也有壞,好的地方是擬合速度快。不好的地方是有可能不是嚴格的梯度下降,比如本來已經很擬合很好了突然選中了外面一個點又往外靠,這就不是梯度下降了。而且更難的地方在於找一個合適的條件讓算法停止。

非線性特徵值

之前我們都是假想特徵值是線性的,但是實際有可能某些特徵是 2 次,或者多次,甚至開方的,那怎麼辦呢?如下圖

我們的迴歸方程就不應該再是線性的了,這裏就要說一個特徵轉化的技巧了,做如下改動

這裏就加了一箇中間的過渡向量 \phi(x),將原來的 x\phi(x) 替代完事了。個人感覺這個思想有點像開發裏的中間件,或者是設計模式裏的裝飾器模式。有了這個技巧後我們還能解決一些奇奇怪怪的特徵值如 1/x, \sqrt{x}, x1 \times x2, ...,把它們都放在 \phi 向量裏就 OK 了。

正則化

爲了防止迴歸方程出現過擬合,如下圖所示

一般會加上一個參數來控制擬合程度,所以我們的 J(\theta) 要改成如下形式了

多加的 \alpha \theta \theta^T 就是前面所說的參數,其中 \theta \theta^T=\sum_i \theta_i^2。通過控制 \alpha 的值就可以控制迴歸方程的擬合程度。

如果 \alpha = 0 那就和沒搞正則化一樣嘛,如果 \alpha 很大,\theta 值就會小一些,不容易出現過擬合的情況。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章