线性回归训练流程

线性回归算法从零开始实现(pytorch) 这无疑给我们带来了很多问题。分类的输出是离散的,回归的输出是连续的(注意不是传统数学意义上的离散和连续,分类需要输出的是类别,不同类别明显有着区别,是一种定性的问题,而回归问题获得的是一个在某个合理范围内都可以回归出来的一个结果,是一个定量的值)a是一个四维张量,可以理解为四张三通道像素值为28x28的图片,第一个维度的元素是4,排列着四张图片,第二个维度上的元素是上,意味着三个通道,后面两个维度代表像素值。这里我们是实现线性回归算法,故我们的模型当然也要定义为线性模型,这个没什么好说的,也就两行代码。 阅读详情

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

目录

一、线性回归的完整训练流程

二、步骤

1.数据生成 

2.数据加载器

功能

3.线性模型 (fun) 和 损失函数 (maeloss)

功能

4.随机梯度下降 (sgd)

功能

5.模型训练

训练过程

6.参数对比

7.可视化结果

功能

总结


 

一、线性回归的完整训练流程

包括数据生成、批量数据加载、模型定义、损失计算、梯度更新,以及最后的训练结果可视化。以下是详细的解释:

二、步骤

1.数据生成 

代码如下(示例):

def create_data(w,b,data_num):
    x=torch.normal(0,1,(data_num,len(w))) # 随机生成特征 x,服从标准正态分布
    y=torch.matmul(x,w)+b  # 按线性关系生成目标值 y

    noise=torch.normal(0,0.01,y.shape) # 添加噪声,模拟真实数据的不确定性
    y+=noise # 将噪声加到目标值上

    return x,y
num=500
true_w=torch.tensor([8.1,2,2,4]) #权重
true_b=torch.tensor(1.1) #偏置值
  • 生成特征:x 是一个服从正态分布的二维张量,行数为样本数量,列数为特征数量(由 w 的长度决定)。
  • 生成目标值:通过公式 y=xw+by = xw + by=xw+b 计算真实值。
  • 添加噪声:为目标值加入小幅随机噪声,增加数据的随机性。

2.数据加载器

代码如下(示例):

def data_provider(data,label,batchsize):
    length=len(label)
    indices=list(range(length)) # 生成样本索引
    random.shuffle(indices) # 打乱索引,保证数据顺序随机

    for each in range(0,length,batchsize): # 按批量大小划分数据
        get_indices=indices[each:each+batchsize]
        get_data=data[get_indices]
        get_label=label[get_indices] 

        yield get_data,get_label # 使用生成器逐批返回数据
功能
  • 数据分批:将完整的数据集分成小批量(batchsize),用于梯度下降训练。
  • 随机性:每次迭代随机打乱数据,减少过拟合风险。
  • 生成器:用 yield 按需返回小批量数据,节省内存。

3.线性模型 (fun) 和 损失函数 (maeloss)

def fun(x, w, b):
    pred_y = torch.matmul(x, w) + b  # 模型预测公式:y = xw + b
    return pred_y

def maeloss(pre_y, y):
    return torch.sum(abs(pre_y - y)) / len(y)  # 平均绝对误差(MAE)

功能
  • fun:定义线性回归模型。
  • maeloss:计算预测值和真实值的平均绝对误差(MAE),衡量模型性能。

4.随机梯度下降 (sgd)

def sgd(paras, lr):
    with torch.no_grad():  # 禁用梯度计算,避免影响训练过程
        for para in paras:
            para -= para.grad * lr  # 使用学习率 lr 更新参数
            para.grad.zero_()  # 清除梯度,避免累积

功能
  • 实现随机梯度下降(SGD)算法。
  • 按梯度值和学习率更新模型参数。

5.模型训练

lr=0.03 #learning rate

w_0 = torch.normal(0, 0.01, true_w.shape, requires_grad=True)  # 初始化权重
b_0 = torch.tensor(0.01, requires_grad=True)  # 初始化偏置

epochs = 50
for epoch in range(epochs):
    data_loss = 0
    for batch_x, batch_y in data_provider(x, y, batchsize):
        pred_y = fun(batch_x, w_0, b_0)  # 预测
        loss = maeloss(pred_y, batch_y)  # 计算损失
        loss.backward()  # 反向传播计算梯度
        sgd([w_0, b_0], lr)  # 更新参数
        data_loss += loss  # 累加损失
    print("epoch %03d:loss:%.6f" % (epoch, data_loss))

