第一次基礎線性迴歸這個概念的時候是在高中,當時也就做做題對XX大廠做銷售預測,沒想到會在機器學習裏再次見到。一說到迴歸就是對給定的 X 值做預測的了,線性迴歸就是一種方法。這篇文章將討論線性迴歸裏的重要概念,並一步步地進行優化。
什麼是線性迴歸
下面的圖就是線性迴歸(線性規劃),圖裏面的點是數據集裏的數據,而直線是我們所說的迴歸方程,顯然這個方程是一次的,也就是線性的。
如果將 X 看成時間,Y 看成銷售額,那麼我們就可以預測 n 年後的銷售額啦,這就是線性迴歸的應用。
這裏的迴歸方程一般我們這樣表示。
其中 是特徵值,對應的 值是 ,一般使用向量表示。
整理一下回歸方程如下:
現在的問題就是怎麼確定這些 值。
確定 值
Cost Function
這些 是可以反映出這個函數是否擬合好的,我們應該儘可能地將這個迴歸函數往數據上靠才行,也就是預測值儘可能等於真實值,進一步來說就是錯誤率要儘可能低。OK,我們好像找到一個約束條件了——錯誤率要低。這裏複習一下回歸方程的錯誤率公式:
我們還發現這樣的求和跟矩陣相乘有點關係呀,其中 ,而且 值是矩陣 的一部分
所以將上面的式子再整理一下
梯度下降
假設有初始值 了,現在目標是改變這些值使得 MSE(或者說 ) 最小就可以了,所以在改動的過程中 是下降的趨勢。這裏我們可以用導數完成。求導之前爲了看得更清楚,規定:
對 求導數,其中對於單個 的求導過程爲
所以整個 Cost Function 的求導結果爲
然後將裏面的同類項提出來
如果
- 導數 > 0,說明上升趨勢, 值應該減小某個數
- 導數 < 0,說明下降趨勢, 值應該加大某個數
僞代碼表示
這裏的某個數就是 α*∇J(θ)
。每次迭代都會更新 值, 值更新完後 又會更新,然後再次求導再更新 值,如此反覆,直到誤差小於某個小數,這裏是 ε
。這整個迭代過程叫做梯度下降,有沒有坐滑滑梯的感覺呢?下面的圖可以形象地反映整個梯度下降的過程
一直走到極值點才停止。
隨機梯度下降
如果你理解了上面的梯度下降,那麼這個方法很容易理解。它的主要思想是每次更新 值的時候,從數據集裏隨機選一個數據,只用這個數據的 和 值去做更新,而不是使用全部數據的 和 值。僞代碼如下
和上面的代碼相比就多了一行 for j=1:m
,意思是從 m 個數據裏選一個出來,拿這個數據去更新 值。當改變這 時,它會使得迴歸方程趨向這個點。又因爲這個過程是隨機的,所以多次迭代後,迴歸方程會趨向於所有的數據。圖下表示迴歸方程趨向於某個隨機選中的點。
當然這種方法有好也有壞,好的地方是擬合速度快。不好的地方是有可能不是嚴格的梯度下降,比如本來已經很擬合很好了突然選中了外面一個點又往外靠,這就不是梯度下降了。而且更難的地方在於找一個合適的條件讓算法停止。
非線性特徵值
之前我們都是假想特徵值是線性的,但是實際有可能某些特徵是 2 次,或者多次,甚至開方的,那怎麼辦呢?如下圖
我們的迴歸方程就不應該再是線性的了,這裏就要說一個特徵轉化的技巧了,做如下改動
這裏就加了一箇中間的過渡向量 ,將原來的 用 替代完事了。個人感覺這個思想有點像開發裏的中間件,或者是設計模式裏的裝飾器模式。有了這個技巧後我們還能解決一些奇奇怪怪的特徵值如 ,把它們都放在 向量裏就 OK 了。
正則化
爲了防止迴歸方程出現過擬合,如下圖所示
一般會加上一個參數來控制擬合程度,所以我們的 要改成如下形式了
多加的 就是前面所說的參數,其中 。通過控制 的值就可以控制迴歸方程的擬合程度。
如果 那就和沒搞正則化一樣嘛,如果 很大, 值就會小一些,不容易出現過擬合的情況。