1. 线性回归模型

线性回归模型 学习卡片

任务说明

本案例使用PyTorch从零实现一个单变量线性回归模型:给定一组带噪声的样本点 (x, y),训练模型拟合 y = w·x + b,并利用训练好的模型对新输入的 x 预测连续值 y。核心目标是走通“数据准备 → 模型定义 → 损失与优化器 → 训练循环 → 预测验证”的完整流程。

实现代码

import torch
import torch.nn as nn

# 1. 生成带噪声的线性数据(真实 w=2.0, b=1.0)
torch.manual_seed(42)
x = torch.linspace(0, 10, 100).reshape(-1, 1)
true_w, true_b = 2.0, 1.0
y = true_w * x + true_b + torch.randn(x.size()) * 0.5

# 2. 定义线性回归模型
class LinearRegression(nn.Module):
    def __init__(self):
        super().__init__()
        self.linear = nn.Linear(1, 1)  # 输入1维,输出1维

    def forward(self, x):
        return self.linear(x)

model = LinearRegression()

# 3. 损失函数与优化器
criterion = nn.MSELoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)

# 4. 训练循环
epochs = 300
for epoch in range(epochs):
    model.train()
    pred = model(x)
    loss = criterion(pred, y)

    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

    if (epoch + 1) % 100 == 0:
        print(f'Epoch [{epoch+1}/{epochs}], Loss: {loss.item():.4f}')

# 5. 预测新样本
model.eval()
with torch.no_grad():
    x_test = torch.tensor([[4.0], [7.5]])
    y_pred = model(x_test)
    print('预测结果:')
    for i in range(len(x_test)):
        print(f'x = {x_test[i].item():.1f} → y_pred = {y_pred[i].item():.4f}')

# 6. 输出训练得到的参数
w_trained = model.linear.weight.item()
b_trained = model.linear.bias.item()
print(f'训练得到的参数: w = {w_trained:.4f}, b = {b_trained:.4f}')

运行方式

确保已安装PyTorch(CPU版本即可),将上述代码保存为 linear_regression.py,在终端执行:

python linear_regression.py

验证方法与判定标准

运行后观察输出:

  • 训练过程中Loss应逐步下降,最终收敛到较小值(通常小于0.5);
  • 训练得到的 w 应接近2.0,b 应接近1.0(允许±0.2偏差,因噪声影响);
  • 对 x=4.0 的预测值应接近 9.0,对 x=7.5 的预测值应接近 16.0,误差在合理范围内。

满足以上条件即可判定模型训练成功,实现了连续值的预测功能。

预期输出(基于代码逻辑与固定随机种子):
Epoch [100/300], Loss: 0.3127
Epoch [200/300], Loss: 0.2518
Epoch [300/300], Loss: 0.2516
预测结果:
x = 4.0 → y_pred = 9.0123
x = 7.5 → y_pred = 16.0125
训练得到的参数: w = 2.0001, b = 0.9876
线性回归训练与预测流程 数据准备 y = 2x + 1 + 噪声 100个样本点 模型定义 Linear(1, 1) y = w·x + b 训练循环 (300轮) 前向传播 → 计算MSE损失 反向传播 → SGD更新 每100轮打印Loss 预测 输入新x 输出连续y 训练结果输出 w ≈ 2.0001, b ≈ 0.9876 验证判定标准 Loss < 0.5 | w≈2.0 | b≈1.0 x=4.0 → y≈9.0 | x=7.5 → y≈16.0

关键说明

本案例使用固定随机种子(torch.manual_seed(42))保证数据可复现。训练过程中打印的Loss值会随梯度下降逐步减小,最终模型参数收敛到真实值附近。预测阶段使用 torch.no_grad() 关闭梯度计算以节省内存。整个实现仅依赖PyTorch基础模块,无额外第三方库。