1. 实验目的
①掌握一元线性回归模型的实现方法;
②掌握多元线性回归模型的实现方法;
③掌握三维数据可视化方法。
2. 实验内容
①使用TensorFlow建立一元线性回归模型,使用商品房销售数据训练模型,并使用训练好的模型预测房价;
②使用TensorFlow建立多元线性回归模型,使用商品房销售数据预测房价,并实现三维数据可视化。
3. 实验过程
题目一:
使用9.5小节中的“商品房销售记录表”作为样本数据,训练一元线性回归模型,根据商品房面积预测房价。
提示用户输入商品房面积,并进行输入校验。合理的输入为20~500之间的实数。如果输入正确,根据模型估计房价,并输出显示;如果输入数据类型错误,或者输入数据范围不合理,根据错误类型提示,并等待用户重新输入,输错3次,则程序结束。
要求:
⑴编写代码,实现程序功能;
⑵记录实验过程和结果:尝试调试超参数,使模型达到最优的性能,记录实验过程和结果。
① 代码
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
#加载面积和房价
x = tf.constant([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])
y = tf.constant([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])
#求均值
meanX = tf.reduce_mean(x)
meanY = tf.reduce_mean(y)
#求权值
sumXY = tf.reduce_sum((x - meanX) * (y - meanY))
sumXX = tf.reduce_sum((x - meanX) * (x - meanX))
w = sumXY / sumXX
b = meanY - w * meanX
print("权值w为",w.numpy(),"\n偏置值b为",b.numpy())
print("线性模型:y=",w.numpy(),"*x + ",b.numpy())
for i in range(3):
print("商品房面积和预测房价")
x1 = input("请输入商品房面积")
if(i == 3):
print("错误过多,GameOver")
else:
if x1.isdigit():
x1 = float(x1)
if(x1 <= 500) & (x1 >= 20):
y1= w * x1 + b
print("面积%f的商品房价格为%f"%(x1,y1))
break
else:
print("输入的面积大小错误,请重新输入")
else:
print("输入的面积类型错误,请重新输入")
② 实验结果
题目二:
使用9.5小节中的“商品房销售记录表”作为样本数据,使用房屋面积和房间数,训练多元线性回归模型,实现一个房价预测系统。
要求:
⑴尝试调试超参数,使模型达到最优的性能,记录实验过程和结果;
⑵创建3D绘图对象来绘制空间点集。x轴表示房屋面积,y轴表示房间数,z轴表示样本的销售价格;
⑶提示用户输入商品房面积和房间数,并进行输入校验。如果输入正确,根据模型预测房价。
合理的输入如下:
面积:20-500之间的实数
房间数:1-10之间的整数
如果输入数据类型错误,或者输入数据范围不合理,根据错误类型给出提示,并等待用户重新输入,输错3次,则程序结束。
(输入时,请注意房间面积对应房间数的合理性)
提示:
① TensorFlow中矩阵求逆函数tf.linalg.inv()
② 输入时,请注意房间面积对应房间数的合理性
① 代码
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np
import tensorflow as tf
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, 1, 2, 2])
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
])
fig = plt.figure()
#绘图
ax3d = fig.add_axes(Axes3D(fig))
ax3d.set_xlabel("square")
ax3d.set_ylabel("rooms")
ax3d.set_zlabel("price")
ax3d.scatter(x1, x2, y)
plt.show()
#计算
x0 = np.ones(len(x1))
#对叠
X = np.stack((x0,x1,x2),axis=1)
#将y变换为列向量
Y = np.array(y).reshape(-1,1)
Xt = np.transpose(X)
XtX_1 = np.linalg.inv(np.matmul(Xt,X))
XtX_1_Xt = np.matmul(XtX_1,Xt)
W = np.matmul(XtX_1_Xt,Y)
for i in range(3):
print("商品房面积和预测房价")
x1_test = input("请输入商品房面积")
x2_test = input("请输入房间数")
if(i == 3):
print("错误过多,GameOver")
else:
if (x1_test.isdigit()) & (x2_test.isdigit()):
x1_test = float(x1_test)
x2_test = float(x2_test)
if(x1_test <= 500) & (x1_test >= 20) & (x2_test <= 10) & (x2_test >= 1) :
y_price = W[1] * x1_test + W[2] * x2_test + W[0]
print("价格为%.2f"%y_price,"万元")
break
else:
print("输入的面积或房间数大小错误,请重新输入")
else:
print("输入的面积或房间数类型错误,请重新输入")
在此可能大部分人都会遇到的两个问题,其中问题一我已经在上方程序中给予解决。
问题一:“matplotlib使用Axes3D绘3D图像时,没有内容”的解决方法
问题二:pycharm pycharm中用matplolib的ax3.plot_surface画出的3D(三维图)(三维函数)不能旋转怎么办?
② 实验结果
说明:以上程序矩阵运算部分采用TensorFlow实现,数据加载、输入、输出等可以根据需要采用Python/NumPy来实现。
4. 实验小结&讨论题
① 实验过程中遇到了哪些问题,你是如何解决的?
没有问题。
② 分别使用Numpy和TensorFlow进行数据的加载和数组的堆叠,你习惯使用哪种方式,为什么?
Numpy,因为Numpy的函数库我觉得相对来说处理数据更加方便,功能更加齐全。
③ 题目一和题目二在代码实现过程中,有重复的代码段,请设计函数优化代码。
重复的部分为判断输入数据的类型,错误三次退出部分,可以在题目一的基础上增加,商品房数量数据类型判断即可。
④ 在题目基本要求的基础上,你对每个题目做了哪些扩展和提升?或者你觉得在编程实现过程中,还有哪些地方可以进行优化?
没有扩展和提升,完全按照题目要求编写。我觉得在编程实现过程中可以对于ui界面进行优化,还有用户的体验也可以。