Lesson9---回归问题

news2024/9/27 19:14:38

9.1 机器学习基础

  • 课程回顾
  1. Python语言基础
  2. Numpy/Matplotlib/Pandas/Pillow应用
  3. TensorFlow2.0 低阶API
  • 即将学习
  1. 机器学习、人工神经网络、深度学习、卷积神经网络
  2. 典型模型的TensorFlow2.0实现

9.1.1 机器学习

  • 机器学习(Machine Learning):是通过学习算法从数据中学习模型的过程。
  • 过程
  1. 建立模型 y = w x + b y=wx+b y=wx+b
  2. 学习模型 确定 w , b w,b wb
  3. 预测房价 使用模型计算算法
  • 学习算法:从数据中产生模型的算法
  • 数据集(data set)/样本集(sample set):用来学习的数据的集合
  • 样本(sample):数据集中的每一条记录,样本由属性和标定组成
  • 属性(attribute):又称为特征(feature):反应样本的表现和性质
  • 标记/标签(label):是预测或者分类的结果
9.1.1.1 监督学习(Supervised Learning)
  • 监督学习(Supervised Learning):对这种有标记的数据集进行的学习称为监督学习,其过程就是对数据的学习,总结出属性和标签之间的关系,也就是模型。

  • 模型/假设(hypothesis)/学习器(learner):估计函数

  • 真相/真实(ground truth):学习到的模型应该逼近真正存在的规律

  • 监督学习可以分为:

  1. 回归(regression):预测连续值
  2. 分类(classfication):预测离散值

在这里插入图片描述

9.1.1.2 无监督学习(Unsupervised Learning)
  • 无监督学习(Unsupervised Learning):在样本数据没有标记的情况下,挖掘出数据内部蕴含的关系
  • 聚类:把相似度高的样本聚合在一起。物以类聚,人以群分,不关心这一类是什么
  • 距离:描述了特征值之间的相似度
9.1.1.3 半监督学习(Semi-Supervised Learning)
  • 将有监督学习和无监督学习相结合
  • 综合使用大量的没有标记数据和少量的有标记数据共同进行学习

9.1.2 机器学习的发展和应用

  • 早期机器学习中符号学习是主流、理论研究和模型研究
  • 统计机器学习八九十年代发展起来,应用研究
  • 机器学习能够抽取出数据中有价值的信息,彰显数据背后的规律,实现大规模的数据识别、分类和预测

9.2 一元线性回归(Simple linear regression)

  • y = w x + b y=wx+b y=wx+b
  1. 模型变量: x x x

  2. 模型参数: w w w为权重(weights)、 b b b为偏置值(bias)

  3. 估计值:
    在这里插入图片描述

  4. 拟合误差/残差:yi-y’i = yi - (wxi+b)
    在这里插入图片描述

  5. 最佳拟合直线应该使得所有点的残差累计值最小

9.2.1 损失函数

9.2.1.1 选择损失函数
  • 如何做到?
  1. 残差和最小
    损失函数/代价函数(Loss/cast function):模型的预测值和真实值的不一致程度
    在这里插入图片描述

  2. 残差绝对值和最小
    在这里插入图片描述

  3. 残差平方和最小
    在这里插入图片描述
    这个loss函数称为平方损失函数(Square Loss),欧氏距离

  4. 均方误差

在这里插入图片描述
在实际的变成应用中,经常使用它作为损失函数

  • 均方误差最小化求解的方法称为最小二乘法(Least Square Method)
9.2.1.2 损失函数的2个性质
  • 非负性:保证样本误差不会相互抵消
  • 一致性:损失函数的值和误差变化一致。单调有界,收敛于0
9.2.1.3 求解阶段

在这里插入图片描述

  • 求极值问题:极值点的偏导数为零
    在这里插入图片描述
    在这里插入图片描述

  • 求解过程不同,得到的解也可能不同
    在这里插入图片描述

  • 其实是等价的,一般使用后面的,比较常用

  • 通过严格的推到计算得到的解称为解析解(Analytical solution),解析解是一个封闭形式的函数,给出任意自变量,就可以通过严格的公式求出准确的因变量,因此,解析解也被称为封闭解/闭式解(Closed-form solution)

9.3 实例:解析法实现一元线性回归

9.3.1 实例:解析法实现一元线性回归(1)

9.3.1.1 实现一个商品房价值评估系统

在这里插入图片描述

  • 步骤
  1. 加载样本数据: x 、 y x、y xy
  2. 学习模型:计算 w , b w,b wb

在这里插入图片描述

  1. 预测房价
    在这里插入图片描述
  • 下面采用Python、Numpy、TensorFlow来实现

9.3.1.1.1 仅Python实现

9.3.1.1.1.1 加载样本数据

