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

发布于:2025-02-10 ⋅ 阅读:(67) ⋅ 点赞:(0)

1、 “维度”:

n维向量:向量中元素的个数为n
多维数组:指的就是shape中的参数个数
x=argmin f(x)的含义(就是f(x)最小时,x等于多少)
在这里插入图片描述

2、多元回归

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

  • 多元线性回归:因变量与自变量是线性关系
  1. 一元y=wx+b(二维平面一条线)
  2. 二元y= w 1 w_{1} w1* x 1 x_{1} x1+ w 2 w_{2} w2* x 2 x_{2} x2+b(三维空间一个平面)
  3. 多元y= w 1 w_{1} w1* x 1 x_{1} x1+…+ w m w_{m} wm* x m x_{m} xm+b(多维空间一个超平面)
    如下图:y:商品楼价格, x 1 x_{1} x1:面积, x 2 x_{2} x2:房间数, x 3 x_{3} x3:楼层数…,将Loss定义为 y的方差
    在这里插入图片描述
    损失函数可以用矩阵表示为: L o s s = ( Y − X W ) T ( Y − X W ) Loss=(Y-XW)^T(Y-XW) Loss=(YXW)T(YXW)
  • 多元线性回归的求解模型

需要求解参数矩阵W的值,使得Loss最小?,所以使用Loss对W求偏导:
在这里插入图片描述
使用矩阵形式求解
在这里插入图片描述

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

2.1、解析法实现多元线性回归

import numpy as np
#加载数据,x1面积,x2房间数,y房价,(见上一图)X是16行3列的矩阵形式,Y是16行1列的矩阵
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])
X=np.stack((np.ones(len(x1)),x1,x2),axis=1)  #在轴1上堆叠
Y=np.array(y).reshape(-1,1)
#计算模型 W=(X^T*X)^(-1)X^T*Y,同理见上图,
Xt=np.transpose(X)                    #X^T,         X的转置矩阵
XtX_1=np.linalg.inv(np.matmul(Xt,X))  #(X^T*X)^(-1),X乘X的转置,再求逆
XtX_1_Xt=np.matmul(XtX_1, Xt)         #(X^T*X)^(-1)X^T
W=np.matmul(XtX_1_Xt,Y)               #(X^T*X)^(-1)X^T*Y,此时W为3行1列
W=W.reshape(-1)                       #将W转化为1行3列
print("多元线性回归方程:\nY=",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),"万元")


输出:
多元线性回归方程:
Y= 0.5348859949724712 *x1+ 14.331503777673714 *x2+ 11.967290930535984
请输入服务面积和房间数,预测房屋销售价格:
商品房面积:140
房间数:3
预测价格: 129.85 万元

2.2、二元线性回归可视化

(三维数据可视化:使用mplot3d工具包:from mpl_toolkits.mplot3d import Axes3D)

2.2.1、散点图:(见下面商品房例子的代码,此处略)

平/曲面图:
绘制网格点:X1,X2=np.meshgrid(x1,x2),例如绘制以下平面图:

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

x=np.arange(1,5)
y=np.arange(1,5)
X,Y=np.meshgrid(x,y)   #绘制网格点
print(X)
Z=2*X+Y                #绘制z=2*x+y三维图片

fig=plt.figure()
ax3d=Axes3D(fig)        #创建3D绘图对象
ax3d.plot_surface(X,Y,Z,cmap="rainbow")  #颜色映射用彩虹,位置自上而下由红变紫

ax3d.set_xlabel('X')
ax3d.set_ylabel('Y')
ax3d.set_zlabel('Z=2X+Y')

plt.show()
#输出:
[[1 2 3 4]
 [1 2 3 4]
 [1 2 3 4]
 [1 2 3 4]]

在这里插入图片描述
上面代码修改为(增加颜色块,添加颜色指示条):

...
x=np.arange(0,10)
y=np.arange(0,10)
X,Y=np.meshgrid(x,y)   #绘制网格点
Z=2*X+Y                #绘制z=2*x+y三维图片

fig=plt.figure()
ax3d=Axes3D(fig)        #创建3D绘图对象
surf=ax3d.plot_surface(X,Y,Z,cmap="rainbow")  #颜色映射用彩虹,位置自上而下由红变紫
fig.colorbar(surf,shrink=0.5,aspect=5)  #绘制颜色指示条,shrink指明颜色条的伸缩比例,aspect颜色条宽度

ax3d.set_xlabel('X')
ax3d.set_ylabel('Y')
ax3d.set_zlabel('Z=2X+Y')

plt.show()
#也可以绘制颜色条并指明颜色字体
# font = {'family' : 'serif',
#         'color'  : 'darkred',
#         'weight' : 'normal',
#         'size'   : 16,
#         }
#fig.colorbar(surf).set_label('colorbar',fontdict=font)
shrink 1.0; fraction by which to shrink the colorbar
aspect 20; ratio of long to short dimensions

在这里插入图片描述

2.2.2、曲面图:z=sin根号下(x²+y²)

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
plt.rcParams['axes.unicode_minus']=False  #设置正常显示负号

x=np.arange(-5,5,0.1)
y=np.arange(-5,5,0.1)
X,Y=np.meshgrid(x,y)   #绘制网格点
Z=np.sin(np.sqrt(X**2+Y**2))                #绘制z=sin根号下(x²+y²)三维图片

fig=plt.figure()
ax3d=Axes3D(fig)        #创建3D绘图对象
ax3d.plot_surface(X,Y,Z,cmap="rainbow")  #颜色映射用彩虹,位置自上而下由红变紫

