假设要拟合的直线为y=w0+w1x1+w2x2+...+wm*xn.其中xi为自变量,w为权值
为了简化运算,可以利用矩阵进行计算
构造线性方程组
其中每一行为提供的样本数据,共有n条数据,每条数据有m个属性。这里x的下标代表第几条数据,上标代表第几个属性
将它写为矩阵的形式
损失函数为
现要使真实值与预测值的误差达到最小,对该函数求导
现探究房价与房屋面积,房间数量的关系,可将这两个属性的数据和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),"万元")
现将模型可视化,画出真实值和预测值的散点图,并画出模型的线框图
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()