前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >机器学习-05-回归算法-python动画展示

机器学习-05-回归算法-python动画展示

作者头像
用户2225445
发布2025-03-15 21:45:45
发布2025-03-15 21:45:45
12100
代码可运行
举报
文章被收录于专栏:IT从业者张某某IT从业者张某某
运行总次数:0
代码可运行

本门课程的目标

完成一个特定行业的算法应用全过程:

懂业务+会选择合适的算法+数据处理+算法训练+算法调优+算法融合 +算法评估+持续调优+工程化接口实现

机器学习定义

关于机器学习的定义,Tom Michael Mitchell的这段话被广泛引用: 对于某类任务T性能度量P,如果一个计算机程序在T上其性能P随着经验E而自我完善,那么我们称这个计算机程序从经验E中学习

回归算法

导入依赖
代码语言:javascript
代码运行次数:0
运行
复制
# 导入依赖
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
import time
plt.rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体 # 解决中文乱码问题(仅针对windows电脑)
plt.rcParams['axes.unicode_minus'] = False  # 解决负号无法显示问题
生成模拟数据
代码语言:javascript
代码运行次数:0
运行
复制
# 生成模拟数据
np.random.seed(42)
X = np.linspace(0, 10, 100)
X

输出为

生成y值

代码语言:javascript
代码运行次数:0
运行
复制
# 根据x生成y
true_slope = 2.5 # 斜率
true_intercept = 1.0 #  截距
# y = true_slope * X + true_intercept + np.random.normal(0, 2, len(X))*2
y = true_slope * np.power(X,2)*0.8  + true_intercept + np.random.normal(0, 2, len(X)) - + np.random.normal(0, 2, len(X))
y

输出为

绘制动图
代码语言:javascript
代码运行次数:0
运行
复制
# 初始化画布
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))
fig.suptitle("线性回归模型动态演示", fontsize=14)

输出为

代码语言:javascript
代码运行次数:0
运行
复制
# 绘制左边的子图
# 因为画布只展示一次,每次都要重新绘制
# 初始化画布
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))
fig.suptitle("线性回归模型动态演示", fontsize=14)
# 左图:数据点和拟合直线
ax1.set_xlim(0, 10)
ax1.set_ylim(np.min(y)-2, np.max(y)+2)
ax1.set_xlabel("X")
ax1.set_ylabel("y")
scatter = ax1.scatter(X, y, c="blue", alpha=0.6, label="数据点")
#lw是线宽
line, = ax1.plot([], [], 'r-', lw=2, label="拟合直线") 
ax1.legend()


plt.show()

输出为:

代码语言:javascript
代码运行次数:0
运行
复制
# 绘制右边的子图
# 因为画布只展示一次,每次都要重新绘制
# 初始化画布
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))
fig.suptitle("线性回归模型动态演示", fontsize=14)
# 左图:数据点和拟合直线
ax1.set_xlim(0, 10)
ax1.set_ylim(np.min(y)-2, np.max(y)+2)
ax1.set_xlabel("X")
ax1.set_ylabel("y")
scatter = ax1.scatter(X, y, c="blue", alpha=0.6, label="数据点")
#lw是线宽
line, = ax1.plot([], [], 'r-', lw=2, label="拟合直线") 
ax1.legend()

# 右图:损失函数(MSE)随迭代的变化
ax2.set_xlim(0, 100)
ax2.set_ylim(0, 800)
ax2.set_xlabel("迭代次数")
ax2.set_ylabel("均方误差 (MSE)")
loss_line, = ax2.plot([], [], 'g-', lw=2, label="MSE")
ax2.legend()


plt.show()

输出为:

代码语言:javascript
代码运行次数:0
运行
复制
# 为解决jupyter中不显示动图问题,采取的方案
# %pylab 魔法命令可以使numpy和matplotlib中的科学计算功能生效,
# 这些功能被称为基于向量和矩阵的高效操作,交互可视化特性。
# 它能够让我们在控制台进行交互式计算和动态绘图。 
from matplotlib import pylab
%pylab

# 因为画布只展示一次,每次都要重新绘制
# 初始化画布
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))
fig.suptitle("线性回归模型动态演示", fontsize=14)
# 左图:数据点和拟合直线
ax1.set_xlim(0, 10)
ax1.set_ylim(np.min(y)-2, np.max(y)+2)
ax1.set_xlabel("X")
ax1.set_ylabel("y")
scatter = ax1.scatter(X, y, c="blue", alpha=0.6, label="数据点")
#lw是线宽
line, = ax1.plot([], [], 'r-', lw=2, label="拟合直线") 
ax1.legend()

# 右图:损失函数(MSE)随迭代的变化
ax2.set_xlim(0, 100)
ax2.set_ylim(0, 800)
ax2.set_xlabel("迭代次数")
ax2.set_ylabel("均方误差 (MSE)")
loss_line, = ax2.plot([], [], 'g-', lw=2, label="MSE")
ax2.legend()

# 初始化参数和损失记录
current_slope = 0.0 # 斜率
current_intercept = 0.0 # 截距
mse_history = []

# 梯度下降参数
learning_rate = 0.02
n_iterations = 100

