多元线性回归问题

62 阅读2分钟

假设要拟合的直线为y=w0+w1x1+w2x2+...+wm*xn.其中xi为自变量,w为权值

为了简化运算,可以利用矩阵进行计算

构造线性方程组

其中每一行为提供的样本数据,共有n条数据,每条数据有m个属性。这里x的下标代表第几条数据,上标代表第几个属性

36a6373ec63a2e589d507a47f9e9ea7.jpg

将它写为矩阵的形式

f8d57dafa4a8f7a8e4bf9eb4ca661ed.jpg 损失函数为

0e8e25cb297135d028beaed8d015b61.jpg 现要使真实值与预测值的误差达到最小,对该函数求导

3203eb639f874bf42d2ae548671889b.jpg

现探究房价与房屋面积,房间数量的关系,可将这两个属性的数据和1拼成矩阵(多出来的1是为了加上偏置值), 再将偏置值w0和对应属性的权值放一起拼成w矩阵,根据以上公式求出w就可得出最接近真实值的预测函数y=w0+w1x1+w2x2

import numpy as np

x1=np.array([137.97,104.50,100.00,124.32,79.20,99.00,124.00,114.00,106.69,138.05,53.75,46.91,68.00,63.02,81.26,86.21])
x2=np.array([3,2,2,3,1,2,3,2,2,3,1,1,1,2,2,1])
y=np.array([145.00,110.00,93.00,116.00,65.32,104.00,118.00,91.00,62.00,133.00,51.00,45.00,78.50,69.65,75.69,95.30])



x0=np.ones(len(x1))
X=np.stack((x0,x1,x2),axis=1) #拼成x矩阵
Y=np.array(y).reshape(-1,1)    

Xt=np.transpose(X)  #求x转置
XtX_1=np.linalg.inv(np.matmul(Xt,X))  #求xxt的逆矩阵
XtX_1_Xt=np.matmul(XtX_1,Xt)   #将xxt的逆矩阵与x转置相乘
W=np.matmul(XtX_1_Xt,Y)    #将上面所求结果与Y相乘

W=W.reshape(-1)
print("多元线性回归方程:")
print("Y=",W[1],"*x1+",W[2],"*x2+",W[0])

print("请输入房屋面积和房间数,预测房屋销售价格")
x1_test=float(input("商品房面积:"))
x2_test=int(input("房间数:"))

y_pred=W[1]*x1_test+W[2]*x2_test+W[0]
print("预测价格:",round(y_pred,2),"万元")

image.png

现将模型可视化,画出真实值和预测值的散点图,并画出模型的线框图

plt.rcParams['font.sans-serif']=['SimHei']
fig=plt.figure()
ax3d=Axes3D(fig)
fig.add_axes(ax3d)
ax3d.scatter(x1, x2, y, color='b', marker="*", label="销售记录")
ax3d.scatter(x1, x2, y_pred1, color='r', label="预测房价")
ax3d.plot_wireframe(X1, X2, Y_PRED, color='c', linewidth=0.5, label="拟合平面")

ax3d.set_xlabel('Area', color='r', fontsize=14)
ax3d.set_ylabel('Room', color='r', fontsize=14)
ax3d.set_zlabel('Price', color='r', fontsize=14)
ax3d.set_yticks([1,2,3])

plt.suptitle("商品销售回归模型", fontsize=20)
plt.legend(loc="upper left")
plt.show()

image.png