# 1 加载样本数据
x = [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 = [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]

9.3.1.1.1.2 学习模型:计算w,b

# 2 学习模型:计算w,b
meanX = sum(x)/len(x)
meanY = sum(y)/len(y)

sumXY = 0.0
sumY = 0.0
for i in range(len(x)):
    sumXY += (x[i]-meanX)*(y[i]-meanY)
    sumY += (x[i]-meanX)*(x[i]-meanX)

w = sumXY/sumY
b = meanY - w*meanX

print("w=",w)
print("b=",b)

print(type(w),type(b))0

输出结果为:

w= 0.8945605120044221
b= 5.410840339418002
<class 'float'> <class 'float'>

9.3.1.1.1.3 预测房价

# 预测房价
x_test = [128.15,45.00,141.43,106.27,99.00,53.84,85.36,70.00]
for i in range(len(x_test)):
    print(x_test[i],"\t",w*x_test[i]+b)

输出结果为:

128.15   120.0487699527847
45.0     45.66606337961699
141.43   131.92853355220342
106.27   100.47578595012793
99.0     93.97233102785579
53.84    53.57397830573609
85.36    81.77052564411547
70.0     68.03007617972756

9.3.1.1.1.4 全部代码记录:

# 1 加载样本数据
x = [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 = [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]

# 2 学习模型:计算w,b
meanX = sum(x)/len(x)
meanY = sum(y)/len(y)

sumXY = 0.0
sumY = 0.0
for i in range(len(x)):
    sumXY += (x[i]-meanX)*(y[i]-meanY)
    sumY += (x[i]-meanX)*(x[i]-meanX)

w = sumXY/sumY
b = meanY - w*meanX

print("w=",w)
print("b=",b)

print(type(w),type(b))

# 预测房价
x_test = [128.15,45.00,141.43,106.27,99.00,53.84,85.36,70.00]
print("面积\t估计房价")
for i in range(len(x_test)):
    print(x_test[i],"\t",round(w*x_test[i]+b,2))

9.3.1.1.2 Numpy实现

9.3.1.1.2.1 加载样本数据

import numpy as np
x = 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])
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])

9.3.1.1.2.2 学习模型:计算w,b

meanX = np.mean(x)
meanY = np.mean(y)

sumXY = np.sum((x-meanX)*(y-meanY))
sumY = np.sum((x-meanX)*(x-meanX))

w = sumXY/sumY
b = meanY - w*meanX

print("w=",w)
print("b=",b)

print(type(w),type(b))

输出结果为:

w= 0.894560512004422
b= 5.410840339418002
<class 'numpy.float64'> <class 'numpy.float64'>

9.3.1.1.2.3 预测房价

x_test = np.array([128.15,45.00,141.43,106.27,99.00,53.84,85.36,70.00])
y_pred = w*x_test + b

print("面积\t估计房价")
for i in range(len(x_test)):
    print(x_test[i],"\t",np.round(y_pred[i],2))

输出结果为:

面积    估计房价
128.15   120.05
45.0     45.67
141.43   131.93
106.27   100.48
99.0     93.97
53.84    53.57
85.36    81.77
70.0     68.03

9.3.1.1.2.4 代码记录全部

import numpy as np
x = 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])
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])

meanX = np.mean(x)
meanY = np.mean(y)

sumXY = np.sum((x-meanX)*(y-meanY))
sumY = np.sum((x-meanX)*(x-meanX))

w = sumXY/sumY
b = meanY - w*meanX

print("w=",w)
print("b=",b)

print(type(w),type(b))

x_test = np.array([128.15,45.00,141.43,106.27,99.00,53.84,85.36,70.00])
y_pred = w*x_test + b

print("面积\t估计房价")
for i in range(len(x_test)):
    print(x_test[i],"\t",np.round(y_pred[i],2))

输出结果为:

w= 0.894560512004422
b= 5.410840339418002
<class 'numpy.float64'> <class 'numpy.float64'>
面积    估计房价
128.15   120.05
45.0     45.67
141.43   131.93
106.27   100.48
99.0     93.97
53.84    53.57
85.36    81.77
70.0     68.03

9.3.1.1.3 Tensorflow实现

9.3.1.1.3.1 加载样本数据

import tensorflow as tf
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])

9.3.1.1.3.2 学习模型:计算w,b

meanX = tf.reduce_mean(x)
meanY = tf.reduce_mean(y)

sumXY = tf.reduce_sum((x-meanX)*(y-meanY))
sumY = tf.reduce_sum((x-meanX)*(x-meanX))

w = sumXY/sumY
b = meanY - w*meanX

print("w=",w.numpy())
print("b=",b.numpy())

print(type(w),type(b))

输出结果为:

w= 0.8945604
b= 5.4108505
<class 'tensorflow.python.framework.ops.EagerTensor'> <class 'tensorflow.python.framework.ops.EagerTensor'>

