多元线性回归原理和代码实现---机器学习

多元线性回归

原理

多元线性回归是一元线性回归的升级版吧,都是线性模型
线性回归就是试图学到一个线性模型,尽可能的准确的预测出真实值。就是给机器数据集,其中包括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()

结果:
在这里插入图片描述

数据集若需要可私我取。

©️2020 CSDN 皮肤主题: 1024 设计师:上身试试 返回首页