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


對于一個只有兩個屬性的數據,他的參數為 \(\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\) 相同的點連接起來就構成了等高線圖 。

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

文章插圖
下面就是具體的生成過程:
  • 首先先生成一個隨機數據集
import numpy as npfrom matplotlib import pyplot as pltimport matplotlib as mplplt.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 = https://www.huyubaike.com/biancheng/np.vstack((x1, x2)).Tdata: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.5points = 5000xx, 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]]).Trss = ((data@beta - y) ** 2).sum()zz[i][j] = rssplt.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()
嶺(Ridge 線性回歸大結局、 Lasso回歸原理、公式推導),你想要的這里都有

文章插圖
我們最終需要求的 \(\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\) 的權重的取值,如下圖所示:
嶺(Ridge 線性回歸大結局、 Lasso回歸原理、公式推導),你想要的這里都有

文章插圖
我們從上面的圖很容易看出,最終兩個權值的取值不會為0(如果為0他們的交點會在x或者y軸上) , 而是會隨著權值的縮小而不斷變??,假n賈欣渡糠直湫?。同理我們也可以對 \(Lasso\) 回歸最同樣的事兒:
嶺(Ridge 線性回歸大結局、 Lasso回歸原理、公式推導),你想要的這里都有

文章插圖
從上圖可以看出 \(Lasso\) 的權值是可以取到0的,注意是可以取到而不是一定取到 , 可以取到就說明,\(Lasso\) 回歸可以在數據集有共線性的時候 , 對屬性進行選擇,即讓某些屬性對應的權值為0 。上面的結論都是在二維情況下產生的 , 可以推廣到高維數據 。以上就說明了在線性回歸中 \(Ridge\) 和 \(Lasso\) 對權值的影響 。
以上就是本篇文章的所有內容了,我是LeHung,我們下期再見?。?!更多精彩闹R鶯霞煞夢氏钅浚篽ttps://github.com/Chang-LeHung/CSCore
關注公眾號:一無是處的研究僧,了解更多計算機(Java、Python、計算機系統基礎、算法與數據結構)知識 。

推薦閱讀