岭回归原理及代码实现

岭回归(英文名:ridge regression, Tikhonov regularization)是一种专用于共线性数据分析的有偏估计回归方法,实质上是一种改良的最小二乘估计法,通过放弃最小二乘法的无偏性,以损失部分信息、降低精度为代价获得回归系数更为符合实际、更可靠的回归方法,对病态数据的拟合要强于最小二乘法。
对于有些矩阵,矩阵中某个元素的一个很小的变动,会引起最后计算结果误差很大,这种矩阵称为“病态矩阵”。有些时候不正确的计算方法也会使一个正常的矩阵在运算中表现出病态。对于高斯消去法来说,如果主元(即对角线上的元素)上的元素很小,在计算时就会表现出病态的特征。
回归分析中常用的最小二乘法是一种无偏估计。对于一个适定问题,X通常是列满秩的

采用最小二乘法,定义损失函数为残差的平方,最小化损失函数

上述优化问题可以采用梯度下降法进行求解,也可以采用如下公式进行直接求解
                                                                           
当X不是列满秩时,或者某些列之间的线性相关性比较大时, 
 
 的行列式接近于0,即 
 
 接近于奇异,上述问题变为一个不适定问题,此时,计算 
 
 时误差会很大,传统的最小二乘法缺乏稳定性与可靠性。
为了解决上述问题,我们需要将不适定问题转化为适定问题:我们为上述损失函数加上一个正则化项,变为

其中,我们定义 
 
 。
于是:

上式中, 
 
 是单位矩阵。
随着 
 
 的增大, 
   
 各元素 
   
 的绝对值均趋于不断变小,它们相对于正确值 
 
 的偏差也越来越大。 
 
 趋于无穷大时, 
   
 趋于0。其中, 
   
 随 
   
 的改变而变化的轨迹,就称为岭迹。实际计算中可选非常多的k值,做出一个岭迹图,看看这个图在取哪个值的时候变稳定了,那就确定 
 
 值了。
岭回归是对最小二乘回归的一种补充,它损失了无偏性,来换取高的数值稳定性,从而得到较高的计算精度。
公式推导见下图:


代码实现:
[cpp]  view plain  copy
  1. cv::Mat RidgeRegression(cv::Mat D, cv::Mat Y)  
  2. {  
  3.     float lamda = 0.01;  
  4.     cv::Mat tranD = D.t();  
  5.     cv::Mat I = cv::Mat::eye(D.cols,D.cols,CV_32F);  
  6.     cv::Mat tmp = tranD*D+lamda*I;  
  7.     cv::Mat invtmp = tmp.inv(DECOMP_SVD);  
  8.     cv::Mat W = invtmp * tranD* Y;  
  9.   
  10.     return W;  
  11. }  

特别注意:在实际操作中,D的最后一列为全1. 加了1才能有线性表达式y=Ax+b中的b系数。
  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值