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(θ)=(Y−Y^)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为输入特征值矩阵 |