線性迴歸大結局(嶺(Ridge)、 Lasso迴歸原理、公式推導),你想要的這裏都有

語言: CN / TW / HK

本文已參與「新人創作禮」活動,一起開啟掘金創作之路。

線性模型簡介

所謂線性模型就是通過數據的線性組合來擬合一個數據,比如對於一個數據 \(X\)

\[X = (x_1, x_2, x_3, ...,x_n) \tag{1} \]

\[Y = f(X) = a_1x_1 + a_2x_2 + ... a_nx_n + b \tag{2} \]

來預測 \(Y\) 的數值。例如對於人的兩個屬性 (鞋碼,體重) 來預測 身高 。從上面來看線性模型的表達式簡單、比較容易建模,但是卻有很好的解釋性。比如 身高 \((H)\) 和鞋碼 \((S)\) 、體重 \((W)\) 的關係:

\[H=0.3*S + 0.7*W + 20 \tag{3} \]

所謂解釋性簡單一點來説就是知道模型哪個屬性更加重要,比如説對於上述表達式來説,就意味着對於身高來説體重的因素比較大,體重更加重要,這個例子純為了解釋為什麼線性模型有很好的解釋性,可能不夠嚴謹。對於線性模型來説,旨在學習到所有的 \(a_i, b\) ,即模型的參數。

普通線性迴歸

對於一個數據集

\[Dataset = \{ (x_1, y_1), (x_2, y_2), (x_3, y_3), ..., (x_n, y_n) \} \ \ , \ y_i \in R \tag{4} \]

其中 \(x_i\) , 可能含有多個屬性,如 \(x_i\)\(m\) 個屬性時, 即 \(x_i = (x_{i1}, x_{i2}, ..., x_{im})\)\(y_i\) 是一個實數值。線性迴歸需要做的事就是需要找到一套參數儘可能的使得模型的輸出跟 \(y_i\) 接近。

不妨設如下表達式,我們的目標就是讓 \(f(x_i)\) 越靠近真實的 $y_i $越好。

\[f(x_i) = a_1x_{i1} + a_2x_{i2} + ... + a_mx_{im} + b \tag{5} \]

即 :

\[f(x_i) = b + \sum_{j = 1}^{m}a_jx_{ij} \tag{6} \]

為了方便使用一個式子表示整個表達式,不妨令 :

\[x_i = (x_{i1}, x_{i2}, ..., x_{im}, 1) \tag{7} \]

\[\hat{w} = (a_1, a_2, ..., a_m, b)^T \tag{8} \]

上述表達式用矩陣形式表示為 :

\[\left[ \begin{matrix} x_{i1} & x_{i2} & x_{i3} & ... & x_{i(m - 1)} & x_{im} & 1\end{matrix} \right] \cdot \left[\begin{matrix} a_1 \\ a_2 \\ a_3 \\ .\\.\\. \\ a_{m-1} \\ a_m \\ b\end{matrix} \right] = f(x_i) \tag{9} \]

簡寫為 :

\[f(x_i) = x_i\cdot \hat{w} \tag{10} \]

現在需要來衡量模型的輸出和真實值之間的差異,我們這裏使用均方誤差 \(MSE(Mean\ Squared\ Error)\) 來衡量,即對於 \(y_i\) 來説誤差為:

\[\mathcal{l_i} = (f(x_i) - y_i)^2 \tag{11} \]

像這種基於最小化 \(MSE\) 來求解模型參數的方法叫做最小二乘法。對於整個數據集來説他的誤差為 \(\mathcal{L}\)

\[\mathcal{L} = \sum_{i = 1}^{n}(f(x_i) - y_i)^2\ \tag{12} \]

現在我們將他們用矩陣來表示 其中 :

\[Y = (y_1, y_2, y_3, ..., y_{n - 2}, y_{n - 1}, y_{n})^T = \left[\begin{matrix}y_1 \\ y_2 \\ y_3 \\ . \\. \\. \\ y_{n - 2} \\ y_{n - 1}\\ y_{n}\end{matrix}\right] \tag{13} \]