9.3.1.1.3.3 预测房价

x_test = tf.constant([128.15,45.00,141.43,106.27,99.00,53.84,85.36,70.00])
y_pred = w*x_test + b

print(y_pred)

输出结果为:

tf.Tensor(
[120.04876   45.66607  131.92853  100.475784  93.97233   53.573982
  81.77052   68.030075], shape=(8,), dtype=float32)

9.3.1.1.3.4 所有代码

import tensorflow as tf
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))
sumY = tf.reduce_sum((x-meanX)*(x-meanX))

w = sumXY/sumY
b = meanY - w*meanX

print("w=",w.numpy())
print("b=",b.numpy())

print(type(w),type(b))

x_test = tf.constant([128.15,45.00,141.43,106.27,99.00,53.84,85.36,70.00])
y_pred = w*x_test + b

print(y_pred)

输出结果为

w= 0.8945604
b= 5.4108505
<class 'tensorflow.python.framework.ops.EagerTensor'> <class 'tensorflow.python.framework.ops.EagerTensor'>
tf.Tensor(
[120.04876   45.66607  131.92853  100.475784  93.97233   53.573982
  81.77052   68.030075], shape=(8,), dtype=float32)

9.3.2 实例:解析法实现一元线性回归(2)

  • 不建议直接使用Python列表进行数组运算
  • Numpy和Tensorflow支持对多维数组的高效计算
  • Numpy仅支持CPU计算,不支持GPU、TPU运算
  • Tensorflow支持CPU、GPU高速运算
  • Tensorflow提供了快读搭建复杂模型的高阶API,因此,实际编程中通常使用Tensorflow快速搭建模型,并且利用GPU和TPU资源高速运算,使用Numpy读取和访问数据集,接受从GPU输出的中间结果和最终结果,完成数据交换输入和输出的工作
9.3.2.1 数据和模型可视化

在这里插入图片描述

  • 综合采用Python、Numpy、Tensorflow、Matplotlib实现这个模型
9.3.2.1.1 完整程序实现

9.3.2.1.1.1 导入库,设置字体

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimHei']

9.3.2.1.1.2 创建Tensor张量,加载样本数据

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])

9.3.2.1.1.3 学习模型-计算w、b

# 3 学习模型-计算w、b
meanX = tf.reduce_mean(x)
meanY = tf.reduce_mean(y)

sumXY = tf.reduce_sum((x-meanX)*(y-meanY))
sumY = tf.reduce_sum((x-meanX)*(x-meanX))

w = sumXY/sumY
b = meanY - w*meanX

print("权值w=",w.numpy(),"\n偏置值b=",b.numpy())
print("线性模型:y=",w.numpy(),"* x + ",b.numpy())

输出结果为:

权值w= 0.8945604 
偏置值b= 5.4108505
线性模型:y= 0.8945604 * x +  5.4108505

9.3.2.1.1.4 预测房价

# 4 预测房价
x_test = tf.constant([128.15,45.00,141.43,106.27,99.00,53.84,85.36,70.00])
y_pred = (w*x_test + b).numpy()

print("面积\t估计房价")
n = len(x_test)
for i in range(n):
    print(x_test[i],"\t",round(y_pred[i],2))

输出结果为:

面积    估计房价
tf.Tensor(128.15, shape=(), dtype=float32)       120.05
tf.Tensor(45.0, shape=(), dtype=float32)         45.67
tf.Tensor(141.43, shape=(), dtype=float32)       131.93
tf.Tensor(106.27, shape=(), dtype=float32)       100.48
tf.Tensor(99.0, shape=(), dtype=float32)         93.97
tf.Tensor(53.84, shape=(), dtype=float32)        53.57
tf.Tensor(85.36, shape=(), dtype=float32)        81.77
tf.Tensor(70.0, shape=(), dtype=float32)         68.03

9.3.2.1.1.5 数据和模型可视化

# 5 数据和模型可视化
plt.figure()

plt.scatter(x,y,color="red",label="销售记录")
plt.scatter(x_test,y_pred,color="blue",label="预测房价")
plt.plot(x_test,y_pred,color="green",label="拟合直线",linewidth=2)

plt.xlabel("面积(平方米)",fontsize=14)
plt.ylabel("价格(万元)",fontsize=14)

plt.xlim=(40,150)
plt.ylim=(40,150)

plt.suptitle("商品房销售价格评估系统v1.0",fontsize=20)

plt.legend(loc="upper left")
plt.show()

输出结果为:

在这里插入图片描述
9.3.2.1.1.6 本例全部代码

# 1 导入库,设置字体
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimHei']

# 2 加载样本数据
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])

# 3 学习模型-计算w、b
meanX = tf.reduce_mean(x)
meanY = tf.reduce_mean(y)

