岭回归原理及代码实现

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

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

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

其中,我们定义
 
于是:

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


代码实现:
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系数。

Reference: 
http://baike.baidu.com/link?url=rRhzRSge3NKyc1as8xnUO4u7JUMcYSTmDKXOZbpWVAnVGk05lU-lz_CFbuF1lD7Ta6JFfpAXPNfL2IwQXmCw3q

你可能感兴趣的:(岭回归,岭回归原理,岭回归代码)