岭回归、LASSO回归(包括公式推导)[通俗易懂]

岭回归、LASSO回归(包括公式推导)[通俗易懂]前面的两篇文章比较清楚浅显的介绍了线性回归、多项式回归,并了解到其实多项式回归也可以看作是一种特殊的线性回归形式,也就是说回归的核心就是线性回归。其原理都是最小二乘法,这是一种很简单、很方便的算法,但也有它的局限性,所以本文讲述另外的回归方式岭回归、LASSO回归,作为一个补充,解决最小二乘法的一些缺点。最小二乘法的局限性:                 …

大家好,又见面了,我是你们的朋友全栈君。

前面的两篇文章比较清楚浅显的介绍了线性回归多项式回归,并了解到其实多项式回归也可以看作是一种特殊的线性回归形式,也就是说回归的核心就是线性回归。其原理都是最小二乘法,这是一种很简单、很方便的算法,但也有它的局限性,所以本文讲述另外的回归方式岭回归、LASSO回归,作为一个补充,解决最小二乘法的一些缺点。

最小二乘法的局限性:

                                                            \varpi = (X^{T}X)^{-1}X^{T}Y

上面是最小二乘法的核心算法,通过公式我们可以看到该公式成立的条件就是(X^{T}X)不等于0,也就是(X^{T}X)能求逆(可以用linalg.det(X)等方法判断),而当变量之间的相关性较强(多重共线性),或者m(特征数)大于n(样本数),上式中的X不是满秩矩阵。那就会使得(X^{T}X)的结果趋近于0,造成拟合参数的数值不稳定性增加(参数间的差距变化很大),这也就是普通最小二乘法的局限性。

下面通过希尔伯尔矩阵来验证最小二乘法的局限性(希尔伯特矩阵每列之间存在很强的相关性 ):

"""生成 10x10 的希尔伯特矩阵
"""
from scipy.linalg import hilbert
x = hilbert(10)

"""希尔伯特转置矩阵与原矩阵相乘
"""
import numpy as np
mat = np.linalg.det(np.matrix(x).T*np.matrix(x))  # det计算行列式 dot计算一维内积或多维矩阵相乘
print(mat)	# x.T*x 趋近于0

皮尔逊相关系数通常用于度量两个变量 XY 之间的线性相关程度,其值介于 -11 之间。其中,数值越趋近于 1 表示相关程度越高,反之趋近于 -1 则表示线性相关度越低。

在pandas中提供了直接计算相关系数的方法 .corr(),我们再来验证一下列之间的相关性:

pd.DataFrame(x, columns=['x%d'%i for i in range(1,11)]).corr()

岭回归、LASSO回归(包括公式推导)[通俗易懂]

可以看到,列之间的相关性是相当的大。

综上所示,普通最小二乘法带来的局限性,导致许多时候都不能直接使用其进行线性回归拟合,尤其是下面两种情况:

  • 数据集的列(特征)数量 > 数据量(行数量),即 X 不是列满秩。

  • 数据集列(特征)数据之间存在较强的线性相关性,即模型容易出现过拟合。

岭回归:

岭回归推导:

为了解决上述两种情况出现的问题,岭回归(Ridge Regression)应运而生。岭回归可以被看作为一种改良后的最小二乘法,它通过向损失中添加L_{2}正则项(2-范数)有效防止模型出现过拟合,且有助于解决非满秩条件下求逆困难的问题,从而提升模型的解释能力。岭回归推导过程如下:

岭回归、LASSO回归(包括公式推导)[通俗易懂]

岭回归、LASSO回归(包括公式推导)[通俗易懂]

岭回归、LASSO回归(包括公式推导)[通俗易懂]

减少不重要的参数项,统计学中也叫“缩减”。更深入的解释,可以查看官方一点的文档。

通过scilit-learn提供的方法可以很方便的使用岭回归。

岭回归拟合:

