多元线性回归模型可视化

本文通过Python代码展示了如何绘制房价与面积、房间数之间的三维散点图和线框图,以及预测模型的应用,揭示三者间的关系。通过实例演示了如何使用Matplotlib和Scikit-Learn创建可视化并理解房价数据的模式。
摘要由CSDN通过智能技术生成

绘制平面图

绘制 房价房价面积房间数量 之间关系的散点图

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

# 设置字体
plt.rcParams['font.sans-serif'] = ['SimHei']

# 第一步:加载样本数据
# x1 是商品房面积
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 是商品房房间数
x2 = np.array([3, 2, 2, 3, 1, 2, 3, 2,
               2, 3, 1, 1, 1, 1, 2, 2])
# y 是房价
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])

# 创建Figure对象
fig = plt.figure(figsize=(8, 6))
# 创建3D对象
ax3d = Axes3D(fig)

# 绘制散点图
# 指定x、y、z坐标,并用蓝色的‘*’标记
ax3d.scatter(x1, x2, y, c='b', marker='*')

# 这里也可以使用plt中的设置标签的方法来进行设置
ax3d.set_xlabel('Area', color='r', fontsize=16)
ax3d.set_ylabel('Room', color='r', fontsize=16)
ax3d.set_zlabel('Price', color='r', fontsize=16)

# 设置y轴的坐标轴刻度, 这里的y轴对应我们的房间数
# 因为房间数最大数是3, 所以这里将刻度设置为整数123
# 要注意的是这个函数是设置坐标轴上刻度的显示方式, 而不是设置坐标轴范围
ax3d.set_yticks([1, 2, 3])
# set_zlim3d是设置坐标轴的范围,将 z 轴的范围设置为30-160之间
ax3d.set_zlim3d(30, 160)

# 将创建好的3D对象显示出来
plt.show()

这是运行结果:
在这里插入图片描述
除此之外,还可以使用

view_init(elev,azim)

来改变视角,其中,参数 elev 表示视角的水平高度,第二个参数表示水平旋转的角度。

将上面的程序中添加代码:

# 创建3D对象
...
ax3d.view_init(elev=0, azim=-90)
...

运行如下:
在这里插入图片描述
再换个角度:

# 创建3D对象
...
ax3d.view_init(elev=0, azim=0)
...

在这里插入图片描述
因为第一个图是三维图,左右两边存在一定的角度。所以两边的点好像没有完全落在坐标1和3上,这是视觉的偏差。

绘制平面图

绘制 房价房价面积房间数量 之间关系的平面图

下面,来绘制平面图。

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

# 设置字体
plt.rcParams['font.sans-serif'] = ['SimHei']

# x1 是商品房面积
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 是商品房房间数
x2 = np.array([3, 2, 2, 3, 1, 2, 3, 2,
               2, 3, 1, 1, 1, 1, 2, 2])

# 生成网格点的坐标矩阵
X1, X2 = np.meshgrid(x1, x2)

W = np.array([11.96729093, 0.53488599, 14.33150378])
# 使用模型估计出房价
Y_PRED = W[1] * X1 + W[2] * X2 + W[0]

# 创建Figure对象
fig = plt.figure()
# 创建3D对象
ax3d = Axes3D(fig)

# 绘制平面图
ax3d.plot_surface(X1, X2, Y_PRED, cmap='coolwarm')

# 这里也可以使用plt中的设置标签的方法来进行设置
ax3d.set_xlabel('Area', color='r', fontsize=16)
ax3d.set_ylabel('Room', color='r', fontsize=16)
ax3d.set_zlabel('Price', color='r', fontsize=16)

# 设置y轴的坐标轴刻度, 这里的y轴对应我们的房间数
# 因为房间数最大数是3, 所以这里将刻度设置为整数123
# 要注意的是这个函数是设置坐标轴上刻度的显示方式, 而不是设置坐标轴范围
ax3d.set_yticks([1, 2, 3])

# 将创建好的3D对象显示出来
plt.show()

运行结果如下:
在这里插入图片描述
在房间数这个轴上,样本中的数字只有1、2、3,因此只有两格。而在面积这个轴上,样本的分布是不均匀的。因此,图中这些网格的划分也是不均匀的。

绘制线框图、预测房价和实际房价

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

# 设置字体
plt.rcParams['font.sans-serif'] = ['SimHei']

# x1 是商品房面积
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 是商品房房间数
x2 = np.array([3, 2, 2, 3, 1, 2, 3, 2,
               2, 3, 1, 1, 1, 1, 2, 2])

# y 是房价
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])

# 生成网格点的坐标矩阵
X1, X2 = np.meshgrid(x1, x2)

W = np.array([11.96729093, 0.53488599, 14.33150378])
# 使用模型估计出的房价
y_pred = W[1] * x1 + W[2] * x2 + W[0]
Y_PRED = W[1] * X1 + W[2] * X2 + W[0]

# 创建Figure对象
fig = plt.figure()
# 创建3D对象
ax3d = Axes3D(fig)

# 绘制散点图
# 指定x、y、z坐标,并用蓝色的‘*’标记
ax3d.scatter(x1, x2, y, c='b', marker='*', label="销售记录")
ax3d.scatter(x1, x2, y_pred, c='r', label="预测房价")
ax3d.plot_wireframe(X1, X2, Y_PRED, color="c", linewidth=0.5, label="拟合平面")

# 这里也可以使用plt中的设置标签的方法来进行设置
ax3d.set_xlabel('Area', color='r', fontsize=14)
ax3d.set_ylabel('Room', color='r', fontsize=14)
ax3d.set_zlabel('Price', color='r', fontsize=14)

# 设置y轴的坐标轴刻度, 这里的y轴对应我们的房间数
# 因为房间数最大数是3, 所以这里将刻度设置为整数123
# 要注意的是这个函数是设置坐标轴上刻度的显示方式, 而不是设置坐标轴范围
ax3d.set_yticks([1, 2, 3])

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

# 将创建好的3D对象显示出来
plt.show()

运行代码如下:
在这里插入图片描述
这些红色的点就是预测出来的房价,它们既在线框图的网格点上,也在平面图上。这些蓝色的点是实际的房价,它们与预测出来的房价之间存在一定的偏差。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xuechanba

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值