线性回归大结局(岭(Ridge)、 Lasso回归原理、公式推导),你想要的这里都有
本文已参与「新人创作礼」活动,一起开启掘金创作之路。
线性模型简介
所谓线性模型就是通过数据的线性组合来拟合一个数据,比如对于一个数据
来预测
所谓解释性简单一点来说就是知道模型哪个属性更加重要,比如说对于上述表达式来说,就意味着对于身高来说体重的因素比较大,体重更加重要,这个例子纯为了解释为什么线性模型有很好的解释性,可能不够严谨。对于线性模型来说,旨在学习到所有的
普通线性回归
对于一个数据集
其中
不妨设如下表达式,我们的目标就是让
即 :
为了方便使用一个式子表示整个表达式,不妨令 :
上述表达式用矩阵形式表示为 :
简写为 :
现在需要来衡量模型的输出和真实值之间的差异,我们这里使用均方误差
像这种基于最小化
现在我们将他们用矩阵来表示 其中 :
其中
那容易得出,对于整个数据集的误差为
现在来仔细分析一下公式
二范数平方为:
所以就有了
所以根据矩阵乘法就有:
根据上面的分析最终就得到了模型的误差:
现在就需要最小化模型的误差,即优化问题,易知
我们现在要对上述公式进行求导,我们先来推导一下矩阵求导法则,请大家扶稳坐好😎😎:
公求导式法则一:
证明:
不妨设:
当我们在对
由上述分析可知:
公求导式法则二:
当
公求导式法则三:
当
上面公式同理可以证明,在这里不进行赘述了。
有公式
即
Ridge(岭)回归
写在前面:对于一个矩阵
根据上面的推导,在由公式
对于上述
则对
当
除了上面提到的
为什么正则化惩罚项Work?
上面谈到模型出现过拟合的现象,而加上
如果需要拟合的话,下面的结果应该是最好的,即一个正弦函数:
下图是一个过拟合的情况:
我们可以观察一下它真实规律正弦曲线的之间的差异:过拟合的曲线将每个点都考虑到了,因此他会有一个非常大的缺点就是”突变“,即曲线的斜率的绝对值非常大,如:
对于一般的一次函数
Lasso回归
岭回归是在损失函数中加一个
对公式
其中
线性回归实现过程
上面提到
Ridge回归和Lasso回归区别
上面谈到了
和 都可以在一定程度上防止模型过拟合 在数据个数小于数据维度的时候比较适合 的数据的属性之间有共线性的时候比较适合 会限制参数的大小,使他逼近于0 是一种稀疏模型,可以做特征选择
为什么
Ridge和Lasso对权值的影响
在正式讨论这个问题之间我们首先先来分析不同的权值所对应的
对于一个只有两个属性的数据,对不同的权值计算整个数据集在相应权值下的
对于一个只有两个属性的数据,他的参数为
比如我们有两个属性
即我们要求的权值
下面就是具体的生成过程:
- 首先先生成一个随机数据集
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()
我们最终需要求的
我们从上面的图很容易看出,最终两个权值的取值不会为0(如果为0他们的交点会在x或者y轴上),而是会随着权值的缩小而不断变小,即图中蓝色部分变小。同理我们也可以对
从上图可以看出
以上就是本篇文章的所有内容了,我是LeHung,我们下期再见!!!更多精彩内容合集可访问项目:https://github.com/Chang-LeHung/CSCore
关注公众号:一无是处的研究僧,了解更多计算机(Java、Python、计算机系统基础、算法与数据结构)知识。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?