sklearn.linear_model.Ridge(alpha=1.0, fit_intercept=True, normalize=False, copy_X=True, max_iter=None, tol=0.001, solver=’auto’, random_state=None)

  • alpha: 正则化强度,默认为 1.0,对应公式中的 λ。正则化强度; 必须是正浮点数。 正则化改善了问题的条件并减少了估计的方差。 较大的值指定较强的正则化。 Alpha对应于其他线性模型(如Logistic回归或LinearSVC)中的C^{-1}。 如果传递数组,则假定惩罚被特定于目标。 因此,它们必须在数量上对应。

  • fit_intercept: 默认为 True,计算截距项。如果设置为false,则不会在计算中使用截距(例如,数据预期已经居中)。

  • normalize: 默认为 False,不针对数据进行标准化处理。如果为真,则回归X将在回归之前被归一化。 当fit_intercept设置为False时,将忽略此参数。 当回归量归一化时,注意到这使得超参数学习更加鲁棒,并且几乎不依赖于样本的数量。 相同的属性对标准化数据无效。然而,如果你想标准化,请在调用normalize = False训练估计器之前,使用preprocessing.StandardScaler处理数据。

  • copy_X: 默认为 True,即使用数据的副本进行操作,防止影响原数据。

  • max_iter: 最大迭代次数,默认为 None。共轭梯度求解器的最大迭代次数。 对于’sparse_cg’和’lsqr’求解器,默认值由scipy.sparse.linalg确定。 对于’sag’求解器,默认值为1000。

  • tol: 数据解算精度。

  • solver: 根据数据类型自动选择求解器。{‘auto’,’svd’,’cholesky’,’lsqr’,’sparse_cg’,’sag’}

  • random_state: 随机数发生器。

更多的参数中文详解可以参考这里

比较重要的就是alpha参数的选择了,其代表了正则化强度,我们可以通过类似网格搜索的单层方式来得到不同的拟合结果(其中y值为随机创建的w乘上矩阵得到的):

w = np.random.randint(2,10,10) # 随机生成 w 系数
y_temp = np.matrix(x) * np.matrix(w).T # 计算 y 值
y = np.array(y_temp.T)[0] #将 y 值转换成 1 维行向量  相当于给矩阵创建一个真实值

"""不同 alpha 参数拟合
"""
alphas = np.linspace(-3,2,20)
coefs = []
for a in alphas:
    ridge = Ridge(alpha=a, fit_intercept=False)
    ridge.fit(x, y)
    coefs.append(ridge.coef_)

"""绘制不同 alpha 参数结果
"""
from matplotlib import pyplot as plt
plt.plot(alphas, coefs) # 绘制不同 alpha 参数下的 w 拟合值 这里一共10条
plt.scatter(np.linspace(0,0,10), parameters[0]) # 普通最小二乘法拟合的 w 值放入图中
plt.xlabel('alpha')
plt.ylabel('w')
plt.title('Ridge Regression')
plt.show()

岭回归、LASSO回归(包括公式推导)[通俗易懂]

由图可见,当 alpha 取值越大时,正则项主导收敛过程,各 w 系数趋近于 0。当 alpha 很小时,各 w 系数波动幅度变大。 所以可以选择收敛基本平稳的alpha点。

LASSO回归:

当我们使用普通最小二乘法进行回归拟合时,如果特征变量间的相关性较强,则可能会导致某些 w 系数很大,而另一些系数变成很小的负数。所以,我们通过上文中的岭回归添加 L2 正则项来解决这个问题。

与岭回归相似的是,LASSO 回归同样是通过添加正则项来改进普通最小二乘法,不过这里添加的是 L1 正则项。即:

岭回归、LASSO回归(包括公式推导)[通俗易懂]

这里关于L1、L2没有做很详细的解释,如果需要可以参考这里,简单说下:

L1:L1正则化最大的特点是能稀疏矩阵,进行庞大特征数量下的特征选择

L2:L2正则能够有效的防止模型过拟合,解决非满秩下求逆困难的问题

LASSO回归拟合:

sklearn.linear_model.Lasso(alpha=1.0, fit_intercept=True, normalize=False, precompute=False, copy_X=True, max_iter=1000, tol=0.0001, warm_start=False, positive=False, random_state=None, selection=’cyclic’)

  • alpha: 正则化强度,默认为 1.0。

  • fit_intercept: 默认为 True,计算截距项。

  • normalize: 默认为 False,不针对数据进行标准化处理。

  • precompute: 是否使用预先计算的 Gram 矩阵来加速计算。

  • copy_X: 默认为 True,即使用数据的副本进行操作,防止影响原数据。

  • max_iter: 最大迭代次数,默认为 1000。

  • tol: 数据解算精度。

  • warm_start: 重用先前调用的解决方案以适合初始化。

  • positive: 强制系数为正值。

  • random_state: 随机数发生器。

  • selection: 每次迭代都会更新一个随机系数。