\[X = (x_1; ...; x_n)= (x_1, ..., x_n)^T = \left[\begin{matrix}x_1 \\ x_2 \\ . \\. \\. \\ x_{n-1}\\ x_{n}\end{matrix}\right]= \left[\begin{matrix}x_{11} & x_{12} & x_{13} & . .. & x_{1m} &1& \\ x_{21} & x_{22} & x_{23} & ... & x_{2m} &1& \\ . & . & . & . & . &.\\. & . & . & . & . &. \\ . & . & . & . & . &. \\ x_{(n - 1)1} & x_{(n - 1)2} & x_{(n - 1)3} & ... & x_{(n - 1)m} &1\\ x_{n1} & x_{n2} & x_{n3} & ... & x_{nm} & 1\end{matrix}\right] \tag{14} \]

\[f(X) = \left[\begin{matrix}x_{11} & x_{12} & x_{13} & . .. & x_{1m} &1& \\ x_{21} & x_{22} & x_{23} & ... & x_{2m} &1& \\ . & . & . & . & . &.\\. & . & . & . & . &. \\ . & . & . & . & . &. \\ x_{(n - 1)1} & x_{(n - 1)2} & x_{(n - 1)3} & ... & x_{(n - 1)m} &1\\ x_{n1} & x_{n2} & x_{n3} & ... & x_{nm} & 1\end{matrix}\right] \cdot \left[\begin{matrix} a_1 \\ a_2 \\ a_3 \\ .\\.\\. \\ a_{m-1} \\ a_m \\ b\end{matrix} \right] = \left[\begin{matrix} x_1\hat{w} \\ x_2\hat{w} \\ x_3\hat{w} \\ .\\.\\. \\ x_{n-2}\hat{w} \\ x_{n - 1}\hat{w} \\ x_{n}\hat{w}\end{matrix} \right] = \left[\begin{matrix}\hat{y}_1\\ \hat{y}_2\\ \hat{y}_3\\ \\.\\.\\.\\\hat{y}_{n-2}\\\hat{y}_{n-1}\\\hat{y}_n\\ \end{matrix}\right] \tag{15} \]

其中 \(\hat{y}_i\) 是模型的預測值 \(y_i\) 是數據的真實值, \(m\) 是一條數據 \(x_i\) 的屬性的個數。現在來梳理一下數據的維度:

\[X : n\times (m+1) \\ \hat{w} : (m+1)\times 1\\ Y : n\times 1 \\ f(X) : n\times 1 \]

那容易得出,對於整個數據集的誤差為 \(\mathcal{L}(w, b)\)

\[\mathcal{L}(w, b) = \mathcal{L}({\hat{w}}) = \sum_{i=1}^{n}( \hat{y} - y_i)^2 = \sum_{i=1}^{n}(x_i\hat{w}-y_i)^2 = ||X\hat{w}-Y||_2^2 = (X\hat{w}-Y)^T(X\hat{w}-Y) \tag{16} \]

\[x_i = (x_{i1}, x_{i2}, ..., x_{im}, 1)\\ \hat{w} = (a_1, a_2, ..., a_m, b)^T \]

現在來仔細分析一下公式 \((16)\) ,首先對於一個 \(1\times n\) 或者 \(n \times 1\) 向量來説,它的二範數為:

\[||x||_2 = \sqrt{\sum_{i=1}^{n}x_i^2} \]

二範數平方為:

\[||x||_2^2 = \sum_{i=1}^{n}x_i^2 \]

所以就有了 \(\sum_{i=1}^{n}(X\hat{w}-Y)^2 = ||Y-X\hat{w}||_2^2\) , 那麼對於公式 \((16)\) 來説 \(X\hat{w}-Y\) 是一個 \(n\times 1\) 的向量:

\[X\hat{w}-Y = \left[\begin{matrix}\hat{y}_1 - y_1 \\ \hat{y}_2 - y_2 \\.\\.\\.\\\hat{y}_{n-1} - y_{n-1} \\\hat{y}_{n}- y_{n} \end{matrix}\right] \]