sumXY = tf.reduce_sum((x-meanX)*(y-meanY))
sumY = tf.reduce_sum((x-meanX)*(x-meanX))

w = sumXY/sumY
b = meanY - w*meanX

print("权值w=",w.numpy(),"\n偏置值b=",b.numpy())
print("线性模型:y=",w.numpy(),"* x + ",b.numpy())

# 4 预测房价
x_test = tf.constant([128.15,45.00,141.43,106.27,99.00,53.84,85.36,70.00])
y_pred = (w*x_test + b).numpy()

print("面积\t估计房价")
n = len(x_test)
for i in range(n):
    print(x_test[i],"\t",round(y_pred[i],2))

# 5 数据和模型可视化
plt.figure()

plt.scatter(x,y,color="red",label="销售记录")
plt.scatter(x_test,y_pred,color="blue",label="预测房价")
plt.plot(x_test,y_pred,color="green",label="拟合直线",linewidth=2)

plt.xlabel("面积(平方米)",fontsize=14)
plt.ylabel("价格(万元)",fontsize=14)

plt.xlim=(40,150)
plt.ylim=(40,150)

plt.suptitle("商品房销售价格评估系统v1.0",fontsize=20)

plt.legend(loc="upper left")
plt.show()

输出结果为:

权值w= 0.8945604 
偏置值b= 5.4108505
线性模型:y= 0.8945604 * x +  5.4108505
面积    估计房价
tf.Tensor(128.15, shape=(), dtype=float32)       120.05
tf.Tensor(45.0, shape=(), dtype=float32)         45.67
tf.Tensor(141.43, shape=(), dtype=float32)       131.93
tf.Tensor(106.27, shape=(), dtype=float32)       100.48
tf.Tensor(99.0, shape=(), dtype=float32)         93.97
tf.Tensor(53.84, shape=(), dtype=float32)        53.57
tf.Tensor(85.36, shape=(), dtype=float32)        81.77
tf.Tensor(70.0, shape=(), dtype=float32)         68.03

在这里插入图片描述

9.4 多元线性回归

  • 多元回归(Multivariate Regression):回归分析中包括两个或两个以上的自变量

  • 多元线性回归(Multivariate Linear Regression):因变量和自变量之间是线性关系

  • 超平面(Hyperplane):直线在高维空间中的推广

  • 在本课程中,所有的向量都默认是列向量
    在这里插入图片描述

  • 损失函数是所有样本误差的平方和
    在这里插入图片描述
    在这里插入图片描述

  • 使用多元线性回归的时候,直接使用这个解就可以了

  • 如果不喜欢向量的形式,也可以使用矩阵的形式
    在这里插入图片描述

  • 使用这种方式求w时,需要对矩阵 ( X T X ) ({X}^{T}X) (XTX)求逆,要求 ( X T X ) ({X}^{T}X) (XTX)结果必须是满秩的,但是现实任务中,它往往不是满秩的;

  • 例如,一个样本的属性非常多,甚至超过了样本数,导致x的列数多于行数,这就会使得 ( X T X ) ({X}^{T}X) (XTX)不满秩,在这种情况下,可以解出多个 w w w,它们都能使平方损失函数最小化,造成模型不唯一

  • 为了解决这个问题,就需要改变或者调整学习算法,后面的课程中会学习

在这里插入图片描述

  • 这里的维度概念可能会混淆,但是都是对的

9.5 实例:解析法实现多元线性回归

  • 课程回顾
    在这里插入图片描述
  • 例子:仍然使用商品房价格来实验这个
    在这里插入图片描述
  • 多元线性回归分为四步
  1. 加载样本数据
  2. 数据处理
  3. 求解模型参数,学习模型:计算 W = ( X T X ) − 1 X T Y W={({X}^{T}X)}^{-1}{X}^{T}Y W=(XTX)1XTY
  4. 预测房价

9.5.1 加载样本数据

# 1 加载样本数据
import numpy as np
# 房间面积
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])
print(x1.shape,x2.shape,y.shape)

输出结果为:

(16,) (16,) (16,)

9.5.2 数据处理

  • 将输入的数据处理成模型要求的数据格式
    在这里插入图片描述
# 2 数据处理
x0 = np.ones(len(x1))
X = np.stack((x0,x1,x2),axis=1)

在这里插入图片描述

Y = np.array(y).reshape(-1,1)

9.5.3 求解模型参数,计算 W = ( X T X ) − 1 X T Y W={({X}^{T}X)}^{-1}{X}^{T}Y W=(XTX)1XTY

  • W = ( X T X ) − 1 X T Y W={({X}^{T}X)}^{-1}{X}^{T}Y W=(XTX)1XTY