训练过程
  1. 初始化参数:权重 w_0 和偏置 b_0,用小值随机初始化。
  2. 多轮训练:
    • 对每个批次数据:
      1. 计算预测值和损失。
      2. 反向传播计算梯度。
      3. 使用 SGD 更新参数。
    • 累加每轮的总损失,监控训练进展。

6.参数对比

print("真实的函数值是", true_w, true_b)
print("训练的函数值是", w_0, b_0)
 

比较训练得到的参数(w_0, b_0)与真实值(true_w, true_b),评估模型拟合的准确性。

7.可视化结果

idx = 3
plt.plot(x[:,idx].detach().numpy(),x[:,idx].detach().numpy()*w_0[idx].detach().numpy()+b_0.detach().numpy())
plt.scatter(x[:,idx],y,1)

plt.show()
功能
  1. 拟合直线:
    • 使用训练得到的模型参数 w_0[idx] 和 b_0,绘制第 idx 个特征的拟合直线。
  2. 数据点:
    • 将真实数据点绘制在图上,比较拟合效果。

import torch
import matplotlib.pyplot as plt
import random

def create_data(w,b,data_num):
    x=torch.normal(0,1,(data_num,len(w)))
    y=torch.matmul(x,w)+b

    noise=torch.normal(0,0.01,y.shape)
    y+=noise

    return x,y

num=500
true_w=torch.tensor([8.1,2,2,4])
true_b=torch.tensor(1.1)

x,y=create_data(true_w,true_b,num)

# plt.scatter(x[:,2],y,1)
# plt.show()

def data_provider(data,label,batchsize):
    length=len(label)
    indices=list(range(length))
    random.shuffle(indices)

    for each in range(0,length,batchsize):
        get_indices=indices[each:each+batchsize]
        get_data=data[get_indices]
        get_label=label[get_indices]

        yield get_data,get_label


batchsize =16
# for batch_x,batch_y in data_provider(x,y,batchsize):
#     print(batch_x,batch_y)
#     # break


def fun(x , w , b):
    pred_y=torch.matmul(x,w)+b
    return pred_y

def maeloss(pre_y,y):
    return torch.sum(abs(pre_y-y))/len(y)

def sgd(paras,lr):
    with torch.no_grad():
        for para in paras:
            para-=para.grad*lr
            para.grad.zero_()



lr=0.03
w_0 = torch.normal(0,0.01,true_w.shape,requires_grad=True)
b_0 = torch.tensor(0.01,requires_grad=True)
print(w_0,b_0)

epochs=50

for epoch in range(epochs):
    data_loss = 0
    for batch_x,batch_y in data_provider(x,y,batchsize):
        pred_y = fun(batch_x,w_0,b_0)
        loss = maeloss(pred_y,batch_y)
        loss.backward()
        sgd([w_0,b_0],lr)
        data_loss += loss
    print("epoch %03d:loss:%.6f"%(epoch,data_loss))


print("真实的函数值是",true_w,true_b)
print("训练的函数值是",w_0,b_0)

idx = 3
plt.plot(x[:,idx].detach().numpy(),x[:,idx].detach().numpy()*w_0[idx].detach().numpy()+b_0.detach().numpy())
plt.scatter(x[:,idx],y,1)

plt.show()

 

 


总结

  • 代码实现了完整的线性回归过程:
    • 数据生成、加载、训练、评估和可视化。
  • 训练目标:
    • 拟合真实参数 true_w 和 true_b。
  • 代码设计特点:
    • 简单直观,手动实现各部分功能(如梯度下降和批量加载)。
  • 可优化点:
    • 增加学习率衰减机制,提高收敛速度。
    • 使用 torch.utils.data.DataLoader 简化数据加载过程。
从单因子到多因子:scikit-learn线性回归实战房价预测 本文通过scikit-learn库,从单因子线性回归入手,实战预测房价。首先使用房屋面积建立基础模型,随后引入收入、房龄、房间数等多因子构建更精准的预测模型,详细演示了数据准备、模型训练、评估及结果可视化全流程,并探讨了模型系数解读与改进思路。 阅读详情

相关推荐

线性回归模型完整训练流程(PyTorch实现)