所以根據矩陣乘法就有:

\[(X\hat{w} - Y)^T(X\hat{w} - Y)=\left[\begin{matrix} \hat{y}_1 - y_1 ,&..., &\hat{y}_{n} - y_{n} \end{matrix}\right]\cdot \left[\begin{matrix}\hat{y}_1 - y_1 \\\hat{y}_2 - y_2 \\.\\.\\.\\\hat{y}_{n-1} - y_{n-1} \\\hat{y}_{n} - y_{n} \end{matrix}\right] = \sum_{i=1}^{n}(\hat{y}- y_i )^2 \tag{17} \]

根據上面的分析最終就得到了模型的誤差:

\[\mathcal{L}(w, b) = \mathcal{L(\hat{w})} = ||X\hat{w} - Y||_2^2 = (X\hat{w} - Y)^T(X\hat{w} - Y) \tag{18} \]

現在就需要最小化模型的誤差,即優化問題,易知 \(\mathcal{L(w, b)}\) 是一個關於 \(\hat{w}\) 的凸函數,則當它關於 \(\hat{w}\) 導數為0時求出的 \(\hat{w}\)\(\hat{w}\) 的最優解。這裏不對其是凸函數進行解釋,如果有時間以後專門寫一篇文章來解讀。現在就需要對 \(\hat{w}\) 進行求導。

\[\mathcal{L(\hat{w})} = ||X\hat{w} - Y||_2^2 = (X\hat{w} - Y)^T(X\hat{w} - Y) \]

\[= ((X\hat{w})^T - Y^T)(X\hat{w} - Y) = (\hat{w}^TX^T - Y^T)(X\hat{w} - Y) \]

\[=\hat{w}^TX^TX\hat{w} - \hat{w}^TX^TY - Y^TX\hat{w} + Y^TY \]

我們現在要對上述公式進行求導,我們先來推導一下矩陣求導法則,請大家扶穩坐好:sunglasses::sunglasses::

公求導式法則一:

\(\forall\) 向量 \(A:1 \times n\) , \(X: n \times 1, Y=A\cdot X\) ,則 \(\frac{\partial Y}{\partial X} = A^T\) ,其中 \(Y\) 是一個實數值。

證明:

不妨設:

\[A = (a_1, a_2, a_3, ..., a_n) \]

\[X = (x_1, x_2, x_3, ..., x_n)^T \]

\[\therefore Y = (a_1, a_2, a_3, ..., a_n)\cdot \left[\begin{matrix} x_1\\x_2\\x_3\\.\\.\\.\\x_n\end{matrix}\right] = \sum_{i = 1}^{n}a_ix_i \]

當我們在對 \(x_i\) ,求導的時候其餘 \(x_j, j \neq i\) ,均可以看做常數,則:

\[\frac{\partial Y}{\partial x_i} = 0 + ...+0 + a_i + 0 +... + 0 \]

\[\therefore \frac{\partial Y}{\partial X} = \left[\begin{matrix}\frac{\partial Y}{\partial x_1}\\ \frac{\partial Y}{\partial x_2}\\.\\.\\.\\ \frac{\partial Y}{\partial x_{n-1}}\\\frac{\partial Y}{\partial x_n}\\\end{matrix}\right] = \left[\begin{matrix}a_1\\ a_2\\.\\.\\.\\a_{n-1}\\ a_n\end{matrix}\right] = (a_1, a_2, a_3, ..., a_n)^T = A^T \]

由上述分析可知:

\[\frac{\partial Y}{\partial X} = A^T \]

公求導式法則二:

\(Y = X^TA\) ,其中 \(X:n\times 1, A:n\times 1\) ,則 \(\frac{\partial Y}{\partial X} = A\)

公求導式法則三:

\(Y = X^TAX\) ,其中 \(X:1\times n, A : n\times n\) ,則 \(\frac{\partial Y}{\partial X} = (A^T + A)X\)