功能函数
矩阵相乘np.matmul()
矩阵转置np.transpose()
矩阵求逆np.linalg.inv()
# 3 求解模型参数
Xt = np.transpose(X) # 计算X'
XtX_1 = np.linalg.inv(np.matmul(Xt,X)) # 计算(X'X)-1
XtX_1_Xt = np.matmul(XtX_1,Xt) # 计算(X'X)-1X'
W = np.matmul(XtX_1_Xt,Y) # 计算(X'X)-1X'Y
W = W.reshape(-1) # 为了方便后面的引用
print(W)

print("多元线性回归方程:")
print("Y=",W[1]," * x1 + ",W[2]," * x2 + ",W[0])

输出结果为:

[11.96729093  0.53488599 14.33150378]
多元线性回归方程:
Y= [0.53488599]  * x1 +  [14.33150378]  * x2 +  [11.96729093]

9.5.4 预测房价

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),"万元")

输出结果为:

请输入房屋面积和房间数,预测房屋销售价格:
商品房面积:120
房间数:4
预测价格: 133.48 万元

9.5.5 该例子完整代码

# 1 加载样本数据
import numpy as np
# 房间面积
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])
print(x1.shape,x2.shape,y.shape)

# 2 数据处理
x0 = np.ones(len(x1))
X = np.stack((x0,x1,x2),axis=1)
Y = np.array(y).reshape(-1,1)

# 3 求解模型参数
Xt = np.transpose(X) # 计算X'
XtX_1 = np.linalg.inv(np.matmul(Xt,X)) # 计算(X'X)-1
XtX_1_Xt = np.matmul(XtX_1,Xt) # 计算(X'X)-1X'
W = np.matmul(XtX_1_Xt,Y) # 计算(X'X)-1X'Y

W = W.reshape(-1) # 为了方便后面的引用
print(W)

print("多元线性回归方程:")
print("Y=",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),"万元")

输出结果为:

(16,) (16,) (16,)
[11.96729093  0.53488599 14.33150378]
多元线性回归方程:
Y= 0.5348859949724712  * x1 +  14.331503777673714  * x2 +  11.96729093053445
请输入房屋面积和房间数,预测房屋销售价格:
商品房面积:120
房间数:4
预测价格: 133.48 万元

9.5.6 Numpy数组运算函数

  • Lesson5相似介绍过
功能函数
数组堆叠np.stack()
改变数组形状np.reshape()
矩阵相乘np.matmul()
矩阵转置np.transpose()
矩阵求逆np.linalg.inv()

9.6 实例:三维模型可视化

9.6.1 二元线性回归可视化

9.6.1.1 加载数据

# 1 加载样本数据
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
# 房间面积
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])

W = np.array([11.96729093,0.53488599,14.33150378])
y_pred = W[1]*x1+W[2]*x2+W[0]
9.6.1.2 绘制散点图
fig = plt.figure(figsize=(8,6))
ax3d = Axes3D(fig)

ax3d.scatter(x1,x2,y,color="b",marker="*")

ax3d.set_xlabel('Area',color='r',fontsize=16)
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)

plt.show()

输出结果为:

在这里插入图片描述

9.6.1.3 整个代码
# 1 加载样本数据
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
# 房间面积
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])

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)
#ax3d.view_init(elev=0,azim=90) # 改变观察视角


ax3d.scatter(x1,x2,y,color="b",marker="*")

ax3d.set_xlabel('Area',color='r',fontsize=16)
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)

plt.show()
9.6.1.4 改变观察视角
view_init(elev,azim)
  • elev:视角的水平高度
  • azim:视角的水平旋转的角度
    如:
ax3d.view_init(elev=0,azim=90) # 改变观察视角

输出为:

在这里插入图片描述

9.6.1.5 绘制平面图
# 1 加载样本数据
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
# 房间面积
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])

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)

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

ax3d.set_xlabel('Area',color='r',fontsize=14)
ax3d.set_ylabel('Room',color='r',fontsize=14)
ax3d.set_zlabel('Price',color='r',fontsize=14)
ax3d.set_yticks([1,2,3]) # 设置y轴的坐标轴刻度,设置的是刻度的显示形式,而不是显示范围

plt.show()

输出结果为:

在这里插入图片描述

9.6.1.6 绘制散点图和线框图
# 1 加载样本数据
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
# 房间面积
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])

W = np.array([11.96729093,0.53488599,14.33150378])

y_pred = W[1]*x1+W[2]*x2+W[0] # 使用模型计算纵坐标

plt.rcParams['font.sans-serif'] = ['SimHei']

X1,X2=np.meshgrid(x1,x2) # 生成网格点的坐标矩阵
Y_PRED = W[1]*X1+W[2]*X2+W[0] # 使用模型计算纵坐标

fig = plt.figure()
ax3d = Axes3D(fig)

