当前位置: 首页 > news >正文

Pytorch线性回归模拟

Pytorch线性回归模拟

import torch
from torch.utils.data import TensorDataset # 张量数据集
from torch.utils.data import DataLoader # 数据加载器
from torch import nn ## 神经网络模块 有平方差损失函数MSELoss和假设函数Linear等
from torch import optim # 优化器模块 有SGD等优化器
from sklearn.datasets import make_regression # 生成回归数据集
import matplotlib.pyplot as plt # 绘图库plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False    # 用来正常显示负号"""numpy对象->tensor张量->TensorDataset数据集对象->DataLoader数据加载器
"""def create_dataset():# 生成回归数据集 X: 特征变量, y: 目标变量, coef: 真实回归系数 均为ndarray类型X, y, coef = make_regression(n_samples=100,  # 样本数量n_features=1,   # 特征数量noise=10.0,     # 噪声水平,噪声越大,数据越分散,拟合难度越大,噪声越小,数据越集中coef=True,      # 是否返回真实的回归系数bias=14.5,      # 偏置项random_state=42 # 随机种子)# 转换为张量X_tensor = torch.tensor(X, dtype=torch.float32)y_tensor = torch.tensor(y, dtype=torch.float32).view(-1, 1) # 调整y的形状为列向量 -1: 自动计算该维度大小# 创建TensorDataset对象dataset = TensorDataset(X_tensor, y_tensor)return datasetdef train_model(dataset):# 创建数据加载器  参数1: 数据集对象, 参数2: 批量大小, 参数3: 打乱数据,提高模型泛化能力 (训练集打乱,测试集不打乱)dataloader = DataLoader(dataset, batch_size=16, shuffle=True)# 定义线性回归模型  参数1: 输入特征数量, 参数2: 输出特征数量model = nn.Linear(in_features=1, out_features=1)# 定义损失函数和优化器criterion = nn.MSELoss() # 均方误差损失函数optimizer = optim.SGD(model.parameters(), lr=0.01) # 随机梯度下降优化器, 参数1: 模型参数, 参数2: 学习率# 训练模型 训练轮数,损失列表,总损失,总样本数num_epochs, loss_list, total_loss, total_samples = 100, [], 0.0, 0for epoch in range(num_epochs): # 0,1,2,...,99# 每轮分批次训练,故从数据加载器中获取每个批次的数据  共7批(16个样本/批次,最后1批4个样本)for inputs, targets in dataloader: # inputs: x特征, targets: y目标值# 前向传播outputs = model(inputs) # 计算模型输出即y预测值loss = criterion(outputs, targets) # 计算损失# 反向传播和优化optimizer.zero_grad() # 清零梯度loss.backward()       # 反向传播计算梯度optimizer.step()      # 更新模型参数# 累加损失和样本数#  nn.MSELoss() 的 reduction='mean',返回的是当前批次上每个样本的平均损失, 后面再算每轮的平均损失total_loss += loss.item() * inputs.size(0) # loss.item(): 获取标量损失值total_samples += inputs.size(0) # inputs.size(0) = 批次大小 or 当前批次样本数# 计算并记录每轮的平均损失avg_loss = total_loss / total_samplesloss_list.append(avg_loss)# 重置总损失和样本数total_loss, total_samples = 0.0, 0if (epoch + 1) % 10 == 0:print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {avg_loss:.4f}')# 绘制损失曲线plt.plot(range(1, num_epochs + 1), loss_list, label='训练损失')plt.xlabel('轮数')plt.ylabel('损失')plt.title('线性回归模型训练损失曲线')plt.legend()plt.grid()plt.show()# 绘制预测值与真实值的对比图X_all = dataset.tensors[0]  # 获取所有特征数据y_all = dataset.tensors[1]  # 获取所有目标数据y_pred = model(X_all).detach()  # 模型预测值, detach()分离计算图plt.scatter(X_all.numpy(), y_all.numpy(), label='真实值', color='blue')plt.scatter(X_all.numpy(), y_pred.numpy(), label='预测值', color='red')plt.xlabel('特征 X')plt.ylabel('目标 y')plt.title('线性回归模型预测值与真实值对比')plt.legend()plt.grid()plt.show()if __name__ == '__main__':dataset = create_dataset()train_model(dataset)
http://www.jsqmd.com/news/188057/

相关文章:

  • 第三十五篇:产品增长黑客:数据驱动的用户增长
  • 多语言混合场景下的OCR挑战:HunyuanOCR是如何应对的?
  • 鸿蒙智行2025年全年累计交付58.91万台 同比增长32%
  • 国际奥委会筹备:多国报名表格OCR识别统一赛事管理系统
  • 奥运会奖牌榜自动更新:HunyuanOCR读取赛场公告屏实时数据
  • 【C# 12主构造函数深度解析】:掌握基类调用新姿势,提升代码效率的5大实战技巧
  • 【高性能编程必修课】:为什么顶尖开发者都在用C#不安全类型?
  • 西门子1200伺服步进FB块程序:开箱即用的自动化利器
  • 【脑源定位】基于matlab非负块稀疏贝叶斯学习算法脑电脑源定位【含Matlab源码 14810期】
  • 【C#跨平台调试终极指南】:揭秘.NET开发者必须掌握的5大调试利器
  • CSDN官网技术帖精选:腾讯混元OCR实际应用场景分析
  • 企业内部知识库:员工分享文档OCR识别统一归档管理
  • C#跨平台调试难题如何破局:3个你不知道的高效技巧
  • 还在为日志混乱头疼?,教你用ILogger实现C#全平台统一日志规范
  • java计算机毕业设计学业预警帮扶系统 高校学生学业风险智能监测与干预平台 基于SpringBoot的学业危机预警与导师协同帮扶系统
  • C# 12主构造函数与基类初始化的秘密(资深架构师亲授避坑指南)
  • C#集合表达式合并操作深度解析(99%开发者忽略的关键性能优化)
  • 移动端适配建议:将HunyuanOCR封装为小程序OCR插件
  • 政府信息公开审查:HunyuanOCR辅助人工筛查不宜公开内容
  • PyCharm激活码永不过期?不如试试用AI提升你的开发效率
  • 短视频内容标签:画面中文字OCR识别提升推荐精准度
  • 还在用PostSharp?探索开源免费的C#跨平台方法拦截替代方案(稀缺资源推荐)
  • 图文并茂讲解:如何通过vLLM加速腾讯混元OCR推理过程
  • 【企业级C#架构设计】:5步打造高可用、易维护的模块体系
  • 卫星遥感图像分析:地名标识OCR识别辅助地图更新
  • 二手车交易平台:HunyuanOCR读取行驶证自动生成车况报告
  • 医院挂号窗口提速:患者医保卡OCR识别减少手动输入
  • VS Code调试配置总失败?一文搞定C#跨平台调试环境搭建
  • 动漫字幕组工作流:视频帧截图OCR识别加速字幕制作
  • 会议纪要自动生成:发言人PPT截图→HunyuanOCR提取要点