第二章.线性回归以及非线性回归—岭回归

第二章.线性回归以及非线性回归

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正则化用矩阵表示:

第二章.线性回归以及非线性回归—岭回归_第1张图片

3).对θ求偏导:

第二章.线性回归以及非线性回归—岭回归_第2张图片
注:λI = λ

4.岭回归模型的使用场景:

1).定义:

  • 岭回归最早是用来处理特征数多于样本的情况,现在也用于在估计中加入偏差,从而得到更好的估计,同时也可以解决多重共线性的问题,岭回归是一种偏估计。

2).岭回归代价函数:

第二章.线性回归以及非线性回归—岭回归_第3张图片

3).岭回归求解:

在这里插入图片描述

  • 参数说明:
    λ:岭系数
    I:单位矩阵(对角线上全为1,其他元素都为0)

4).λ值选取的方法:

  • 各回归系数的岭估计基本稳定
  • 残差平方和增加不太多

第二章.线性回归以及非线性回归—岭回归_第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张图片

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).结果展示:

①.数据

第二章.线性回归以及非线性回归—岭回归_第6张图片

②.图像

第二章.线性回归以及非线性回归—岭回归_第7张图片

你可能感兴趣的:(回归,线性回归)