ax3d.set_xlabel('X')
ax3d.set_ylabel('Y')
ax3d.set_zlabel('Z=2X+Y')

plt.show()

在这里插入图片描述

2.2.3、线框图

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
plt.rcParams['axes.unicode_minus']=False  #设置正常显示负号

x=np.arange(-5,5,0.1)
y=np.arange(-5,5,0.1)
X,Y=np.meshgrid(x,y)   #绘制网格点
Z=np.sin(np.sqrt(X**2+Y**2))                #绘制z=sin根号下(x²+y²)三维图片

fig=plt.figure()
ax3d=Axes3D(fig)        #创建3D绘图对象
ax3d.plot_wireframe(X,Y,Z,color="m",linewidth=0.5)  #线框图

ax3d.set_xlabel('X')
ax3d.set_ylabel('Y')
ax3d.set_zlabel('Z=2X+Y')

plt.show()

在这里插入图片描述

2.3、商品房例子:

2.3.1、散点图

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

#加载数据,x1面积,x2房间数,y房价,(见上一图)X是16行3列的矩阵形式,Y是16行1列的矩阵
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])
X=np.stack((np.ones(len(x1)),x1,x2),axis=1)  #在轴1上堆叠
Y=np.array(y).reshape(-1,1)
W=np.array([11.96729093,  0.53488599, 14.33150378])
y_pred=W[1]*x1+W[2]*x2+W[0]

#绘制散点图
fig=plt.figure(figsize=(8,6))
ax3d=Axes3D(fig)  #创建3D绘图对象

ax3d.scatter(x1,x2,y,color="b",marker="*") #描点,marker是用描点的点的形状是*

ax3d.set_xlabel('Area',color='r',fontsize=16)  #‘Area'是坐标轴标签文字
ax3d.set_ylabel('Room',color='r',fontsize=16)
ax3d.set_zlabel('Price',color='r',fontsize=16)
ax3d.set_yticks([1,2,3])  #注意:这里是设置坐标y轴的坐标形式(这里是整数)而不是坐标轴范围
ax3d.set_zlim3d(30,160)   #设置z轴的范围为30~60

plt.show()

在这里插入图片描述

  • 改变视角:view_init(elev,azim) elev表示视角的水平高度,azim表示水平旋转的角度,例如在上面代码的“ax3d=Axes3D(fig) ”下一行加上“ax3d.view_init(elev=0,azim=-90)”的输出图(就是一元线性回归,3D图有视觉偏差):
    在这里插入图片描述

2.3.2、平面图

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

#加载数据,x1面积,x2房间数,y房价,X是16行3列的矩阵形式,Y是16行1列的矩阵
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])
X=np.stack((np.ones(len(x1)),x1,x2),axis=1)  #在轴1上堆叠
Y=np.array(y).reshape(-1,1)
W=np.array([11.96729093,  0.53488599, 14.33150378])
#绘制散点图
X1,X2=np.meshgrid(x1,x2)  #绘制网格点
Y_PRED=W[1]*X1+W[2]*X2+W[0]

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

ax3d.plot_surface(X1, X2, Y_PRED, cmap="coolwarm") #绘图,颜色方案选择coolwarm

ax3d.set_xlabel('Area',color='r',fontsize=14)  #‘Area'是坐标轴标签文字
ax3d.set_ylabel('Room',color='r',fontsize=14)
ax3d.set_zlabel('Price',color='r',fontsize=14)
ax3d.set_yticks([1,2,3])  #注意:这里是设置坐标y轴的坐标形式(这里是整数)而不是坐标轴范围
ax3d.set_zlim3d(30,160)   #设置z轴的范围为30~60

plt.show()

如下图,由于y轴(房间数Room)只有1、2、3共三个值,所以划分2部分,而x轴(Area面积)不均匀的,所以划分也不均匀:
在这里插入图片描述

2.3.3、散点图和线框图共同显示

线框图:plot_wireframe():

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
plt.rcParams["font.family"] = "SimHei"

#加载数据,x1面积,x2房间数,y房价,(见上一图)X是16行3列的矩阵形式,Y是16行1列的矩阵
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])
X=np.stack((np.ones(len(x1)),x1,x2),axis=1)  #在轴1上堆叠
Y=np.array(y).reshape(-1,1)
W=np.array([11.96729093,  0.53488599, 14.33150378])
#绘制散点图
X1,X2=np.meshgrid(x1,x2)  #绘制网格点
y_pred=W[1]*x1+W[2]*x2+W[0]
Y_PRED=W[1]*X1+W[2]*X2+W[0]

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

ax3d.scatter(x1,x2,y,color="b",marker="*",label="销售记录") #散点图——真实值,marker是用描点的点的形状是*
ax3d.scatter(x1,x2,y_pred,color="r",label="预测房价") 
ax3d.plot_wireframe(X1, X2, Y_PRED,color="c",linewidth=0.5,label="拟合平面") #线框图

ax3d.set_xlabel('Area',color='r',fontsize=14)  #‘Area'是坐标轴标签文字
ax3d.set_ylabel('Room',color='r',fontsize=14)
ax3d.set_zlabel('Price',color='r',fontsize=14)
ax3d.set_yticks([1,2,3])  #注意:这里是设置坐标y轴的坐标形式(这里是整数)而不是坐标轴范围
ax3d.set_zlim3d(30,160)   #设置z轴的范围为30~60

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

在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到