上面公式同理可以證明,在這裏不進行贅述了。

\[\mathcal{L(\hat{w})} =\hat{w}^TX^TX\hat{w} - \hat{w}^TX^TY - Y^TX\hat{w} + Y^TY \tag{19} \]

有公式 \((19)\) 和上面求導法則可知:

\[\frac{\partial \mathcal{L(\hat{w})}}{\partial \hat{w}} = ((X^TX)^T + X^TX)\hat{w} - X^TY - (Y^TX)^T\\ = 2X^TX\hat{w} - 2X^TY = 2X^T(X\hat{w} - Y) = 0 \]

\[X^TX\hat{w} = X^TY \tag{20} \]

\[\therefore \hat{w}^* = (X^TX)^{-1}X^TY \tag{21} \]

\(\hat{w}^* = (X^TX)^{-1}X^TY\) 為我們要求的參數。

Ridge(嶺)迴歸

寫在前面:對於一個矩陣 \(A_{n\times n}\) 來説如果想它的逆矩陣那麼 \(A\) 的行列式必然不為0,且矩陣 \(A\) 是一個滿秩矩陣,即 \(r(A)=n\)

根據上面的推導,在由公式 \((20)\)\((21)\) 是等式兩遍同時乘了 \(X^TX\) 的逆矩陣,但是實際情況中,矩陣的逆可能是不存在的,當矩陣 \(X^TX : n\times n\) 不是滿秩矩陣的時候,即 \(r(X^TX) < n\)\(X^TX\) 行列式為 0時, \((X^TX)^{-1}\) 不存在。一種常見的情況是,當 \(x\) 的的樣本數據小於他的維數的時候,即對於 \(X\) 來説 \(n<m\) ,那麼 \(r(X) < m\) ,又根據矩陣性質 \(r(X) = r(X^T) = r(X^TX)\) ,可以得到 \(r(X^TX) < m\) ,那麼 \(X^TX\) 不滿秩,則 \((X^TX)^{-1}\) 不存在。

對於上述 \((X^TX)^{-1}\) 不存在的情況一種常見的解決辦法就是在損失函數 \(\mathcal{L(\hat{w})}\) 後面加一個 \(L_2\) 正則化懲罰項:

\[\mathcal{L(\hat{w})} = ||X\hat{w} - Y||_2^2 + \lambda||\hat{w}||_2^2 = (X\hat{w} - Y)^T(X\hat{w} - Y) + \lambda\hat{w}^T\hat{w} \tag{22} \]

則對 \(\hat{w}\) 求導有:

\[\frac{\partial \mathcal{L(\hat{w})}}{\partial \hat{w}} = 2X^TX\hat{w} - 2X^TY + 2\lambda\hat{w} = 0 \tag{23} \]

\[(X^TX+\lambda E)\hat{w} = X^TY \]

\(X^TX\) 不滿秩的時候,其行列式為0,加上 \(\lambda E\) 之後可以使得 \(X^TX+\lambda E\) 行列是不為0,所以 \((X^TX+\lambda E)^{-1}\) 存在則:

\[\hat{w} = (X^TX+\lambda E)^{-1}X^TY \tag{24} \]

除了上面提到的 \(X^TX\) 不滿秩的情況,還有一種常見的就是數據之間的共線性的問題,它也會導致 \(X^TX\) 的行列式為0,即 \(X^TX\) 不滿秩。簡單來説就是數據的其中的一個屬性和另外一個屬性有某種線性關係,也就是説這兩個屬性就相當於一個屬性,因為其中一個屬性可以用另外一個屬性線性表示。這會讓模型再訓練的時候導致過擬合,因為模型再訓練的時候不會去關心屬性之間是否具有線性關係,模型只會不加思考的去降低整個模型的損失,即 \(MSE\) ,這會讓模型捕捉不到數據之間的關係,而只是單純的去降低訓練集的 \(MSE\) 。而你如果只是單純的去降低你訓練集的 \(MSE\) 的時候,沒有捕捉到數據的規律,那麼模型再測試集上會出現比較差的情況,即模型會出現過擬合的現象。

