1 何为岭回归?

 岭参数k不是唯一确定的,其估计的回归系数是一个估计族。
2 何为岭迹分析?
1)定义
 
2)作用

 
 
 k值的选取原则:
 
 如下图所示,当k=k0时,各回归系数的估计值基本都能相对稳定。
 
 除了岭迹法,还可以使用VIF确定k值。可以选方差扩大因子cjj≤10的k值:

 除了岭迹法、VIF,还可使用残差平方和确定k值:
 
3 如何基于岭回归选择变量?
选择变量的原则:

4 python实现
from sklearn.linear_model import Ridge
import pandas as pd
import statsmodels.formula.api as smf
from statsmodels.stats.outliers_influence import variance_inflation_factor
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline 
#构造数据
df = pd.DataFrame(
    {'y':  [15, 10, 8, 9, 3],
     'x1': [1, 1, 2, 3, 4],
     'x2': [2, 2, 3, 2, 1],
     'x3': [4, 6, 7, 8, 9],
     'x4': [4, 3, 4, 5, 4]},
) 
#建模
result = smf.ols('y~x1+x2+x3+x4',data = df).fit()
 
# 计算方差扩大因子(多重共线性判断)
VIFlist = []
for i in range(1, 3, 1):
    vif = variance_inflation_factor(result.model.exog, i)
    VIFlist.append(vif)
print(pd.Series(VIFlist))
 
#岭回归处理(即原理部分)
eps = list(np.random.randn(5))  # 误差项,个数是由数据的条数决定
y = -1.1584 + 0.0547 * df['x1'] + 0.1341 * df['x2'] -0.0548 * df['x3']-0.0320* df['x4'] + eps
df['y'] = y  #覆盖原来的y值
 
#岭回归模型
dfnorm = (df - df.mean()) / df.std() #标准化自变量矩阵
# 切片将x和y分开
Xnorm = dfnorm.iloc[:, 1:]
ynorm = df.iloc[:, 0]
 
clf = Ridge()  #岭回归函数
coefs = []   #存放岭回归估计值
errors = []  #存放残差
 
alphas = np.linspace(0.1, 30, 2000)  #步长为0.1, 取30个alpha值
 
#遍历每个alpha值,计算出一系列的岭回归估计值
for a in alphas:
    clf.set_params(alpha=a)
    clf.fit(dfnorm, ynorm)
    coefs.append(clf.coef_)
 
#画岭回归图
plt.subplot(111)  #创建一个画布
ax = plt.gca()   #gca()一个坐标轴的设置函数
ax.plot(alphas, coefs, label=list(Xnorm.keys()))   #画图
ax.legend(list(Xnorm.keys()), loc='best')  #设置图例
plt.xlabel('alpha')
plt.ylabel('weights')
plt.title('Ridge coefficients as a function of the regularization')
plt.axis('tight')
plt.show()
 
#下面就是删除调变化趋势大的自变量,重复上面的所有的操作,直到一个最优的结果,然后确定k值

 从图中可以看出,alpha(k)越小时,系数很不稳定,随着k的增大,系数趋于稳定,当k趋近于无穷时,系数趋近于0。
参考:
 https://blog.csdn.net/DL11007/article/details/129198295



















