岭回归模型|机器学习|回归算法


1.岭回归模型

1.1背景

对于回归问题来说,它们的基本内容基本上都是相同的,所以岭回归模型与线性回归模型类似:
y = θ 0 x 0 + θ 1 x 1 + θ 2 x 2 + . . . θ n x n {\color{Violet}y = θ_{0}x_{0}+θ_{1}x_{1}+θ_{2}x_{2}+...θ_{n}x_{n}} y=θ0x0+θ1x1+θ2x2+...θnxn它们的差别主要体现在损失函数的构造上。

对于有些矩阵,矩阵中某个元素的一个很小的变动,会引起最后计算结果误差很大,这种矩阵称为“病态矩阵”。有些时候不正确的计算方法也会使一个正常的矩阵在运算中表现出病态。对于高斯消去法来说,如果主元(即对角线上的元素)上的元素很小,在计算时就会表现出病态的特征。

而岭回归模型使用改良的最小二乘估计法,通过放弃最小二乘法的无偏性,以损失部分信息、降低精度为代价获得回归系数更为符合实际、更可靠的回归方法,对病态数据的拟合要强于最小二乘法。

1.2损失函数

岭回归模型的损失函数构造如下:
J ( θ ) = 1 2 m ∑ i = 1 m ( y i − w x i ) 2 + λ 2 ∑ j = 1 n θ j 2 {\color{Violet}J(\theta) = \frac{1}{2m}\sum_{i=1}^{m}(y_{i}-wx_{i})^{2}+\frac{\lambda}{2}\sum_{j=1}^{n}\theta_{j}^{2}} J(θ)=2m1i=1m(yiwxi)2+2λj=1nθj2

且:
∑ j = 1 n θ j 2 ≤ λ {\color{Violet}\sum_{j=1}^{n}\theta _{j}^{2} ≤ \lambda} j=1nθj2λ

上式中的 𝑤 {\color{Red}𝑤} w 是长度为 𝑛 {\color{Red}𝑛} n 的向量,不包括截距项的系数 θ 0 {\color{Red}θ_{0}} θ0 m {\color{Red}m} m为样本数; 𝑛 {\color{Red}𝑛} n 为特征数。同样可以使用矩阵进行简化表达式,结果如下:
J ( θ ) = 1 2 ( Y − Y ^ ) 2 + λ 2 θ 2 {\color{Violet}J(\theta)=\frac{1}{2}(Y-\hat Y)^{2}+\frac{\lambda}{2}\theta ^{2}} J(θ)=21(YY^)2+2λθ2

我们对上式 θ {\color{Red}\theta} θ 进行求得,令求导后的式子等于0,可以求得最优解,转换后可以得到 θ {\color{Red}\theta} θ 的表达式为:
θ = ( X T X + λ I ) − 1 ( X T Y ) {\color{Violet}\theta = (X^{T}X+\lambda I)^{-1}(X^{T}Y)} θ=(XTX+λI)1(XTY)

其中 λ {\color{Red}\lambda} λ 做为传入的参数我们需要设置它的值,而 I {\color{Red}I} I 为单位矩阵,相对于线性回归模型来说此模型添加了 λ I {\color{Red}\lambda I} λI 这一项,此举可以保证 X T X {\color{Red}X^{T}X} XTX 可逆,所以总得来说可以解决病态矩阵的问题。


2.相关代码

2.1RidgeRegression类

import numpy as np
#定义RidgeRegression
class RidgeRegression :
    def __init__(self):
        '''初始化线性回归模型,最终要求得theta'''
        self.theta = None
        
    # 通过代码实现θ的求解,输入X和y的值,可以指定λ的大小,默认为0.2    
    def fit(self,xMat,yMat,lam=0.2):
        xMat=np.mat(xMat)#将数据转化为矩阵
        yMat=np.mat(yMat).T#将数据转化为矩阵,并进行转置
        xTx = xMat.T*xMat#矩阵xMat转置后相乘
        denom = xTx + np.eye(np.shape(xMat)[1])*lam#公式XTX+λI的表示代码
        # 判断denom是否是奇异的
        if np.linalg.det(denom) == 0.0:
            print("这个矩阵是奇异的,不可求逆")
            return
        self.theta = denom.I * (xMat.T*yMat)#根据最优解求解公式求θ值

    # 对测试数据进行预测,输入的test_data是原本的X,我们要使用theta求得对应的预测值
    def predict(self,test_data):
        test_data=np.mat(test_data)#将数据转化为矩阵
        y_predict=test_data*self.theta#通过得到的θ值,对数据进行预测
        
        return y_predict

2.2求解代码

import pandas as pd
import numpy as np
#读取数据
data = pd.read_csv('/data/shixunfiles/11996b194a005626887e927dd336f390_1577324743961.csv')

#提取特征值和真实值
X = data.iloc[:,:-1].values
y = data.iloc[:,-1].values

#对特征值加一列x0,x0的所有值为1
X = np.hstack((np.ones((X.shape[0],1)),X))

#建立模型,并训练模型
rr = RidgeRegression()
rr.fit(X,y)

#对数据进行预测,为了求拟合曲线,因此使用原始数据进行预测
ypredict = rr.predict(X)

这里展示了csv中一些数据,下标从0-6的列表示的是每个特征点的特征值,下标为7的列表示每个特征点对应的标签。注意此时我们需要添加一列x0,值都为1。
在这里插入图片描述

2.3绘图代码

import matplotlib.pyplot as plt
import seaborn as sns;
sns.set()
#选择200条数据进行查看
plt.scatter(range(200),y[:200],s=20)
plt.plot(range(200),ypredict[:200],color='black')

在这里插入图片描述


3.直接调库使用

∙ \bullet 实际在使用时,不需要自己实现岭回归的模型,此时我们直接调库即可;

∙ \bullet 格式为:from sklearn.linear_model import Ridge

∙ \bullet 调用时:ridge = Ridge(alpha=1.0)

∙ \bullet 常用方法如下:

方法格式含义
fit(X,y)拟合岭回归模型,X为特征值矩阵,y为标签向量
predict(X)得到模型预测的结果向量,X为输入特征值矩阵
  • 4
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

比奇堡咻飞兜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值