线性回归模型|机器学习|回归算法


1.线性回归模型

1.1 一元线性回归模型

简单的讲,一元线性模型就是指只有一个特征量,然后对应带有一个标签(结果)。一元线性回归模型一般如下:
y = w x + b {\color{Violet}y = wx+b} y=wx+b

其中 w {\color{Red}w} w 代表权重、 b {\color{Red}b} b 代表偏移量、 x {\color{Red}x} x 代表特征值、 y {\color{Red}y} y 代表标签(该特征值对应结果)。一般结果图如下:
在这里插入图片描述

1.2多元线性回归模型

我们主要讨论的还是多元回归模型,多元回归模型只是在一元回归模型上的简单拓展,比如说特征值变成了多个,权重变成了多个,但是偏移量和标签同样只有一个,多元线性回归模型一般如下:
y = b + w 1 x 1 + w 2 x 2 + . . . w n x n {\color{Violet}y = b+w_{1}x_{1}+w_{2}x_{2}+...w_{n}x_{n}} y=b+w1x1+w2x2+...wnxn

现在式子很长,为了更好的描述该模型,我们想到可以用矩阵来简化表达式,但是现在表达式中有一个单独的 b {\color{Red}b} b 很烦,为了统一我们修改表达式如下:
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

其中 b = θ 0 , x 0 = 1 {\color{Red}b=θ_{0},x_{0}=1} b=θ0,x0=1 ,然后将x前面的系数统一使用 θ {\color{Red}θ} θ 进行表示。然后我们就可以使用矩阵进行简化表达式:
Y = θ X {\color{Violet}Y=θX} Y=θX

其中 θ = ( θ 0 , θ 1 , . . . θ n ) , X = ( x 0 , , x 1 , . . . x n ) {\color{Red}θ=(θ_{0},θ_{1},...θ_{n}),X=(x_{0},,x_{1},...x_{n})} θ=(θ0,θ1,...θn),X=(x0,,x1,...xn) ,那么我们怎么判断哪条直线对应的拟合效果好呢?这时就需要计算每条直线对应的损失函数,损失函数小的直线更优。

1.3损失函数

损失函数顾名思义就是计算相对于原来各点所损失的数值的函数。这里我们使用最小二乘法,对应的损失函数如下:
J ( θ ) = ( Y − Y ^ ) 2 = ( Y − θ X ) 2 = ( Y − θ X ) T ( Y − θ X ) {\color{Violet}J(θ)=(Y-\hat Y)^{2}=(Y-\theta X)^{2}=(Y-\theta X)^{T}(Y-\theta X)} J(θ)=(YY^)2=(YθX)2=(YθX)T(YθX)

具体就是求每个特征点对应的真实值与预测值之间的差的平方和,其中 Y 为(m,1) 的矩阵(m个特征点),X 为 (m,n+1) 的矩阵(每个特征点有n个特征值+x0),回归系数 θ 为 (n+1,1) 的矩阵。

我们对 θ 求导,并令其导数等于0,可以得到:
X T ( Y − θ X ) = 0 {\color{Violet}X^{T}(Y-\theta X)=0} XT(YθX)=0

解得:
θ = ( X T X ) − 1 X T Y {\color{Violet}\theta = (X^{T}X)^{-1}X^{T}Y} θ=(XTX)1XTY


2.相关代码

2.1LinearRegression类

# 定义类LinearRegression
class LinearRegression :
    # 初始化线性回归模型,我们最终要求的就是theta矩阵
    def __init__(self):
        self.theta = None
        
    # 通过代码实现theta的求解,输入原本的X和y,注意X需要添加一列1作为x0    
    def fit(self,xArr,yArr):
        xMat = np.mat(xArr) # 将数据转化为矩阵
        yMat = np.mat(yArr).T # 将数据转化为矩阵,并进行转置(因为我们传入的是一行数据,需要变为一列数据)
        xTx = xMat.T*xMat # 矩阵xMat转置后相乘
        # 判断矩阵xTx是否是奇异矩阵,如果是的话无法继续求解
        if np.linalg.det(xTx) == 0.0:
            print("这个矩阵是奇异的,不可求逆")
            return
        self.theta = xTx.I * (xMat.T*yMat) # 根据最优解的求解公式,求theta值
    
    # 对测试数据进行预测,输入的test_data是原本的X,我们要使用theta求得对应的预测值
    def predict(self,test_data):     
        test_data = np.mat(test_data) # 将数据转化为矩阵
        predict = test_data*self.theta #通过得到的theta值,对数据进行预测
        return predict

2.2求解代码

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 读取数据
data = pd.read_csv('/data/shixunfiles/a9c0cae754a52e4dc23c3d05a3cd7414_1577260243539.csv')

# 提取特征值和真实值,X提取最后一列之前的所有列,y提取最后一列标签列(注意:由于该文件已经插入了第一列x0,所以不需要再手动使用代码添加)
X = data.iloc[:,:-1].values
y = data.iloc[:,-1].values

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

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

这是对应csv文件中的部分数据,由于已经添加了第一列1,所以就不用手动进行添加了,下标为1的列表示x,下标为2的列表示y。(简单的一元线性回归模型)
在这里插入图片描述

2.3绘图代码

import matplotlib.pyplot as plt
import seaborn as sns;
sns.set()
plt.scatter(data.iloc[:,1],data.iloc[:,2])
plt.plot(data.iloc[:,1],ypredict,color='black')

在这里插入图片描述


3.直接调库使用

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

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

∙ \bullet 常用方法如下:

方法格式含义
fit(X,y)拟合线性回归模型,X为特征值矩阵,y为标签向量
predict(X)得到模型预测的结果向量,X为输入特征值矩阵
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

比奇堡咻飞兜

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

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

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

打赏作者

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

抵扣说明:

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

余额充值