ax3d.scatter(x1,x2,y,color="b",marker='*',label="销售记录") #实际房价绘制散点图
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)
ax3d.set_ylabel('Room',color='r',fontsize=14)
ax3d.set_zlabel('Price',color='r',fontsize=14)
ax3d.set_yticks([1,2,3]) # 设置y轴的坐标轴刻度,设置的是刻度的显示形式,而不是显示范围

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

plt.show()

输出结果为:

在这里插入图片描述

9.6.2 三维数据可视化

9.6.2.1 mplot3d工具集
  • 绘制三维图形
  • 内置于Matplotlib
  • Figure对象
  • Axes3d对象;使用之前要导入它
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

fig = plt.figure()
ax3d = Axes3D(fig)
plt.show()

输出为:

在这里插入图片描述

9.6.2.2 绘制散点图–scatter(x,y,z)
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np

x = np.random.uniform(10,40,30)
y = np.random.uniform(100,200,30)
z = np.random.uniform(10,20,30)

fig = plt.figure()
ax3d = Axes3D(fig)

ax3d.scatter(x,y,z,c='b',marker="*")

plt.show()

输出结果为:

在这里插入图片描述

9.6.2.3 绘制散点图–z=2x+y
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np

x = np.random.uniform(10,40,30)
y = np.random.uniform(100,200,30)
z = 2*x+y

fig = plt.figure()
ax3d = Axes3D(fig)

ax3d.scatter(x,y,z,c='b',marker="*")

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

plt.show()

输出结果为:

在这里插入图片描述

  • 还可以绘制平面图、曲面图、线框图,首先要生成平面网格点的坐标矩阵
9.6.2.4 网格点坐标矩阵

在这里插入图片描述

np.meshgrid():生成网格点坐标矩阵
  • 接受两个一维数组,生成两个二维数组
>>> import numpy as np
>>> x = [1,2,3,4] 
>>> y=[4,5,6] 
>>> X,Y=np.meshgrid(x,y) 
>>> X
array([[1, 2, 3, 4],
       [1, 2, 3, 4],
       [1, 2, 3, 4]])
>>> Y
array([[4, 4, 4, 4],
       [5, 5, 5, 5],
       [6, 6, 6, 6]])
9.6.2.5 绘制平面图–z=2x+y
Axes3D.plot_surface():绘制平面/曲面图
  • 测试小代码:
>>> import numpy as np
>>> x = np.arange(1,5) 
>>> y = np.arange(1,5) 
>>> X,Y=np.meshgrid(x,y)
>>> X.shape
(4, 4)
>>> Y.shape
(4, 4)
>>> Z=2*X+Y
>>> Z.shape
(4, 4)
  • 绘制完整代码:
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np

x = np.arange(1,5)
y = np.arange(1,5)
X,Y=np.meshgrid(x,y)
Z = 2*X + Y

fig = plt.figure()
ax3d = Axes3D(fig)

ax3d.plot_surface(X,Y,Z,cmap="rainbow") 
# 按照彩虹的颜色顺序从高到低排序,Z值大靠近红色,Z值小靠近紫色,颜色相同的色块在同一高度上
# 由于只有4*4个数据,所以划分为3*3的九个格子
ax3d.set_xlabel('X')
ax3d.set_ylabel('Y')
ax3d.set_zlabel('Z=2X+Y')

plt.show()

输出结果为:

在这里插入图片描述

  • 可以换成
x = np.arange(1,10)
y = np.arange(1,10)

x = np.arange(1,100.1)
y = np.arange(1,100.1)

试试看
如:

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

x = np.arange(1,10,0.1)
y = np.arange(1,10,0.1)
X,Y=np.meshgrid(x,y)
Z = 2*X + Y

fig = plt.figure()
ax3d = Axes3D(fig)

surf=ax3d.plot_surface(X,Y,Z,cmap="rainbow") 
# 按照彩虹的颜色顺序从高到低排序,Z值大靠近红色,Z值小靠近紫色,颜色相同的色块在同一高度上
# 由于只有4*4个数据,所以划分为3*3的九个格子

fig.colorbar(surf,shrink=0.5,aspect=5) # 在图的旁边显示颜色指示条

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

plt.show()

输出结果为:

在这里插入图片描述

9.6.2.6 绘制线框图–z=2x+y
  • 绘制线框图和绘制平民图方式基本完全一样
  • 只需要修改绘制函数即可
Axes3D.plot_wireframe()
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np

x = np.arange(1,10,0.1)
y = np.arange(1,10,0.1)
X,Y=np.meshgrid(x,y)
Z = 2*X + Y

fig = plt.figure()
ax3d = Axes3D(fig)

ax3d.plot_wireframe(X,Y,Z,color='r',linewidth =0.5) 

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

plt.show()

输出结果为:

