线性回归模型|机器学习

Posted 桃陉

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了线性回归模型|机器学习相关的知识,希望对你有一定的参考价值。


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')

以上是关于线性回归模型|机器学习的主要内容,如果未能解决你的问题,请参考以下文章

机器学习模型和算法

机器学习——模型树

机器学习:线性模型学习总结:线性回归

机器学习经典算法源码分析系列-- 线性回归

如何搞懂机器学习中的线性回归模型?机器学习系列之线性回归基础篇

机器学习-简单线性回归