self.linear = torch.nn.Linear(in_features=1, out_features=1) # 输入输出维度均为1return self.linear(x) # 前向传播:y = a*x + bmodel = LinearRegressionModel() # 实例化模型核心组件层自动初始化参数a(权重)和b(偏置)模型本质:学习线性方程中的最优参数a和b。

m0_46322965的博客 94

机器学习中如何评价模型的好坏

机器学习中如何评价模型的好坏 Week 2 主要学习机器学习中的基础知识 Targets for this week: 数据拆分:训练数据集&测试数据集 评价分类结果:精准度、混淆矩阵、精准率、召回率、F1 Score、ROC曲线等 评价回归结果:MSE、RMSE、MAE、R Squared Let’ s go ! 数据拆分 在机器学习中,通常将所有的数据划分为三份:训练数据集、验证数...

weixin_45516016的博客 4657

R语言机器学习算法实战系列(二十四)机器学习线性回归模型训练与评估全流程教程

本教程详细介绍了如何使用R语言进行机器学习模型的训练和评估。从数据预处理到特征选择,再到模型训练和性能评估,每一步都提供了详细的指导。通过并行计算技术,提高了处理效率,确保了大规模数据集的高效处理。希望这份教程能帮助你在机器学习项目中取得更好的成果!

专注生信领域 444

机器学习实战4-sklearn训练线性回归模型(鸢尾花iris数据集分类)

不贴图都没人看系列。。。。 线性回归推导: 上图求导部分有误,少些一个转置符号,更正为: 逻辑回归推导: (公式中“ln”和“log”表示一个意思,都是以“e”为低的自然对数): 公式中:X是m*n矩阵,m个样本,n维特征。 1、内容简介: 本章我们将从最简单的模型之一——线性回归模型,开始介绍两种非常不同的训练模型的方法: ...

知识搬运工的博客 2万+

RT-Thread stm32h7使用串口DMA

stm32h7在rtthread中无法使用串口DMA,通过更改驱动代码使其支持串口DMA

qq_35141454的博客 2287

从AMBA到USB:手把手教你评估和选择Synopsys DesignWare里的免费商用IP

本文详细介绍了如何评估和选择Synopsys DesignWare中的免费商用IP,从AMBA到USB等关键模块。通过技术参数核对、验证环境评估和集成注意事项,帮助工程师高效利用这些经过硅验证的商业级IP,提升SoC设计效率。文章还探讨了免费IP与付费IP的边界策略,避免常见陷阱。

weixin_42683394的博客 297

机器学习 ---线性回归

文章主要介绍了线性回归相关内容,包括简单线性回归与多元线性回归的概念及示例,阐述了残差的定义、在理想与非理想模型中的情况及意义,还讲解了线性回归的正规方程解,涵盖其适用场景、公式推导与代码实现,提及衡量线性回归性能指标可参考其他文章,最后以 scikit-learn 中的 LinearRegression 类为例,介绍了其在波士顿房价预测实践中的应用,包括数据集情况、类的常用参数及训练、预测函数的使用等。

m0_72968288的博客 2548

QMT vs Ptrade:量化交易新手如何根据需求选择券商系统(附实战案例)

本文对比了QMT和Ptrade两大券商量化交易系统的核心差异,帮助量化交易新手根据需求选择合适的平台。QMT适合技术面策略开发,执行效率高;Ptrade则提供全面的财务数据和复杂策略支持。通过实战案例,展示了如何结合两平台优势实现高效量化交易。

weixin_42683394的博客 527

动手学深度学习-线性回归的简单实现

动手学深度学习-线性回归的简单实现一、生成数据集二、读取数据集三、定义模型四、初始化模型参数五、定义损失函数六、定义优化算法七、训练 本节介绍如何使用深度学习框架实现线性回归模型。 一、生成数据集 import numpy as np import torch from torch.utils import data from d2l import torch as d2l true_w = torch.tensor([2,-3.4]) true_b = 4.2 # 调用d2l包中生成数据函数,feat

qq_44653420的博客 2289

解密 vn.py 源码:从事件驱动到模块化设计的实战解析

本文深入解析vn.py源码,重点剖析其事件驱动机制与模块化设计。通过事件引擎、处理器字典等核心组件分析,展示如何实现低耦合高内聚的交易系统架构,并结合实战案例说明模块化设计带来的开发效率提升。文章还详细解读了Gateway抽象层、核心数据结构及设计模式应用,为量化交易开发者提供源码级实践指南。