在这里插入图片描述

9.6.2.7 绘制曲面图- z = s i n ( x 2 + y 2 ) 1 / 2 z={sin({x}^{2}+{y}^{2})}^{1/2} z=sin(x2+y2)1/2
  • 和绘制平面的方法完全一样
  • 只要z是一个表示曲面的方程
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np

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))

fig = plt.figure()
ax3d = Axes3D(fig)

surf=ax3d.plot_surface(X,Y,Z,cmap="rainbow") 
# 按照彩虹的颜色顺序从高到低排序,Z值大靠近红色,Z值小靠近紫色,颜色相同的色块在同一高度上
# 由于只有4*4个数据,所以划分为3*3的九个格子

fig.colorbar(surf,shrink=0.5,aspect=5) # 在图的旁边显示颜色指示条

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

plt.show()

输出结果为:

在这里插入图片描述

9.6.2.7 绘制曲面线框图- z = s i n ( x 2 + y 2 ) 1 / 2 z={sin({x}^{2}+{y}^{2})}^{1/2} z=sin(x2+y2)1/2
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np

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))

fig = plt.figure()
ax3d = Axes3D(fig)

ax3d.plot_wireframe(X,Y,Z,color='r',linewidth =0.5) 

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

plt.show()

输出结果为:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/375981.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023年湖北七大员证书查询网站是哪里?

一、湖北七大员是哪七大员&#xff1f; 湖北七大员分别是&#xff1a;施工员、质量员、资料员、材料员、标准员、劳务员和机械员。其中施工员和质量员分为&#xff1a;市政、土建、装饰装修和设备安装四个子专业&#xff0c;其他不分。 二、湖北七大员证书查询网站是哪里&#…

Node下载阿里OSS存储文件【不知目录结构】

前言&#xff1a;前端传模型ID&#xff0c;后台根据ID去阿里OSS存储下载对应文件&#xff08;不知文件内部层级结构&#xff0c;且OSS只能单个文件下载&#xff09;&#xff0c;打包成zip字节流形式返回给前端下载。 需求分析&#xff1a; 生成OSS文件关系树Node做文件下载存…

ClickHouse 相关面试题

文章目录什么是 ClickHouse&#xff0c;它的特点是什么&#xff1f;ClickHouse的数据存储方式是什么&#xff0c;它与传统的行式存储有什么区别&#xff1f;ClickHouse 引擎ClickHouse的数据模型是什么&#xff0c;它与传统的关系型数据库的数据模型有什么区别&#xff1f;Clic…

【TVM 学习资料】TensorIR 快速入门

本篇文章译自英文文档 Blitz Course to TensorIR 作者是 Siyuan Feng。更多 TVM 中文文档可访问→TVM 中文站 TensorIR 是深度学习领域的特定语言&#xff0c;主要有两个作用&#xff1a; 在各种硬件后端转换和优化程序。自动 tensorized 程序优化的抽象。 import tvm from…

kafka(一) 的架构,各概念

Kafka架构 Kafak 总体架构图中包含多个概念&#xff1a; &#xff08;1&#xff09;ZooKeeper&#xff1a;Zookeeper负责保存broker集群元数据&#xff0c;并对控制器进行选举等操作。 &#xff08;2&#xff09;Producer&#xff1a; 生产者负责创建消息&#xff0c;将消息发…

Kafka 概述

文章目录Kafka定义消息队列消息队列应用场景缓冲/消峰 场景解耦 场景异步通信 场景消息队列两种模式点对点模式发布/订阅模式 ***kafka基础架构Kafka定义 消息队列 目前企业中比较常见的消息队列产品主要有 Kafka、ActiveMQ 、RabbitMQ 、RocketMQ 等。在大数据场景主要采用 Ka…

I.MX6ULL内核开发11:使用设备树实现RGB灯驱动

目录 一、实验说明 二、硬件原理图分析 2.1 打开原理图&#xff0c;找到rgb部分 2.2 对RGB的R灯进行寄存器设置 2.2.1 时钟配置 2.2.2 引脚复用GPIO 2.2.3 引脚属性设置 2.2.4 输出电平设置 三、实验代码 3.1 编程思路 3.2 代码分析 3.2.1 添加RGB设备节点 3.2.2 编…

openlayers加载离线地图并实现深色地图

问题背景 我们自己一直使用的openlayergeoserver自己发布的地图&#xff0c;使用的是矢量地图。但是由于政府地图大都使用为天地图&#xff0c;所以需要将geoserver的矢量地图更改为天地图&#xff0c;并且依旧是搭配openlayers来使用。 解决步骤 一&#xff1a;加载离线地图&a…

ubuntu20.04安装nginx一系列问题

