Ridge回归

岭回归(英文名: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()

Ridge回归_第1张图片
可见,当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

你可能感兴趣的:(机器学习)