前面的文章對線性迴歸作了一個小結,文章在這: 線性迴歸原理小結。裏面對線程迴歸的正則化也作了一個初步的介紹。提到了線程迴歸的L2正則化-Ridge迴歸,以及線程迴歸的L1正則化-Lasso迴歸。可是對於Lasso迴歸的解法沒有說起,本文是對該文的補充和擴展。如下都用矩陣法表示,若是對於矩陣分析不熟悉,推薦學習張賢達的《矩陣分析與應用》。html
首先咱們簡要回歸下線性迴歸的通常形式: 算法
\(h_\mathbf{\theta}(\mathbf{X}) = \mathbf{X\theta}\)微信
須要極小化的損失函數是: 機器學習
\(J(\mathbf\theta) = \frac{1}{2}(\mathbf{X\theta} - \mathbf{Y})^T(\mathbf{X\theta} - \mathbf{Y})\)函數
若是用梯度降低法求解,則每一輪\(\theta\)迭代的表達式是: post
\(\mathbf\theta= \mathbf\theta - \alpha\mathbf{X}^T(\mathbf{X\theta} - \mathbf{Y})\)學習
其中\(\alpha\)爲步長。優化
若是用最小二乘法,則\(\theta\)的結果是:spa
$ \mathbf{\theta} = (\mathbf{X^{T}X})^{-1}\mathbf{X^{T}Y} $線程
因爲直接套用線性迴歸可能產生過擬合,咱們須要加入正則化項,若是加入的是L2正則化項,就是Ridge迴歸,有時也翻譯爲脊迴歸。它和通常線性迴歸的區別是在損失函數上增長了一個L2正則化的項,和一個調節線性迴歸項和正則化項權重的係數\(\alpha\)。損失函數表達式以下:
\(J(\mathbf\theta) = \frac{1}{2}(\mathbf{X\theta} - \mathbf{Y})^T(\mathbf{X\theta} - \mathbf{Y}) + \frac{1}{2}\alpha||\theta||_2^2\)
其中\(\alpha\)爲常數係數,須要進行調優。\(||\theta||_2\)爲L2範數。
Ridge迴歸的解法和通常線性迴歸大同小異。若是採用梯度降低法,則每一輪\(\theta\)迭代的表達式是:
\(\mathbf\theta= \mathbf\theta - (\beta\mathbf{X}^T(\mathbf{X\theta} - \mathbf{Y}) + \alpha\theta)\)
其中\(\beta\)爲步長。
若是用最小二乘法,則\(\theta\)的結果是:
\(\mathbf{\theta = (X^TX + \alpha E)^{-1}X^TY}\)
其中E爲單位矩陣。
Ridge迴歸在不拋棄任何一個變量的狀況下,縮小了迴歸係數,使得模型相對而言比較的穩定,但這會使得模型的變量特別多,模型解釋性差。有沒有折中一點的辦法呢?即又能夠防止過擬合,同時克服Ridge迴歸```
模型變量多的缺點呢?有,這就是下面說的Lasso迴歸。
Lasso迴歸有時也叫作線性迴歸的L1正則化,和Ridge迴歸的主要區別就是在正則化項,Ridge迴歸用的是L2正則化,而Lasso迴歸用的是L1正則化。Lasso迴歸的損失函數表達式以下:
\(J(\mathbf\theta) = \frac{1}{2n}(\mathbf{X\theta} - \mathbf{Y})^T(\mathbf{X\theta} - \mathbf{Y}) + \alpha||\theta||_1\)
其中n爲樣本個數,\(\alpha\)爲常數係數,須要進行調優。\(||\theta||_1\)爲L1範數。
Lasso迴歸使得一些係數變小,甚至仍是一些絕對值較小的係數直接變爲0,所以特別適用於參數數目縮減與參數的選擇,於是用來估計稀疏參數的線性模型。
可是Lasso迴歸有一個很大的問題,致使咱們須要把它單獨拎出來說,就是它的損失函數不是連續可導的,因爲L1範數用的是絕對值之和,致使損失函數有不可導的點。也就是說,咱們的最小二乘法,梯度降低法,牛頓法與擬牛頓法對它通通失效了。那咱們怎麼才能求有這個L1範數的損失函數極小值呢?
OK,本章主角,兩種全新的求極值解法座標軸降低法(coordinate descent)和最小角迴歸法( Least Angle Regression, LARS)該隆重出場了。 ```
座標軸降低法顧名思義,是沿着座標軸的方向去降低,這和梯度降低不一樣。梯度降低是沿着梯度的負方向降低。不過梯度降低和座標軸降低的共性就都是迭代法,經過啓發式的方式一步步迭代求解函數的最小值。
座標軸降低法的數學依據主要是這個結論(此處不作證實):一個可微的凸函數\(J(\theta)\), 其中\(\theta\)是nx1的向量,即有n個維度。若是在某一點\(\overline\theta\),使得\(J(\theta)\)在每個座標軸\(\overline\theta_i\)(i = 1,2,...n)上都是最小值,那麼\(J(\overline\theta_i)\)就是一個全局的最小值。
因而咱們的優化目標就是在\(\theta\)的n個座標軸上(或者說向量的方向上)對損失函數作迭代的降低,當全部的座標軸上的\(\theta_i\)(i = 1,2,...n)都達到收斂時,咱們的損失函數最小,此時的\(\theta\)即爲咱們要求的結果。
下面咱們看看具體的算法過程:
1. 首先,咱們把\(\theta\)向量隨機取一個初值。記爲\(\theta^{(0)}\) ,上面的括號裏面的數字表明咱們迭代的輪數,當前初始輪數爲0.
2. 對於第k輪的迭代。咱們從\(\theta_1^{(k)}\)開始,到\(\theta_n^{(k)}\)爲止,依次求\(\theta_i^{(k)}\)。\(\theta_i^{(k)}\)的表達式以下:
$ \theta_i^{(k)} \in \underbrace{argmin}{\theta_i} J(\theta_1^{(k)}, \theta_2^{(k)}, ... \theta{i-1}^{(k)}, \theta_i, \theta_{i+1}^{(k-1)}, ..., \theta_n^{(k-1)})$
也就是說$ \theta_i^{(k)} \(是使\)J(\theta_1^{(k)}, \theta_2^{(k)}, ... \theta_{i-1}^{(k)}, \theta_i, \theta_{i+1}^{(k-1)}, ..., \theta_n^{(k-1)})\(最小化時候的\)\theta_i\(的值。此時\)J(\theta)\(只有\) \theta_i^{(k)} $是變量,其他均爲常量,所以最小值容易經過求導求得。
若是上面這個式子很差理解,咱們具體一點,在第k輪,\(\theta\)向量的n個維度的迭代式以下:
$ \theta_1^{(k)} \in \underbrace{argmin}_{\theta_1} J(\theta_1, \theta_2^{(k-1)}, ... , \theta_n^{(k-1)})$
$ \theta_2^{(k)} \in \underbrace{argmin}_{\theta_2} J(\theta_1^{(k)}, \theta_2, \theta_3^{(k-1)}... , \theta_n^{(k-1)})$
...
$ \theta_n^{(k)} \in \underbrace{argmin}{\theta_n} J(\theta_1^{(k)}, \theta_2^{(k)}, ... , \theta{n-1}^{(k)}, \theta_n)$
3. 檢查\(\theta^{(k)}\)向量和\(\theta^{(k-1)}\)向量在各個維度上的變化狀況,若是在全部維度上變化都足夠小,那麼\(\theta^{(k)}\)即爲最終結果,不然轉入2,繼續第k+1輪的迭代。
以上就是座標軸降低法的求極值過程,能夠和梯度降低作一個比較:
a) 座標軸降低法在每次迭代中在當前點處沿一個座標方向進行一維搜索 ,固定其餘的座標方向,找到一個函數的局部極小值。而梯度降低老是沿着梯度的負方向求函數的局部最小值。 b) 座標軸降低優化方法是一種非梯度優化算法。在整個過程當中依次循環使用不一樣的座標方向進行迭代,一個週期的一維搜索迭代過程至關於一個梯度降低的迭代。
c) 梯度降低是利用目標函數的導數來肯定搜索方向的,該梯度方向可能不與任何座標軸平行。而座標軸降低法法是利用當前座標方向進行搜索,不須要求目標函數的導數,只按照某一座標方向進行搜索最小值。 d) 二者都是迭代方法,且每一輪迭代,都須要O(mn)的計算量(m爲樣本數,n爲係數向量的維度)
第四節介紹了座標軸降低法求解Lasso迴歸的方法,此處再介紹另外一種經常使用方法, 最小角迴歸法(Least Angle Regression, LARS)。
在介紹最小角迴歸前,咱們先看看兩個預備算法,好吧,這個算法真沒有那麼好講。
第一個預備算法是前向選擇(Forward Selection)算法。
前向選擇算法的原理是是一種典型的貪心算法。要解決的問題是對於:
\(\mathbf{Y = X\theta}\)這樣的線性關係,如何求解係數向量\(\mathbf{\theta}\)的問題。其中\(\mathbf{Y}\)爲 mx1的向量,\(\mathbf{X}\)爲mxn的矩陣,\(\mathbf{\theta}\)爲nx1的向量。m爲樣本數量,n爲特徵維度。
把 矩陣\(\mathbf{X}\)看作n個mx1的向量\(\mathbf{X_i}\)(i=1,2,...n),在\(\mathbf{Y}\)的\(\mathbf{X}\)變量\(\mathbf{X_i}\)(i =1,2,...m)中,選擇和目標\(\mathbf{Y}\)最爲接近(餘弦距離最大)的一個變量\(\mathbf{X_k}\),用\(\mathbf{X_k}\)來逼近\(\mathbf{Y}\),獲得下式:
\(\overline{\mathbf{Y}} = \mathbf{X_k\theta_k}\)
其中:
\[ \mathbf{\theta_k}= \mathbf{\frac{<;X_k, Y>;}{||X_k||_2}} \]
即:$\overline{\mathbf{Y}}$ 是 $$ \mathbf{Y} $$ 在 $$ \mathbf{X_k} $$ 上的投影。那麼,能夠定義殘差(residual): $\mathbf{Y_{yes}} = \mathbf{Y - \overline{Y}}$。因爲是投影,因此很容易知道 $\mathbf{Y_{yes}} 和\mathbf{X_k}$是正交的。再以$\mathbf{Y_{yes}}$爲新的因變量,去掉$\mathbf{X_k}$後,剩下的自變量的集合$\mathbf{X_i}$,i=1,2,3...k−1,k+1,...n}爲新的自變量集合,重複剛纔投影和殘差的操做,直到殘差爲0,或者全部的自變量都用完了,才中止算法。``` <img alt="" height="185" src="http://www.chenyoude.com/機器學習/1313880015.png?x-oss-process=style/watermark" width="558"/>
當\(\mathbf{X}\)只有2維時,例子如上圖,和\(\mathbf{Y}\)最接近的是\(\mathbf{X_1}\),首先在\(\mathbf{X_1}\)上面投影,殘差如上圖長虛線。此時\(X_1\theta_1\)模擬了\(\mathbf{Y}\),\(\theta_1\)模擬了\(\mathbf{ \theta}\)(僅僅模擬了一個維度)。接着發現最接近的是\(\mathbf{X_2}\),此時用殘差接着在\(\mathbf{X_2}\)投影,殘差如圖中短虛線。因爲沒有其餘自變量了,此時\(X_1\theta_1+X_2\theta_2\)模擬了\(\mathbf{Y}\),對應的模擬了兩個維度的\(\theta\)即爲最終結果,此處\(\theta\)計算設計較多矩陣運算,這裏不討論。
此算法對每一個變量只須要執行一次操做,效率高,速度快。但也容易看出,當自變量不是正交的時候,因爲每次都是在作投影,全部算法只能給出一個局部近似解。所以,這個簡單的算法太粗糙,還不能直接用於咱們的Lasso迴歸。
第二個預備算法是前向梯度(Forward Stagewise)算法。
前向梯度算法和前向選擇算法有相似的地方,也是在\(\mathbf{Y}\)的\(\mathbf{X}\)變量\(\mathbf{X_i}\)(i =1,2,...n)中,選擇和目標\(\mathbf{Y}\)最爲接近(餘弦距離最大)的一個變量\(\mathbf{X_k}\),用\(\mathbf{X_k}\)來逼近\(\mathbf{Y}\),可是前向梯度算法不是粗暴的用投影,而是每次在最爲接近的自變量\(\mathbf{X_t}\)的方向移動一小步,而後再看殘差\(\mathbf{Y_{yes}}\)和哪一個\(\mathbf{X_i}\)(i =1,2,...n)最爲接近。此時咱們也不會把\(\mathbf{X_t}\) 去除,由於咱們只是前進了一小步,有可能下面最接近的自變量仍是\(\mathbf{X_t}\)。如此進行下去,直到殘差$\mathbf{Y_{yes}} $減少到足夠小,算法中止。
當$\mathbf{X}$只有2維時,例子如上圖,和$\mathbf{Y}$最接近的是$\mathbf{X_1}$,首先在$\mathbf{X_1}$上面走一小段距離,此處$\varepsilon$爲一個較小的常量,發現此時的殘差仍是和\$\mathbf{X_1}$最接近。那麼接着沿$\mathbf{X_1}$走,一直走到發現殘差不是和$\mathbf{X_1}$最接近,而是和$\mathbf{X_2}$最接近,此時殘差如上圖長虛線。接着沿着$\mathbf{X_2}$走一小步,發現殘差此時又和$\mathbf{X_1}$最接近,那麼開始沿着$\mathbf{X_1}$走,走完一步後發現殘差爲0,那麼算法中止。此時$\mathbf{Y}$由剛纔全部的全部步相加而模擬,對應的算出的係數$\theta$即爲最終結果。此處$\theta$計算設計較多矩陣運算,這裏不討論。``` 當算法在$\varepsilon$很小的時候,能夠很精確的給出最優解,固然,其計算的迭代次數也是大大的增長。和前向選擇算法相比,前向梯度算法更加精確,可是更加複雜。``` 有沒有折中的辦法能夠綜合前向梯度算法和前向選擇算法的優勢,作一個折中呢?有!這就是終於要出場的最小角迴歸法。 ## 5.3 最小角迴歸(Least Angle Regression, LARS)算法 好吧,最小角迴歸(Least Angle Regression, LARS)算法終於出場了。最小角迴歸法對前向梯度算法和前向選擇算法作了折中,保留了前向梯度算法必定程度的精確性,同時簡化了前向梯度算法一步步迭代的過程。具體算法是這樣的: 首先,仍是找到與因變量$\mathbf{Y}$最接近或者相關度最高的自變量$\mathbf{X_k}$,使用相似於前向梯度算法中的殘差計算方法,獲得新的目標$\mathbf{Y_{yes}}$,此時不用和前向梯度算法同樣小步小步的走。而是直接向前走直到出現一個$\mathbf{X_t}$,使得$\mathbf{X_t}$和$\mathbf{Y_{yes}}$的相關度和$\mathbf{X_k}$與$\mathbf{Y_{yes}}$的相關度是同樣的,此時殘差$\mathbf{Y_{yes}}$就在$\mathbf{X_t}$和$\mathbf{X_k}$的角平分線方向上,此時咱們開始沿着這個殘差角平分線走,直到出現第三個特徵$\mathbf{X_p}$和$\mathbf{Y_{yes}}$的相關度足夠大的時候,即$\mathbf{X_p}$到當前殘差$\mathbf{Y_{yes}}$的相關度和$\theta_t$,$\theta_k$與$\mathbf{Y_{yes}}$的同樣。將其也叫入到$\mathbf{Y}$的逼近特徵集合中,並用$\mathbf{Y}$的逼近特徵集合的共同角分線,做爲新的逼近方向。以此循環,直到$\mathbf{Y_{yes}}$足夠的小,或者說全部的變量都已經取完了,算法中止。此時對應的係數$\theta$即爲最終結果。 <img alt="" height="172" src="http://www.chenyoude.com/機器學習/248904037.png?x-oss-process=style/watermark" width="402"/> 當$\theta$只有2維時,例子如上圖,和$\mathbf{Y}$最接近的是$\mathbf{X_1}$,首先在$\mathbf{X_1}$上面走一段距離,一直到殘差在$\mathbf{X_1}$和$\mathbf{X_2}$的角平分線上,此時沿着角平分線走,直到殘差最夠小時中止,此時對應的係數$\beta$即爲最終結果。此處$\theta$計算設計較多矩陣運算,這裏不討論。 最小角迴歸法是一個適用於高維數據的迴歸算法,其主要的優勢有: 1)特別適合於特徵維度n 遠高於樣本數m的狀況。 2)算法的最壞計算複雜度和最小二乘法相似,可是其計算速度幾乎和前向選擇算法同樣 3)能夠產生分段線性結果的完整路徑,這在模型的交叉驗證中極爲有用 主要的缺點是: 因爲LARS的迭代方向是根據目標的殘差而定,因此該算法對樣本的噪聲極爲敏感。 # 總結 Lasso迴歸是在ridge迴歸的基礎上發展起來的,若是模型的特徵很是多,須要壓縮,那麼Lasso迴歸是很好的選擇。通常的狀況下,普通的線性迴歸模型就夠了。 另外,本文對最小角迴歸法怎麼求具體的$\theta$參數值沒有說起,僅僅涉及了原理,若是對具體的算計推導有興趣,能夠參考Bradley Efron的論文《Least Angle Regression》,網上很容易找到。 (歡迎轉載,轉載請註明出處。歡迎溝通交流: 微信:nickchen121)
```