当初做一个项目的时候给linux装nginx遇到了很多问题&#xff0c;当初边搞边记录&#xff0c;这两天翻看项目笔记的时候找出来了&#xff0c;就把这一部分分享出来给大家看看 ubuntu20.04 LTS 安装yum无法定位软件包 备份原来的软件源 sudo cp /etc/apt/sources.list /etc/ap…

目前软搭建测试的行业现状和前景

软件测试的发展前景和行业现状 1. 软件测试的工资情况 软件测试的方向&#xff1a;功能>>>接口>>>性能>>>自动化>>>测开>>>人生巅峰 功能测试:曾经互联网缺口和软件测试缺口非常大&#xff0c;因此功能测试越来越多。可是20…

Linux-编写一个自己的命令

前言&#xff08;1&#xff09;在Linux中&#xff0c;我们对文件路径进行操作都需要输入命令。那么&#xff0c;有人可能就会有疑惑了&#xff0c;命令是什么东西&#xff1f;我们是否也可以创造出自己的命令呢&#xff1f;答案是可以的。命令本身其实就是可执行文件。但是与普…

使用docker pull 跨系统架构拉取镜像

使用docker pull 跨系统架构拉取镜像使用docker pull 跨系统架构拉取镜像docker hub上找到相应的镜像在个人电脑中的执行拉取镜像命令&#xff1a;执行查看镜像命令&#xff1a;执行检查镜像命令&#xff1a;执行保存镜像命令&#xff1a;使用docker pull 跨系统架构拉取镜像 …

【C语言编译器】03 Linux GCC 初探

一、准备工作 简单介绍&#xff0c;马上出 GCC 系列。本文非常浅显。 Linux系统常用来用作服务器&#xff0c;其中最常用的发行版是CentOS、Ubuntu、Debian等。 尽管很多C语言IDE都有Linux版本&#xff0c;比如VS、CLion的Linux版。但作为服务器的Linux通常没有GUI界面&…

腾讯TIM实现即时通信 v3+ts实践

目录 初始化sdk 功能描述 初始化 准备 SDKAppID 调用初始化接口 监听事件 发送消息 创建消息 创建文本消息 登录登出 功能描述 登录 登出 销毁 登录设置 获取会话列表 功能描述 获取会话列表 获取全量的会话列表 历史消息 功能描述 拉取消息列表 分页拉取…

自动驾驶自主避障概况

文章目录前言1. 自主避障在自动驾驶系统架构中的位置2. 自主避障算法分类2.1 人工势场法&#xff08;APF&#xff09;2.1.1引力势场的构建2.1.2斥力势场的构建2.1.3人工势场法的改进2.2 TEB&#xff08;Timed-Eastic-Band, 定时弹性带&#xff09;2.3 栅格法2.4 向量场直方图(V…

Linux 之 大数据定制篇-shell 编程

文章目录1 为什么要学习 Shell 编程2 Shell 是什么&#xff1f;3 Shell 脚本的执行方式3.1 脚本格式要求3.2 编写第一个 Shell 脚本3.3 脚本的常用执行方式4 Shell 的变量4.1 Shell 变量介绍4.2 shell 变量的定义4.3 shell 变量的定义5 设置环境变量5.1 基本语法5.2 快速入门6 …

【AI绘画】秒级出图 快速生成大师级画作

最近闲来无事&#xff0c;在网上体验了一下各种AI绘画工具。 根据输入的描述语快速生成自己想要的图片&#xff0c;听着还是很不错的&#xff01;想要啥图片就可以生成啥图片&#xff1f;于是&#xff0c;期待满满的搞起来了~ 可是真当体验了一下之后… 这生成的啥呢&#xf…

广泛运用在工业、轨道交通、监狱的ip对讲终端

ip网络对讲系统是不同于传统广播、调频寻址广播和数控广播的产品&#xff0c;它是基于IP数据网络&#xff0c;将音频信号经过数字编码以数据包形式按TCP\IP协议在局域网或广域网上传送&#xff0c;再由终端解码的纯数字化单向&#xff0c;双向及多向音频扩声系统。 本产品是新一…

多表left join 慢sql问题

作为个人记录&#xff0c;后续再填坑a对p是1对多 ,p对llup 1对多SELECTa.id,p.id,t1.id FROMliv_series_product aINNER JOIN liv_product p ON p.id a.product_idLEFT JOIN ( SELECT llup.id, llup.product_id, llup.room_id FROM liv_live_user_product llup WHERE llup.ro…

超声功率放大器原理(超声功率放大器的作用是什么)

超声功率放大器是电子实验室中比较常见的测量仪器&#xff0c;虽然很多工程师频繁使用&#xff0c;但是对于超声功率放大器的了解却不够。下面就让安泰电子来为大家科普超声功率放大器原理和作用的内容。超声功率放大器是什么&#xff1a;超声功率放大器是一种用于提高超声波能…