"""使用LASSO 回归拟合并绘图
"""
from sklearn.linear_model import Lasso

alphas = np.linspace(-2,2,10)
lasso_coefs = []
for a in alphas:
	lasso = Lasso(alpha=a,fit_intercept=False)
	lasso.fit(x,y)
	lasso_coefs.append(lasso.coef_)

plt.plot(alphas,lasso_coefs)	# 绘制不同alpha下的 w 拟合值
plt.scatter(np.linspace(0,0,10),parameters[0])	# 普通最小二乘法的 w 放入图中
plt.xlabel('alpha')
plt.ylabel('w')
plt.title('Lasso Regression')
plt.show()

岭回归、LASSO回归(包括公式推导)[通俗易懂]

由图可见,当 alpha 取值越大时,正则项主导收敛过程,各 w 系数趋近于 0。当 alpha 很小时,各 w 系数波动幅度变大。

 

 

参考文章:

https://blog.csdn.net/jinping_shi/article/details/52433975

https://blog.csdn.net/qq_36523839/article/details/82024623

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/135454.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(1)
blank

相关推荐

  • webapi安全验证_手机测试路由器丢包率

    webapi安全验证_手机测试路由器丢包率无线局域网鉴别与保密基础结构WAPI是无线局域网安全协议,也被列为多种检测的测试项目。自联盟成员西电捷通研发WAPI技术以来,我们在密切跟踪WAPI安全技术的基础上,按照协议的技术特点将其工程实践化,而且,基于对WAPI安全协议的深刻理解,我们对WAPI安全协议的检测形成了一套系统方法,并研发了WAPI安全协议检测系统,如何保障WAPI安全协议检测系统测试的准确性和稳定性将是测试工作的核心。

    2022年10月15日
  • 基于AdminLTE的开发框架-AdminEAP

    基于AdminLTE的开发框架-AdminEAPAdminEAP是基于AdminLTE的开发框架,目前所包含的系统功能有:Component组件集成、CURD增删改查demo、系统工具、工作流、系统权限与安全、Github源码与License、联系我们,提供了前端、后端整体解决方案,使得web开发更简单。

  • jsNavigator对象的讲解_javascript自定义对象

    jsNavigator对象的讲解_javascript自定义对象 JSnavigator对象 转自:http://blog.163.com/tgaosh@126/blog/static/139818624201012651556709/ navigator是一个独立的对象,他用于提供用户所使用的浏览器以及操作系统等信息,以navigator对象属性的形式来提供。————————————-…

  • C# FileSystemWatcher用法详解[通俗易懂]

    C# FileSystemWatcher用法详解[通俗易懂]FileSystemWatcher控件主要功能:监控指定文件或目录的文件的创建、删除、改动、重命名等活动。可以动态地定义需要监控的文件类型及文件属性改动的类型。1.常用的几个基本属性:(1)Path:设置要监视的目录的路径。(2)IncludeSubdirectories:设置是否级联监视指定路径中的子目录。(3)Filter:设置筛选字符串,用于确定在目录中监

  • Excel与XML相互转换 – C# 简单实现方案[通俗易懂]

    Excel与XML相互转换 – C# 简单实现方案[通俗易懂]Excel与XML相互转换-C#简单实现方案在日常工作中,我需要将数据存储在Excel中进行数据分析和处理,然后再将数据转换为XML格式进行跨平台的数据交换。网上搜索Excel转换为XML的实现方式大都是将Excel读取到数据库的DataSet,然后再写入到xml,代码比较繁琐而且要求运行环境安装数据库。最终我找到了一个简单的Excel与XML相互转换的C#实现方案,运行环境无需安装数据

  • 转发和重定向的区别和使用特点_转发与重定向的联系

    转发和重定向的区别和使用特点_转发与重定向的联系页面的跳转:转发转发的原理转发的方法疑问能否在OneServlet中保存值到请求域中,在另一个TwoServlet中打印出来?如果是不同的请求,不能取出来。如果是同一次请求是可以取出来的。转发与重定向的作用在Servlet中实现页面的跳转有两种方式:转发和重定向什么是转发概念由服务器端进行的页面跳转原理图转发的方法案例需求​ 实现从OneServle…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号