第二章.线性回归以及非线性回归
2.12 岭回归(Ridge Regression)
1.前期导入:
1).标准方程法[w=(XTX)-1XTy]存在的缺陷:
- 如果数据的特征比样本点还多,数据特征n,样本个数m,如如果n>m,则计算 (XTX)-1 时会出错,因为 (XTX) 不是满秩,所以不可逆
2).解决标准方程法缺陷的方法:
- 为了解决这个问题,统计学家们引入了岭回归的概念:w=(XTX+λI)-1XTy
- 参数说明:
 λ:岭系数
 I:单位矩阵(对角线上全为1,其他元素都为0)
2.矩阵公式:
1).矩阵转置公式
| 公式 | 
|---|
| (mA)T = mAT | 
| (A+B)T = AT+ BT | 
| (AB)T = BTAT | 
| (AT)T = A | 
2).矩阵求导公式
对X求偏导
| 公式 | 
|---|
| (XT) ’ = I | 
| (AXT) ’ = A | 
| (XTA) ’ = A | 
| (AX) ’ = AT | 
| (XA) ’ = AT | 
| (XTAX) ’ = (A +AT)X | 
| (XTAX) ’ =2AX(A为对称矩阵) | 
3.岭回归公式分析:
1).L2正则化的代价函数:

2).L2正则化用矩阵表示:

3).对θ求偏导:

 注:λI = λ
4.岭回归模型的使用场景:
1).定义:
- 岭回归最早是用来处理特征数多于样本的情况,现在也用于在估计中加入偏差,从而得到更好的估计,同时也可以解决多重共线性的问题,岭回归是一种偏估计。
2).岭回归代价函数:

3).岭回归求解:

- 参数说明:
 λ:岭系数
 I:单位矩阵(对角线上全为1,其他元素都为0)
4).λ值选取的方法:
- 各回归系数的岭估计基本稳定
- 残差平方和增加不太多

- 图像的描述:y轴:每条线代表一个参数的变化,x轴:代表λ的参数值,λ越大,参数越接近于0
4.longley数据集的介绍:
- longley数据集是强共线性的宏观经济数据,包含GNP deflator(GNP 平减指数)、GNP(国民生产总值)、Unemployed(失业率)、ArmedForces(武装力 量)、Population(人口)、year(年份),Emlpoyed(就业率)。
- Longley数据集存在严重的多重共线性问题,在早期经常用来检验各种算法或者计算集的计算精度。
5.实战1: 标准方程法—岭回归:
1).CSV中的数据:
- longley.csv
2).代码
import numpy as np
from numpy import genfromtxt
# 读取数据
data = genfromtxt('D:\\Data\\longley.csv', delimiter=',')
# 数据切片
x_data = data[1:, 2:]
y_data = data[1:, 1, np.newaxis]
# 给样本增加偏置项
X_data = np.concatenate((np.ones((16, 1)), x_data), axis=1)
# 岭回归标准方程法求解回归参数
def weights(xArr, yArr, lam=0.2):
    xMat = np.mat(xArr)
    yMat = np.mat(yArr)
    # 矩阵乘法
    xTx = xMat.T * xMat
    rxTx = xTx + lam * np.eye(xMat.shape[1])
    # 判断矩阵是否为可逆矩阵
    if np.linalg.det(rxTx) == 0.0:
        print('This matrix cannot do inverse')
        return
    ws = rxTx.I * xMat.T * yMat
    return ws
ws = weights(X_data, y_data)
print('系数:', ws.reshape(1, ws.shape[0]))
# 预测值
pred = np.mat(X_data) * np.mat(ws)
print('预测值:', pred.reshape(1, pred.shape[0]))
3).结果展示:
①.数据

5.实战2: sklearn—岭回归:
1).CSV中的数据:
- longley.csv
2).代码
import numpy as np
from numpy import genfromtxt
import matplotlib.pyplot as plt
from sklearn import linear_model
# 导入数据
data = genfromtxt('D:\\Data\\longley.csv', delimiter=',')
# 数据切片
x_data = data[1:, 2:]
y_data = data[1:, 1]
# 生成50个值:岭回归的备选值
alphas_to_test = np.linspace(0.001, 1, 50)
# 创建模型:alphas:岭回归系数 store_cv_values:岭回归的误差值
model = linear_model.RidgeCV(alphas=alphas_to_test, store_cv_values=True)
# 拟合线性模型
model.fit(x_data, y_data)
# 岭系数
coeff = model.alpha_
print('岭系数:', coeff)
# Loss值
loss = model.cv_values_.shape
print('Loss值的形状:', loss)
pred = model.predict(x_data[:])
print('预测值:', pred)
# 画图:岭系数跟loss的关系
plt.plot(alphas_to_test, model.cv_values_.mean(axis=0))
# 选取的岭系数值的位置
plt.plot(coeff, min(model.cv_values_.mean(axis=0)), 'ro')
plt.show()
3).结果展示:
①.数据

②.图像




















