岭回归(英文名:ridge regression, Tikhonov regularization)是一种专用于共线性数据分析的有偏估计回归方法,自变量之间线性相关-correlation很高,实质上是一种改良的最小二乘估计法,通过放弃最小二乘法的无偏性,以损失部分信息、降低精度为代价获得回归系数更为符合实际、更可靠的回归方法,对病态数据的拟合要强于最小二乘法。
回归分析中常用的最小二乘法是一种无偏估计。对于一个适定问题,X通常是列满秩的。
采用最小二乘法,定义损失函数为残差的平方,最小化损失函数。
上述优化问题可以采用梯度下降法进行求解,也可以采用如下公式进行直接求解:
当X不是列满秩时,或者某些列之间的线性相关性比较大时,
的行列式接近于0,不能采用最小二乘法进行求解。
为了解决上述问题,我们需要将不适定问题转化为适定问题:我们为上述损失函数加上一个正则化项,变为:
则目标函数为:
变量系数为:
岭回归牺牲了一部分无偏差性,使得方差变小。
上式中, I是单位矩阵。随着 a的增大, 各元素
的绝对值均趋于不断变小,它们相对于正确值 的偏差也越来越大。 a趋于无穷大时,
趋于0。其中,
随 a的改变而变化的轨迹,就称为岭迹。实际计算中可选非常多的 a值,做出一个岭迹图,看看这个图在取哪个值的时候变稳定了,那就确定a 值了。
岭回归是对最小二乘回归的一种补充,它损失了无偏性,来换取高的数值稳定性,从而得到较高的计算精度。
# coding=utf-8
import numpy as np
import matplotlib.pyplot as plt
from sklearn import linear_model
from sklearn.linear_model import RidgeCV
x = 1./((np.arange(1, 11))+np.arange(0, 10)[:, np.newaxis])
y = np.ones(10)
n_alphas = 200
alphas = np.logspace(-10,-2,n_alphas)
clf = linear_model.Ridge(fit_intercept=False)
# coef_:相关系数(array类型)
coefs = []
for a in alphas:
clf.set_params(alpha = a)
clf.fit(x,y)
coefs.append(clf.coef_)
ax = plt.gca()
ax.plot(alphas,coefs)
ax.set_xscale('log')
ax.set_xlim(ax.get_xlim()[::-1])
plt.grid(True)
plt.show()
可见,当a = 0.01时θ为0,当a=10^(-10)时,趋于线性回归的回归系数。
怎么选择合适的a?
从岭迹图上看这个图在取哪个值的时候变稳定了,那就确定 a值了。
ridgecv = RidgeCV(alphas=alphas)
ridgecv.fit(x, y)
print ridgecv.alpha_
可以调用RidgeCV函数,output is:1e-10
解释下clf.coef_和clf.intercept_
coef_:相关系数,是自变量的系数。在本例中,coef_是10*1的array,.把a=10^(-10)的coef_输出为:[-1.15365551 -0.06380733 0.82265094 1.33384561 1.62104261 1.77805326
1.85752347 1.88963634 1.89230434 1.87650476] 其中,intercept_为截距。本例输出为0。即y = 0 + (-1.15)*x1+(-0.06)*x2+(0.82)*x3+……+(1.77)*x10