岭回归原理及代码实现
2017-09-14 09:59
363 查看
岭回归(英文名:ridge regression, Tikhonov regularization)是一种专用于共线性数据分析的有偏估计回归方法,实质上是一种改良的最小二乘估计法,通过放弃最小二乘法的无偏性,以损失部分信息、降低精度为代价获得回归系数更为符合实际、更可靠的回归方法,对病态数据的拟合要强于最小二乘法。
对于有些矩阵,矩阵中某个元素的一个很小的变动,会引起最后计算结果误差很大,这种矩阵称为“病态矩阵”。有些时候不正确的计算方法也会使一个正常的矩阵在运算中表现出病态。对于高斯消去法来说,如果主元(即对角线上的元素)上的元素很小,在计算时就会表现出病态的特征。
回归分析中常用的最小二乘法是一种无偏估计。对于一个适定问题,X通常是列满秩的
采用最小二乘法,定义损失函数为残差的平方,最小化损失函数
上述优化问题可以采用梯度下降法进行求解,也可以采用如下公式进行直接求解
当X不是列满秩时,或者某些列之间的线性相关性比较大时,
的行列式接近于0,即
接近于奇异,上述问题变为一个不适定问题,此时,计算
时误差会很大,传统的最小二乘法缺乏稳定性与可靠性。
为了解决上述问题,我们需要将不适定问题转化为适定问题:我们为上述损失函数加上一个正则化项,变为
其中,我们定义
。
于是:
上式中,
是单位矩阵。
随着
的增大,
各元素
的绝对值均趋于不断变小,它们相对于正确值
的偏差也越来越大。
趋于无穷大时,
趋于0。其中,
随
的改变而变化的轨迹,就称为岭迹。实际计算中可选非常多的k值,做出一个岭迹图,看看这个图在取哪个值的时候变稳定了,那就确定
值了。
岭回归是对最小二乘回归的一种补充,它损失了无偏性,来换取高的数值稳定性,从而得到较高的计算精度。
公式推导见下图:
代码实现:
[cpp] view
plain copy
cv::Mat RidgeRegression(cv::Mat D, cv::Mat Y)
{
float lamda = 0.01;
cv::Mat tranD = D.t();
cv::Mat I = cv::Mat::eye(D.cols,D.cols,CV_32F);
cv::Mat tmp = tranD*D+lamda*I;
cv::Mat invtmp = tmp.inv(DECOMP_SVD);
cv::Mat W = invtmp * tranD* Y;
return W;
}
特别注意:在实际操作中,D的最后一列为全1. 加了1才能有线性表达式y=Ax+b中的b系数。
对于有些矩阵,矩阵中某个元素的一个很小的变动,会引起最后计算结果误差很大,这种矩阵称为“病态矩阵”。有些时候不正确的计算方法也会使一个正常的矩阵在运算中表现出病态。对于高斯消去法来说,如果主元(即对角线上的元素)上的元素很小,在计算时就会表现出病态的特征。
回归分析中常用的最小二乘法是一种无偏估计。对于一个适定问题,X通常是列满秩的
采用最小二乘法,定义损失函数为残差的平方,最小化损失函数
上述优化问题可以采用梯度下降法进行求解,也可以采用如下公式进行直接求解
当X不是列满秩时,或者某些列之间的线性相关性比较大时,
的行列式接近于0,即
接近于奇异,上述问题变为一个不适定问题,此时,计算
时误差会很大,传统的最小二乘法缺乏稳定性与可靠性。
为了解决上述问题,我们需要将不适定问题转化为适定问题:我们为上述损失函数加上一个正则化项,变为
其中,我们定义
。
于是:
上式中,
是单位矩阵。
随着
的增大,
各元素
的绝对值均趋于不断变小,它们相对于正确值
的偏差也越来越大。
趋于无穷大时,
趋于0。其中,
随
的改变而变化的轨迹,就称为岭迹。实际计算中可选非常多的k值,做出一个岭迹图,看看这个图在取哪个值的时候变稳定了,那就确定
值了。
岭回归是对最小二乘回归的一种补充,它损失了无偏性,来换取高的数值稳定性,从而得到较高的计算精度。
公式推导见下图:
代码实现:
[cpp] view
plain copy
cv::Mat RidgeRegression(cv::Mat D, cv::Mat Y)
{
float lamda = 0.01;
cv::Mat tranD = D.t();
cv::Mat I = cv::Mat::eye(D.cols,D.cols,CV_32F);
cv::Mat tmp = tranD*D+lamda*I;
cv::Mat invtmp = tmp.inv(DECOMP_SVD);
cv::Mat W = invtmp * tranD* Y;
return W;
}
特别注意:在实际操作中,D的最后一列为全1. 加了1才能有线性表达式y=Ax+b中的b系数。
相关文章推荐
- 第七篇:Logistic回归分类算法原理分析与代码实现
- Coursera deeplearning.ai 深度学习笔记1-2-Neural Network Basics-逻辑回归原理推导与代码实现
- 逻辑回归原理(python代码实现)
- 机器学习逻辑回归:原理解析及代码实现
- 机器学习:逻辑回归原理及实现代码
- 线性回归的数学原理以及代码实现
- 岭回归原理及代码实现
- Logistic回归分类算法原理分析与代码实现
- C# 定积分求周长&面积原理 代码实现
- 【清楚理解后台利用ireport到处报表的原理】ireport制作jasperreport报表详细过程(包括jsp端代码实现)
- Java NIO原理图文分析及代码实现
- android开发之蜂鸣提示音和震动提示的实现原理与参考代码
- AC-BM算法原理与代码实现(模式匹配)
- Java三大器之拦截器(Interceptor)的实现原理及代码示例
- pwm驱动原理和代码实现
- 归并排序的原理,c++代码实现
- 执行具有root权限的java代码 am pm的实现过程原理
- Base64加密解密原理以及代码实现