為什麼正則化懲罰項Work?

上面談到模型出現過擬合的現象,而加上 \(L_2\) 損失可以一直過擬合現象,我在這裏簡單給大家説説我得觀點,不一定正確,希望可以幫助大家理解為什麼 \(L_2\) 懲罰項可以在一定程度上抑制過擬合現象。首先看一下真實數據:

如果需要擬合的話,下面的結果應該是最好的,即一個正弦函數:

下圖是一個過擬合的情況:

我們可以觀察一下它真實規律正弦曲線的之間的差異:過擬合的曲線將每個點都考慮到了,因此他會有一個非常大的缺點就是”突變“,即曲線的斜率的絕對值非常大,如:

對於一般的一次函數 \(y = ax + b\) 來説,當 \(a\) 很大的時候,斜率會很大,推廣到複雜模型也是一樣的,當模型參數很大的時候模型可能會發生劇烈的變化,即可能發生過擬合現象。現在我們來看為什麼在線性迴歸中加入了一個 \(L_2\) 懲罰項會減少過擬合的現象。因為在損失函數中有權重的二範數的平方,當權重過大的時候模型的損失就會越大,但是模型需要降低損失,那麼就需要降低權重的值,權重的值一旦低下來,突變的可能性就會變小,因此在一定程度上可以抑制過擬合現象。而參數 \(\alpha\) 就是來調控權重在損失中的比例,當 \(\lambda\) 越大的時候對權重懲罰的越狠,這在實際調參的過程中需要了解。後面的 \(Lasso\) 迴歸參數 \(\alpha\) 的意義也是相似的。

Lasso迴歸

嶺迴歸是在損失函數中加一個 \(L_2\) 損失,而 \(Lasso\) 迴歸是在損失函數 \(\mathcal{L(\hat{w})}\) 後面加一個 \(L_1\) 的損失,即:

\[\mathcal{L(\hat{w})} = ||X\hat{w} - Y||_2^2 + \alpha\sum_{j=0}^{m}|{\hat{w}}_j| \tag{25} \]

對公式 \((25)\) 求導:

\[\frac{\partial \mathcal{L(\hat{w})}}{\partial \hat{w}} = 2X^TX\hat{w} - 2X^TY + \alpha C = 0 \tag{26}\\ \]

