原理
多元线性回归是一元线性回归的升级版吧,都是线性模型。
线性回归就是试图学到一个线性模型,尽可能的准确的预测出真实值。就是给机器数据集,其中包括x特征值和对应的y值,通过训练得出一个模型,再只拿一些x特征值给它,这个模型给你预测出较为精准的y值。
线性回归试图学到的模型是:
f
(
x
)
=
ω
x
i
+
b
f(x)=\omega x_{i}+b
f(x)=ωxi+b,使得预测值f(x)跟真实值y结果相似。看着眼熟不?其实本质就有点像我们的
f
(
x
)
=
k
x
+
b
f(x)=kx+b
f(x)=kx+b这条直线。上面的
ω
\omega
ω是权重,b是偏置。
特征值单一的时候用一元线性回归,如果是多个特征决定一个y值,有多个权重,此时用多元线性回归,多元线性回归试图学得模型为:
f
(
x
)
=
ω
T
x
i
+
b
f(x)=\omega^{T} x_{i}+b
f(x)=ωTxi+b
在多元线性回归中,使用最小二乘法对参数
ω
\omega
ω和b进行参数估计,求解
ω
\omega
ω和b。在此为方便计算,把这两个参数吸收为向量形式进行处理,用
ω
^
\hat{\omega}
ω^来表示:
ω
^
=
(
ω
;
b
)
\hat{\omega}=(\omega;b)
ω^=(ω;b),相应的把数据集表示为一个
m
∗
(
d
+
1
)
m*(d+1)
m∗(d+1)大小矩阵的X,其中每一行都应一个示例,该行前d个元素对应于示例的d个属性值,把最后一个元素恒置为1便于计算(m个数据,d+1个特征)
再把y也写为向量形式:y=(y1;y2;y3;…ym)
由上通过推导公式可得
ω
^
\hat{\omega}
ω^的解
最终学的多元线性回归模型是
f
(
x
^
i
)
=
x
^
i
(
X
T
X
)
−
1
X
T
y
f(\hat{x}_{i})=\hat{x}_{i}(X^{T}X)^{-1}X^{T}y
f(x^i)=x^i(XTX)−1XTy
具体公式推导有些繁琐,想看看的可私我发手写推导。
代码实现
有两种方法进行实现:
第一种,解析解形式,通过公式代码进行模型训练。
第二种用sklearn库,简单粗暴的解决,它提供模型的训练函数,不用敲上面推导出来的公式代码了。
这里使用混凝土抗压强度数据集进行测试,预测值y为混凝土抗压强度定量MPa
第一种解析解形式:
import numpy as np
from sklearn.model_selection import train_test_split
#混凝土抗压强度数据测试,预测值为混凝土抗压强度定量MPa
import matplotlib.pyplot as plt
data=np.loadtxt("F:/comdata/Concrete_Data.csv",delimiter=",",skiprows=1,dtype=np.float32);
#print(data)
#print(data.shape[0]) 1030行数据
data1=np.ones((data.shape[0],1)) #全1矩阵,m=1030行n=1列
#print(data1)
data=np.hstack((data,data1))
#print(data)
y=data[:,0]
X=data[:,1:]
#print(y)
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.8,random_state=42)
w_hat=np.dot(np.dot(np.linalg.inv(np.dot(X_train.T,X_train)),X_train.T),y_train)
y_predict=np.dot(X_test,w_hat)
print(y_predict) #预测的mpa抗压强度值
plt.rcParams['font.sans-serif']=['SimHei']
plt.title("解析解求解多元线性回归模型得到预测值与真实值对比图")
plt.xlabel("样本ID")
plt.ylabel("混凝土抗压强度MPa")
plt.plot(range(len(X_test)),y_test,alpha=0.4,c="red") #s=2,c="red",
plt.plot(range(len(X_test)),y_predict,ls="-",alpha=0.5,c="green")
plt.show()
结果:
第二种sklearn实现
import numpy as np
from sklearn import linear_model
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
#混凝土抗压强度数据测试,预测值为混凝土抗压强度定量MPa
#读入数据
data=np.loadtxt("F:/comdata/Concrete_Data.csv",delimiter=",",skiprows=1,dtype=np.float32)
#切片,分离数据,X,Y
X=data[:,1:]
y=data[:,0]
#分割数据,分为训练集和测试集
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.8)
model=linear_model.LinearRegression();#获得线性模型
#训练模型,用sklearn库里面的
model.fit(X_train,y_train)
#查看训练好的参数,就是w
#print(model.coef_)
#预测模型
y_predict=model.predict(X_test)
print(y_predict)
#可视化展示
plt.rcParams['font.sans-serif']=['SimHei']
plt.title("sklearn线性回归模型预测值与真实值对比图")
plt.xlabel("样本ID")
plt.ylabel("混凝土抗压强度MPa")
plt.scatter(np.arange(300),y_test[:300],c="red")
plt.scatter(np.arange(300),y_predict[:300],c="black")
plt.show()
结果:
数据集若需要可私我取。