当前位置:   article > 正文

波士顿房价多元线性回归模型的Python实现_多元线性回归的python实现波士顿房价

多元线性回归的python实现波士顿房价

利用梯度下降法,对房间数、与市中心距离、是否被河流穿过和当地师生比例四个因素建立四元回归模型。构造矩阵X,行数404(训练集中数据条数),列数5。前四列分别为以上述四个自变量为元素的列向量,第四列为全1列向量(作为偏置中的系数)。构造矩阵W_{5*1},前四个元素为上述四个自变量对应的权重,最后一个元素与1的乘积作为偏置。对于每组数据,利用均方差函数作为损失函数:

Loss=\frac{1}{2n}\sum (y-\hat{y})^{2}

其中

\hat{y}=wx+b

用Y表示因变量组成的列向量,于是对于上述矩阵,有

\hat{Y}=XW

Loss=\frac{1}{2n}(Y-XW)^{T}(Y-XW) 

\frac{\partial Loss}{\partial W}=2X^{T}(Y-XW)

W^{^{'}}=W-\eta\frac{\partial Loss}{\partial W}

不过由于tensorflow自带计算各元素幂的函数,所以编程中没有使用第二个方程。

代码如下:

  1. import tensorflow as tf
  2. import numpy as np
  3. import matplotlib.pyplot as plt
  4. def delta(x,w,y):
  5. trans=tf.transpose(x)
  6. sec=tf.matmul(x,w)-y
  7. delt=2*tf.matmul(trans,sec)
  8. return delt
  9. boston_housing=tf.keras.datasets.boston_housing
  10. (train_x,train_y),(test_x,test_y)=boston_housing.load_data()
  11. train_y=tf.constant(train_y,dtype=tf.float32)
  12. train_y=tf.reshape(train_y,[-1,1])
  13. #训练集数据提取
  14. t_room=tf.constant(train_x[:,5],dtype=tf.float32) #房间数
  15. t_dis=tf.constant(train_x[:,7],dtype=tf.float32) #与市中心的距离
  16. t_chas=tf.constant(train_x[:,3],dtype=tf.float32) #是否被河流穿过
  17. t_ptra=tf.constant(train_x[:,10],dtype=tf.float32) #师生比例
  18. x0=tf.ones(len(t_room),dtype=tf.float32)
  19. #测试集线性归一化
  20. t_room==tf.divide(t_room-tf.reduce_min(t_room), tf.reduce_max(t_room)-tf.reduce_min(t_room))
  21. t_dis=tf.divide(t_dis-tf.reduce_min(t_dis), tf.reduce_max(t_dis)-tf.reduce_min(t_dis))
  22. t_ptra=tf.divide(t_ptra-tf.reduce_min(t_ptra), tf.reduce_max(t_ptra)-tf.reduce_min(t_ptra))
  23. X=tf.stack((t_room,t_dis,t_chas,t_ptra,x0),axis=1)
  24. tf.random.set_seed(2)
  25. W=tf.random.uniform([5,1],20,60)
  26. msc=[]
  27. #超参数控制
  28. n=float(input("输入学习速率(建议小于0.00006):")) #学习速率
  29. times=int(input("输入迭代次数(建议小于100000):")) #迭代次数
  30. counter=0
  31. percentage=0
  32. for i in range(times):
  33. Y=tf.matmul(X,W)
  34. t=train_y-Y
  35. sq=tf.square(t)
  36. Loss=tf.reduce_mean(sq)/2
  37. msc.append(Loss)
  38. W=W-n*delta(X,W,train_y)
  39. counter+=1
  40. if (counter/times*100)%10==0:
  41. percentage+=10
  42. print("proceeding:%%%d" %(percentage))
  43. print("finished. Graph is loading...")
  44. #测试集数据提取
  45. test_r=tf.constant(test_x[:,5],dtype=tf.float32)
  46. test_d=tf.constant(test_x[:,7],dtype=tf.float32)
  47. test_c=tf.constant(test_x[:,3],dtype=tf.float32)
  48. test_p=tf.constant(test_x[:,10],dtype=tf.float32)
  49. x0=tf.ones(len(test_r),dtype=tf.float32)
  50. #测试集线性归一化
  51. test_r==tf.divide(test_r-tf.reduce_min(test_r), tf.reduce_max(test_r)-tf.reduce_min(test_r))
  52. test_d=tf.divide(test_d-tf.reduce_min(test_d), tf.reduce_max(test_d)-tf.reduce_min(test_d))
  53. test_p=tf.divide(test_p-tf.reduce_min(test_p), tf.reduce_max(test_p)-tf.reduce_min(test_p))
  54. Xt=tf.stack((test_r,test_d,test_c,test_p,x0),axis=1)
  55. Yt=tf.matmul(Xt,W)
  56. plt.figure()
  57. plt.rcParams["font.sans-serif"]=["SimHei"]
  58. plt.subplot(2,1,1)
  59. plt.plot(tf.reshape(msc,[-1]))
  60. plt.ylim(10,40)
  61. plt.xlabel("迭代次数")
  62. plt.ylabel("Loss")
  63. plt.title("损失函数下降曲线")
  64. plt.subplot(2,1,2)
  65. plt.plot(test_y,label="真实数据")
  66. plt.plot(Yt,label="预测数据")
  67. plt.xlabel("数据编号")
  68. plt.ylabel("房价")
  69. plt.title("测试结果")
  70. plt.tight_layout(rect=[0,0,0.95,0.95])
  71. plt.suptitle("四元回归房价预测模型")
  72. plt.legend()
  73. plt.show()

 输入学习速率0.00006,迭代次数30000,得到如下结果:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/333307
推荐阅读
相关标签
  

闽ICP备14008679号