\[\left\{\begin{matrix}c_i = -1\ ,\ if\ \hat{w}_i < 0;\\ c_i = 1\ ,\ if\ \hat{w}_i \ge 0;\\\end{matrix}\right. \]

其中 \(C\) 是和 \(\hat{w}\) 同維度的向量。則可以得到:

\[\hat{w} = (X^TX)^{-1}(X^TY-\frac{\alpha}{2} C)\tag{27} \]

線性迴歸實現過程

上面提到 \(\mathcal{L(w, b)}\) 是一個關於 \(\hat{w}\) 的凸函數,則當它關於 \(\hat{w}\) 導數為0時求出的 \(\hat{w}\)\(\hat{w}\) 的最優解,因此在編碼實現線性迴歸的過程中,如果數據集比較小可以直接將所有的數據同時進行計算,節省計算資源,因為只需要計算一次 \(\hat{w}\) 的導數。但是如果數據量過大的話,計算無法一次性完成,可以使用隨機梯度下降法,或者其他的優化算法,進行多次迭代學習,得到最終的結果。

Ridge迴歸和Lasso迴歸區別

上面談到了 \(Ridge\)\(Lasso\) 的具體的實現方法,還簡要談到了 \(Ridge\) 可以有效防止模型過擬合,和他在數據個數小於數據維度的時候的使用。那麼都是增加一個懲罰項,那麼 \(Ridge\)\(Lasso\) 有什麼區別呢?

  • \(Ridge\)\(Lasso\) 都可以在一定程度上防止模型過擬合
  • \(Ridge\) 在數據個數小於數據維度的時候比較適合
  • \(Lasso\) 的數據的屬性之間有共線性的時候比較適合
  • \(Ridge\) 會限制參數的大小,使他逼近於0
  • \(Lasso\) 是一種稀疏模型,可以做特徵選擇

為什麼 \(Lasso\) 是一種稀疏模型,因為它在訓練的過程中可以使得權重 \(\hat{w}\) 中的某些值變成0(稀疏權重),如果一個屬性對應的權重為0,那麼該屬性在最終的預測當中並沒有發揮作用,這就相當與模型選擇了部分屬性(他們你的權重不為0)。我們很容易知道既然這些屬性對應的權值為0,即他對於模型來説並不重要,模型只選擇了些權重不為0的屬性,所以説 \(Lasso\) 可以做特徵選擇。而 \(Ridge\) 也會不斷降低權值的大小,但是他不會讓權值變成0,只會不斷的縮小權值,使其逼近於0。

Ridge和Lasso對權值的影響

在正式討論這個問題之間我們首先先來分析不同的權值所對應的 \(RSS\) (殘差平方和)值是多少。 \(RSS\) 的定義如下:

\[RSS = \sum_{i=0}^{n}(x_i\hat{w} - y_i)^2 \]

對於一個只有兩個屬性的數據,對不同的權值計算整個數據集在相應權值下的 \(RSS\) 。然後將 \(RSS\) 值相等的點連接起來做成一個等高線圖,看看相同的 \(RSS\) 值下權值圍成了一個什麼圖形。

對於一個只有兩個屬性的數據,他的參數為 \(\hat{w} = (\hat{w_1}, \hat{w_2})\) ,然後計算在參數 \(\hat{w}\) 的情況下,計算整個數據集的 \(RSS\) :數據點的座標就是 \((\hat{w}_1, \hat{w}_2)\) ,等高線的高度就是 \(RSS\)

比如我們有兩個屬性 \(x_1, x_2\) 它們有一個線性組合 \(y = 0.2 * x1 + 0.1 * x2\) 很容易直到 \(y\)\(x_1, x_2\) 之間是一個線性組合關係:

\[y = \left[\begin{matrix} x_1, x_2\end{matrix}\right] \cdot \left[\begin{matrix} 0.2 \\ 0.1\end{matrix}\right] \]

即我們要求的權值 \(\hat{w} = \left[\begin{matrix} 0.2 \\ 0.1\end{matrix}\right]\) 因為和真實值一樣,所以它對應的 \(RSS\) 為0。我們現在要做的就是針對不同的 \(\hat{w}\) 的取值去計算其所對應的 \(RSS\) 值。比如説 \(\hat{w}\) 取到下面圖中的所有的點。然後去計算這些點對應的 \(RSS\) ,然後將 \(RSS\) 值作為等高線圖中點對應的高,再將 \(RSS\) 相同的點連接起來就構成了等高線圖。

下面就是具體的生成過程:

  • 首先先生成一個隨機數據集
import numpy as np
from matplotlib import pyplot as plt
import matplotlib as mpl
plt.style.use("ggplot")

x1 = np.linspace(0, 20, 20)
x2 = np.linspace(-10, 10, 20)
y = .2 * x1 + .1 * x2
# y 是 x1 和 x2的線性組合 所以我們最終線性迴歸要求的參數為 [0.2, 0.1]
x1:
array([ 0.        ,  1.05263158,  2.10526316,  3.15789474,  4.21052632,
        5.26315789,  6.31578947,  7.36842105,  8.42105263,  9.47368421,
       10.52631579, 11.57894737, 12.63157895, 13.68421053, 14.73684211,
       15.78947368, 16.84210526, 17.89473684, 18.94736842, 20.        ])
x2:
array([-10.        ,  -8.94736842,  -7.89473684,  -6.84210526,
        -5.78947368,  -4.73684211,  -3.68421053,  -2.63157895,
        -1.57894737,  -0.52631579,   0.52631579,   1.57894737,
         2.63157895,   3.68421053,   4.73684211,   5.78947368,
         6.84210526,   7.89473684,   8.94736842,  10.        ])
# 先將 x1 x2 進行拼接
data = np.vstack((x1, x2)).T
data:
array([[  0.        , -10.        ],
       [  1.05263158,  -8.94736842],
       [  2.10526316,  -7.89473684],
       [  3.15789474,  -6.84210526],
       [  4.21052632,  -5.78947368],
       [  5.26315789,  -4.73684211],
       [  6.31578947,  -3.68421053],
       [  7.36842105,  -2.63157895],
       [  8.42105263,  -1.57894737],
       [  9.47368421,  -0.52631579],
       [ 10.52631579,   0.52631579],
       [ 11.57894737,   1.57894737],
       [ 12.63157895,   2.63157895],
       [ 13.68421053,   3.68421053],
       [ 14.73684211,   4.73684211],
       [ 15.78947368,   5.78947368],
       [ 16.84210526,   6.84210526],
       [ 17.89473684,   7.89473684],
       [ 18.94736842,   8.94736842],
       [ 20.        ,  10.        ]])
x_max = 0.5
points = 5000
xx, yy = np.meshgrid(np.linspace(-x_max, x_max, points), np.linspace(-x_max, x_max, points))
zz = np.zeros_like(xx)
for i in range(points):
    for j in range(points):
        beta = np.array([xx[i][j], yy[i][j]]).T
        rss = ((data@beta - y) ** 2).sum()
        zz[i][j] = rss
plt.contour(xx, yy, zz, levels=30, cmap=plt.cm.Accent, linewidths=1)
sns.scatterplot(x=[0, 0.2], y=[0, 0.1], s=10)
plt.text(x=0.2, y=0.1, s=r"$\hat{w}(0.2, 0.1)$", fontdict={"size":8})
plt.text(x=0, y=0, s=r"$O(0, 0)$", fontdict={"size":8})
plt.xlim(-.2,.5)
plt.xlabel(r"$\hat{w}_1$")
plt.ylabel(r"$\hat{w}_2$")
plt.show()

我們最終需要求的 \(\hat{w}\)\((0.2, 0.1)\) 同時我們也計算了其他位置對應整個數據集的 \(RSS\) 。我麼容易看出等高線都是以 \(\hat{w}(0.2, 0.1)\) 為圓心的橢圓,如果需要證明需要使用數學進行嚴格推到,這裏我們只需要直到它的軌跡是一個橢圓即可,而我們知道

\[{\hat{w}_1^2} +{\hat{w}_1^2}\le C \]

\(||\hat{w}||_2^2\) 的取值範圍是一個圓,因為在嶺迴歸損失函數的式子中有着兩部分,它要同時滿足這兩個條件,那麼他們兩個曲線的交點就是 \(Ridge\) 的權重的取值,如下圖所示:

我們從上面的圖很容易看出,最終兩個權值的取值不會為0(如果為0他們的交點會在x或者y軸上),而是會隨着權值的縮小而不斷變小,即圖中藍色部分變小。同理我們也可以對 \(Lasso\) 迴歸最同樣的事兒:

從上圖可以看出 \(Lasso\) 的權值是可以取到0的,注意是可以取到而不是一定取到,可以取到就説明, \(Lasso\) 迴歸可以在數據集有共線性的時候,對屬性進行選擇,即讓某些屬性對應的權值為0。上面的結論都是在二維情況下產生的,可以推廣到高維數據。以上就説明了在線性迴歸中 \(Ridge\)\(Lasso\) 對權值的影響。

以上就是本篇文章的所有內容了,我是 LeHung ,我們下期再見!!!更多精彩內容合集可訪問項目: https://github.com/Chang-LeHung/CSCore

關注公眾號: 一無是處的研究僧 ,瞭解更多計算機(Java、Python、計算機系統基礎、算法與數據結構)知識。