weixin_27427619的博客 250

论文复现《基于最大李雅普诺夫指数的电力系统暂态电压稳定评估方案》

电力系统暂态电压稳定评估方案 摘要 本研究提出了一种基于最大李雅普诺夫指数的电力系统暂态电压稳定评估方法。通过分析相空间中相邻轨迹的收敛或发散特性,该方法能够提前判别系统稳定性。论文首先阐述了暂态电压稳定机理,详细介绍了最大李雅普诺夫指数的计算方法。针对IEEE-39节点系统,建立了仿真模型并获取不同故障场景下的数据。研究开发了完整的评估程序,包括数据预处理、相空间重构、指数计算等模块,并通过与时域仿真结果的对比验证了方法的准确性。实验结果表明,该方法能够快速有效地评估电力系统的暂态电压稳定性,为系统安全运

max500600的博客 187

使用 PyTorch 实现的 线性回归(Linear Regression) 模型训练流程

def data_provider(data, label, batchsize): #每次访问这个函数, 就能提供一批数据#我不能按顺序取 把数据打乱yield get_data,get_label #有存档点的return函数定义data(数据集),label(标签集),和batchsize(每个批次的大小)。计算数据长度获取标签集的长度,即总共有多少个样本。生成索引列表并打乱顺序(1)生成一个从0到length-1的索引列表。(2)随机打乱这些索引。

m0_74273407的博客 1111

cartographer运行错误集合

播放bag的时候错误 Check failed: sensor_to_tracking->translation().norm() < 1e-5 The IMU frame must be colocated with the tracking frame. Transforming linear acceleration into the tracking frame will otherwise be imprecise tracking frame不是imu的link 修改lua文件中的.

Studying…… 2027

【机器学习&深度学习】线性回归(基本模型训练流程)

PyTorch 实现线性回归的完整流程,展示了: 模型定义 → 损失函数 → 训练数据 → 前向传播 → 反向传播(链式法则) → 参数更新 → 预测的全过程。

qq_62223405的博客 1387

YOLOv12改进策略【独家融合改进】| SPD-Conv+PPA 再次提升模型针对小目标的特征提取能力

SPD-Conv是一种新的 CNN 构建模块,用于替代传统 CNN 架构中使用的步长卷积(strided convolution)和池化(pooling)层,它由空间到深度(Space-to-depth,SPD)层和非步长卷积(non - strided convolution)层组成。

Limiiiing的博客 1028

华为OD机试2025A卷 - 用户调度问题(Java & Python& JS & C++ & C )

题目要求每个用户依次选择当前所能选择的最小资源消耗策略,并且若有多个策略的资源消耗相同,则选择最后一个策略。每个用户的选择是独立的,只考虑该用户的策略和相邻用户的约束,不考虑整个调度序列的全局资源消耗。每个用户根据自己的当前状态(即自己的三种选择的资源消耗)做出局部最优选择:在当前可选的策略中,选择消耗最小的那个。如果有多个最小值,则选择最后一个(根据题意)。这一选择是局部的最优,即在当下最有利的选择,但并不保证最终的整体系统资源消耗是最小的。

算法大师! 1万+

PyTorch 框架实现线性回归:从数据预处理到模型训练全流程

在之前的文章中,通过手动方式构建了一个简单的线性回归模型。然而,面对复杂的网络设计,手动实现不仅繁琐,还容易出错。为了提高效率和灵活性,可以利用 PyTorch 提供的组件来快速搭建模型。

吴师兄大模型的博客 2858

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

PyTorch线性回归实战:从零实现训练流程

线性回归是机器学习的基础模型,通过建立输入特征与输出标签之间的线性关系进行预测。其核心原理是最小化预测值与真实值之间的误差函数,常用梯度下降法优化模型参数。在深度学习框架PyTorch中实现时,涉及数据生成、模型构建、损失计算和参数更新等关键步骤。该技术广泛应用于房价预测、销量预估等连续值预测场景。本文以PyTorch实现为例,详解如何添加高斯噪声模拟真实数据、使用MAE损失函数提升鲁棒性,并通过手动实现SGD优化器深入理解训练机制。案例虽简单但完整呈现了参数初始化、前向传播、反向传播等深度学习必备知识点,