# 动画更新函数 frame是帧数
def update(frame):
    global current_slope, current_intercept
    
    # 计算梯度
    y_pred = current_slope * X + current_intercept
    # y_pred = current_slope * np.power(X,2) + current_intercept
    error = y_pred - y
    grad_slope = 2 * np.mean(error * X) # slope是斜率
    grad_intercept = 2 * np.mean(error) # intercept是截距
    
    # 更新参数
    current_slope -= learning_rate * grad_slope # current_slope是斜率  
    current_intercept -= learning_rate * grad_intercept # current_intercept是截距
    
    # 计算当前MSE
    mse = np.mean(error**2) # 均方误差
    mse_history.append(mse) #   均方误差
    
    # 更新左图:拟合直线
    # set_data()是一个元组,set_data()[0]是直线的x坐标,set_data()[1]是直线的y坐标
    # 当x为0时,y为current_intercept,当x为10时,y为current_slope*10 + current_intercept
    line.set_data([0, 10], [current_intercept, current_slope*10 + current_intercept])
    # line.set_data([0, 10], [current_intercept, current_slope*np.power(10,2) + current_intercept])
    
    # 更新右图:损失曲线 
    loss_line.set_data(np.arange(len(mse_history)), mse_history)
    ax2.set_xlim(0, len(mse_history)+5)
    
    # 添加动态文本
    ax1.set_title(f"斜率: {current_slope:.2f}, 截距: {current_intercept:.2f}")
    ax2.set_title(f"当前MSE: {mse:.2f}")
    
    # time.sleep(0.5)

    return line, loss_line#, scatter


# 创建动画
# frames是帧数,interval是间隔时间,blit是是否只更新变化的部分
ani = FuncAnimation(fig, update, frames=n_iterations, interval=100, blit=False)
plt.tight_layout() # 调整布局


plt.show()

输出为:

完整代码
代码语言:javascript
代码运行次数:0
运行
复制
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
import time
import math
import scipy

plt.rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体 # 解决中文乱码问题(仅针对windows电脑)
plt.rcParams['axes.unicode_minus'] = False  # 解决负号无法显示问题

# 生成模拟数据
np.random.seed(42)
X = np.linspace(0, 10, 100)

# 数据归一化
# X_normalized = (X - np.min(X)) / (np.max(X) - np.min(X))

true_slope = 2.5
true_intercept = 1.0
# y = true_slope * X + true_intercept + np.random.normal(0, 2, len(X))*2
y = true_slope * np.power(X,2)*0.8  + true_intercept + np.random.normal(0, 2, len(X)) - + np.random.normal(0, 2, len(X))



# 初始化画布
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))
fig.suptitle("线性回归模型动态演示", fontsize=14)

# 左图:数据点和拟合直线
ax1.set_xlim(0, 10)
ax1.set_ylim(np.min(y)-2, np.max(y)+2)
ax1.set_xlabel("X")
ax1.set_ylabel("y")
scatter = ax1.scatter(X, y, c="blue", alpha=0.6, label="数据点")
#lw是线宽
line, = ax1.plot([], [], 'r-', lw=2, label="拟合直线") 
ax1.legend()

# 右图:损失函数(MSE)随迭代的变化
ax2.set_xlim(0, 100)
ax2.set_ylim(0, 800)
ax2.set_xlabel("迭代次数")
ax2.set_ylabel("均方误差 (MSE)")
loss_line, = ax2.plot([], [], 'g-', lw=2, label="MSE")
ax2.legend()

# 初始化参数和损失记录
current_slope = 0.0 # 斜率
current_intercept = 0.0 # 截距
mse_history = []

# 梯度下降参数
learning_rate = 0.02
n_iterations = 100

# 动画更新函数 frame是帧数
def update(frame):
    global current_slope, current_intercept
    
    # 计算梯度
    y_pred = current_slope * X + current_intercept
    # y_pred = current_slope * np.power(X,2) + current_intercept
    error = y_pred - y
    grad_slope = 2 * np.mean(error * X) # slope是斜率
    grad_intercept = 2 * np.mean(error) # intercept是截距
    
    # 更新参数
    current_slope -= learning_rate * grad_slope # current_slope是斜率  
    current_intercept -= learning_rate * grad_intercept # current_intercept是截距
    
    # 计算当前MSE
    mse = np.mean(error**2) # 均方误差
    mse_history.append(mse) #   均方误差
    
    # 更新左图:拟合直线
    # set_data()是一个元组,set_data()[0]是直线的x坐标,set_data()[1]是直线的y坐标
    # 当x为0时,y为current_intercept,当x为10时,y为current_slope*10 + current_intercept
    line.set_data([0, 10], [current_intercept, current_slope*10 + current_intercept])
    # line.set_data([0, 10], [current_intercept, current_slope*np.power(10,2) + current_intercept])
    
    # 更新右图:损失曲线 
    loss_line.set_data(np.arange(len(mse_history)), mse_history)
    ax2.set_xlim(0, len(mse_history)+5)
    
    # 添加动态文本
    ax1.set_title(f"斜率: {current_slope:.2f}, 截距: {current_intercept:.2f}")
    ax2.set_title(f"当前MSE: {mse:.2f}")
    
    # time.sleep(0.5)

    return line, loss_line#, scatter

# 创建动画
# frames是帧数,interval是间隔时间,blit是是否只更新变化的部分
ani = FuncAnimation(fig, update, frames=n_iterations, interval=100, blit=False)
plt.tight_layout() # 调整布局
plt.show()
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-03-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 本门课程的目标
  • 机器学习定义
  • 回归算法
    • 导入依赖
    • 生成模拟数据
    • 绘制动图
    • 完整代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档