记2(多元线性回归+二元线性回归可视化+三维数据可视化 ...

瑞星  金牌会员 | 2025-1-11 11:52:16 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 798|帖子 798|积分 2394

1、 “维度”:

n维向量:向量中元素的个数为n
多维数组:指的就是shape中的参数个数
x=argmin f(x)的寄义(就是f(x)最小时,x等于多少)

2、多元回归

回归分析中包罗两个(以上)的自变量
   

  • 多元线性回归:因变量与自变量是线性关系
  

  • 一元y=wx+b(二维平面一条线)
  • 二元y=w1x1+w2x2+b(三维空间一个平面,xi中的i是上标是为了和下标区分开,wi的i是下标)
  • 多元y=w1x1+…+wmxm+b(多维空间一个超平面)(xi的i是上标,wi的i是下标
    xi是属性,如:x1:面积,x2:房间数,x3:楼层数…

  

  • 多元线性回归的求解模子

   使用矩阵形式求解

     注意:这种方法求出来,要求(X^T*X)可逆,否则会有多个解(以后办理这个题目)
   

  • 解析法实现多元线性回归
  1. import numpy as np
  2. #加载数据,x1面积,x2房间数,y房价,(见上一图)X是16行3列的矩阵形式,Y是16行1列的矩阵
  3. x1=np.array([137.97,104.50,100.00,124.32,79.20,99.00,124.00,114.00,
  4.             106.69,138.05,53.75,46.91,68.00,63.02,81.26,86.21])
  5. x2=np.array([3,2,2,3,1,2,3,2,2,3,1,1,1,1,2,2])
  6. y=np.array([145.00,110.00,93.00,116.00,65.32,104.00,118.00,91.00,
  7.             62.00,133.00,51.00,45.00,78.50,69.65,75.69,95.30])
  8. X=np.stack((np.ones(len(x1)),x1,x2),axis=1)  #在轴1上堆叠
  9. Y=np.array(y).reshape(-1,1)
  10. #计算模型 W=(X^T*X)^(-1)X^T*Y,同理见上图,
  11. Xt=np.transpose(X)                    #X^T,         X的转置矩阵
  12. XtX_1=np.linalg.inv(np.matmul(Xt,X))  #(X^T*X)^(-1),X乘X的转置,再求逆
  13. XtX_1_Xt=np.matmul(XtX_1, Xt)         #(X^T*X)^(-1)X^T
  14. W=np.matmul(XtX_1_Xt,Y)               #(X^T*X)^(-1)X^T*Y,此时W为3行1列
  15. W=W.reshape(-1)                       #将W转化为1行3列
  16. print("多元线性回归方程:\nY=",W[1],"*x1+",W[2],"*x2+",W[0])
  17. #预测房价
  18. print("请输入服务面积和房间数,预测房屋销售价格:")
  19. x1_test=float(input("商品房面积:"))
  20. x2_test=int(input("房间数:"))
  21. y_pred=W[1]*x1_test+W[2]*x2_test+W[0]
  22. print("预测价格:",round(y_pred,2),"万元")
  23. 输出:
  24. 多元线性回归方程:
  25. Y= 0.5348859949724712 *x1+ 14.331503777673714 *x2+ 11.967290930535984
  26. 请输入服务面积和房间数,预测房屋销售价格:
  27. 商品房面积:140
  28. 房间数:3
  29. 预测价格: 129.85 万元
复制代码


  • 二元线性回归可视化(三维数据可视化:使用mplot3d工具包:from mpl_toolkits.mplot3d import Axes3D)
    散点图:(见下面商品房例子的代码,此处略)
    平/曲面图:
    绘制网格点:X1,X2=np.meshgrid(x1,x2),例如绘制以下平面图:
  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. from mpl_toolkits.mplot3d import Axes3D
  4. x=np.arange(1,5)
  5. y=np.arange(1,5)
  6. X,Y=np.meshgrid(x,y)   #绘制网格点
  7. print(X)
  8. Z=2*X+Y                #绘制z=2*x+y三维图片
  9. fig=plt.figure()
  10. ax3d=Axes3D(fig)        #创建3D绘图对象
  11. ax3d.plot_surface(X,Y,Z,cmap="rainbow")  #颜色映射用彩虹,位置自上而下由红变紫
  12. ax3d.set_xlabel('X')
  13. ax3d.set_ylabel('Y')
  14. ax3d.set_zlabel('Z=2X+Y')
  15. plt.show()
  16. #输出:
  17. [[1 2 3 4]
  18. [1 2 3 4]
  19. [1 2 3 4]
  20. [1 2 3 4]]
复制代码

上面代码修改为(增加颜色块,添加颜色指示条):
  1. ...
  2. x=np.arange(0,10)
  3. y=np.arange(0,10)
  4. X,Y=np.meshgrid(x,y)   #绘制网格点
  5. Z=2*X+Y                #绘制z=2*x+y三维图片
  6. fig=plt.figure()
  7. ax3d=Axes3D(fig)        #创建3D绘图对象
  8. surf=ax3d.plot_surface(X,Y,Z,cmap="rainbow")  #颜色映射用彩虹,位置自上而下由红变紫
  9. fig.colorbar(surf,shrink=0.5,aspect=5)  #绘制颜色指示条,shrink指明颜色条的伸缩比例,aspect颜色条宽度
  10. ax3d.set_xlabel('X')
  11. ax3d.set_ylabel('Y')
  12. ax3d.set_zlabel('Z=2X+Y')
  13. plt.show()
  14. #也可以绘制颜色条并指明颜色字体
  15. # font = {'family' : 'serif',
  16. #         'color'  : 'darkred',
  17. #         'weight' : 'normal',
  18. #         'size'   : 16,
  19. #         }
  20. #fig.colorbar(surf).set_label('colorbar',fontdict=font)
复制代码
shrink1.0; fraction by which to shrink the colorbaraspect20; ratio of long to short dimensions



  • 曲面图:z=sin根号下(x²+y²)
  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. from mpl_toolkits.mplot3d import Axes3D
  4. plt.rcParams['axes.unicode_minus']=False  #设置正常显示负号
  5. x=np.arange(-5,5,0.1)
  6. y=np.arange(-5,5,0.1)
  7. X,Y=np.meshgrid(x,y)   #绘制网格点
  8. Z=np.sin(np.sqrt(X**2+Y**2))                #绘制z=sin根号下(x²+y²)三维图片
  9. fig=plt.figure()
  10. ax3d=Axes3D(fig)        #创建3D绘图对象
  11. ax3d.plot_surface(X,Y,Z,cmap="rainbow")  #颜色映射用彩虹,位置自上而下由红变紫
  12. ax3d.set_xlabel('X')
  13. ax3d.set_ylabel('Y')
  14. ax3d.set_zlabel('Z=2X+Y')
  15. plt.show()
复制代码



  • 线框图
  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. from mpl_toolkits.mplot3d import Axes3D
  4. plt.rcParams['axes.unicode_minus']=False  #设置正常显示负号
  5. x=np.arange(-5,5,0.1)
  6. y=np.arange(-5,5,0.1)
  7. X,Y=np.meshgrid(x,y)   #绘制网格点
  8. Z=np.sin(np.sqrt(X**2+Y**2))                #绘制z=sin根号下(x²+y²)三维图片
  9. fig=plt.figure()
  10. ax3d=Axes3D(fig)        #创建3D绘图对象
  11. ax3d.plot_wireframe(X,Y,Z,color="m",linewidth=0.5)  #线框图
  12. ax3d.set_xlabel('X')
  13. ax3d.set_ylabel('Y')
  14. ax3d.set_zlabel('Z=2X+Y')
  15. plt.show()
复制代码



  • 商品房例子:
    散点图
  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. from mpl_toolkits.mplot3d import Axes3D
  4. #加载数据,x1面积,x2房间数,y房价,(见上一图)X是16行3列的矩阵形式,Y是16行1列的矩阵
  5. x1=np.array([137.97,104.50,100.00,124.32,79.20,99.00,124.00,114.00,
  6.             106.69,138.05,53.75,46.91,68.00,63.02,81.26,86.21])
  7. x2=np.array([3,2,2,3,1,2,3,2,2,3,1,1,1,1,2,2])
  8. y=np.array([145.00,110.00,93.00,116.00,65.32,104.00,118.00,91.00,
  9.             62.00,133.00,51.00,45.00,78.50,69.65,75.69,95.30])
  10. X=np.stack((np.ones(len(x1)),x1,x2),axis=1)  #在轴1上堆叠
  11. Y=np.array(y).reshape(-1,1)
  12. W=np.array([11.96729093,  0.53488599, 14.33150378])
  13. y_pred=W[1]*x1+W[2]*x2+W[0]
  14. #绘制散点图
  15. fig=plt.figure(figsize=(8,6))
  16. ax3d=Axes3D(fig)  #创建3D绘图对象
  17. ax3d.scatter(x1,x2,y,color="b",marker="*") #描点,marker是用描点的点的形状是*
  18. ax3d.set_xlabel('Area',color='r',fontsize=16)  #‘Area'是坐标轴标签文字
  19. ax3d.set_ylabel('Room',color='r',fontsize=16)
  20. ax3d.set_zlabel('Price',color='r',fontsize=16)
  21. ax3d.set_yticks([1,2,3])  #注意:这里是设置坐标y轴的坐标形式(这里是整数)而不是坐标轴范围
  22. ax3d.set_zlim3d(30,160)   #设置z轴的范围为30~60
  23. plt.show()
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

瑞星

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表