weixin_29053577的博客 306

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

机器学习入门首选线性回归:从数据训练到API发布全流程解析

机器学习的概念虽然广泛,但入门时最直观的模型往往是线性回归。作为监督学习的基础,它通过拟合输入特征与连续数值输出的关系,预测新数据的结果,其数学原理透明且易于理解。对于Web开发者而言,训练过程可类比为根据历史请求自动调整参数的后端接口,降低了认知门槛。本文从工程实践角度,介绍如何利用Python生态完成数据准备、模型训练、误差评估,并将模型封装成HTTP接口对外提供服务。梯度下降优化参数、模型持久化、接口设计等关键环节,构成了从数据到服务的完整链路。掌握这一流程后,无论是转向逻辑回归处理分类问题,还是深入

weixin_34384557的博客 347

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

python TensorFlow 单变量线性回归示例代码剖析:构建、训练和预测的基本流程

上述代码使用TensorFlow的Keras API构建了一个简单的线性回归模型,用于学习输入。通过这段代码,可以快速理解TensorFlow构建、训练和预测的基本流程。

学亮编程手记 465

python使用sklearn实现一元线性回归

python使用sklearn实现一元线性回归(sklearn.linear_model.LinearRegression()) from sklearn import linear_model import numpy as np x = np.array([[12],[5],[7],[8]]) y = np.array([24,10,14,16]) lm = linear_model.LinearRegression() # 拟合模型 lm.fit(x,y) print(lm.predict([[30

stusss的博客 3124

线性回归(Linear regression)算法详解

线性回归是一种通过回归方程建模自变量与因变量线性关系的分析方法。一元线性回归表达式为y=kx+b,多元线性回归为y=w₁x₁+w₂x₂+...+wₙxₙ+b。通过最小化均方误差(MSE)可以找到最佳参数。以房屋面积预测价格为例,当k=2、b=0时,回归曲线完全拟合样本数据(MSE=0)。测试新数据(75,145)时,预测值150与真实值145的误差(MSE=25)揭示了模型的泛化能力。该示例展示了线性回归的基本原理和训练-测试流程,为机器学习模型优化奠定了基础。

Springfield3006的博客 1965

PyTorch线性回归实战:从零构建模型与训练全流程解析

线性回归是机器学习中最基础且核心的算法,用于预测连续型目标变量,其本质是通过拟合线性方程来建模特征与标签之间的关系。其原理基于最小化预测值与真实值之间的误差(常用均方误差损失函数),通过梯度下降等优化算法迭代更新模型参数。在深度学习领域,掌握线性回归的实现是理解更复杂神经网络架构的基石,它涵盖了数据准备、模型定义、训练循环和评估等通用流程。PyTorch作为主流的深度学习框架,以其动态计算图和Pythonic的设计哲学,极大地简化了模型的构建与调试过程。在实际工程中,线性回归被广泛应用于房价预测、销量预估等

weixin_29062255的博客 285

简单的线性回归

import numpy as npfrom sklearn.linear_model import LinearRegressionnp.random.seed(1)X = 2 * np.random.rand(10000, 1)#模拟出10000个yy = 4 + 3 * X + np.random.randn(10000, 1)#实例化出一个线性回归器,是个对象lin_reg = Linea...

weixin_34166472的博客 96

机器学习之线性回归——小白教学

age(年龄)、sex(性别)、bmi(体重指数)、bp(平均血压)、s1-s6(6 项血清指标)target(一年后糖尿病病情进展的量化值)数据已做标准化处理,可直接用于模型训练。x = data[['age','sex','bmi','bp','s1','s2','s3','s4','s5','s6']] # 特征变量y = data[['target']] # 目标变量(一年后糖尿病病情进展)x包含 10 个输入特征:年龄、性别、体重指数、血压及 6 项血清指标。

2302_76756558的博客 1134

sklearn学习(5)线性回归和逻辑回归

sklearn的线性回归在LinearRegression类,而逻辑回归在LogisticRegression类。逻辑回归加载数据并标准化划分数据集和测试集。线性回归生成数据并划分数据集和测试集。

weixin_69067946的博客 209
下一篇: 基于 PyTorch 的完整数据处理与模型训练流程
Ferker554
博客等级 码龄3年 167粉丝 117原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值