1. 线性回归模型

线性回归模型 学习卡片

任务说明

本案例使用PyTorch实现一个简单的线性回归模型,以房屋面积(平方米)为输入特征,预测房价(万元)。数据集由带噪声的线性关系生成,模型通过梯度下降学习参数 w 和 b,最终可视化损失下降曲线与拟合直线。

数据生成与模型定义

我们首先构造一个线性关系 y = 2.5x + 10 + noise 的模拟数据集,共100个样本。然后定义一个单层线性模型(无偏置项由参数 b 承担),使用均方误差损失和随机梯度下降优化器进行训练。

import torch
import torch.nn as nn
import matplotlib.pyplot as plt

# 1. 生成模拟数据:y = 2.5x + 10 + 噪声
torch.manual_seed(42)
x = torch.linspace(0, 10, 100).reshape(-1, 1)
true_w, true_b = 2.5, 10.0
y = true_w * x + true_b + torch.randn(x.size()) * 2.0

# 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. 训练循环
losses = []
epochs = 300
for epoch in range(epochs):
    # 前向传播
    pred = model(x)
    loss = criterion(pred, y)

    # 反向传播与优化
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

    losses.append(loss.item())

# 5. 输出学习到的参数
w_learned = model.linear.weight.item()
b_learned = model.linear.bias.item()
print(f"学习到的参数: w = {w_learned:.3f}, b = {b_learned:.3f}")
print(f"真实参数:     w = {true_w:.3f}, b = {true_b:.3f}")

可视化与验证

训练完成后,我们绘制两个子图:左侧为损失随迭代次数的下降曲线,右侧为原始数据散点与模型拟合直线的对比。通过观察损失曲线是否收敛、拟合直线是否接近数据分布趋势,即可验证模型训练效果。

# 6. 可视化
plt.figure(figsize=(12, 4))

# 左图:损失下降曲线
plt.subplot(1, 2, 1)
plt.plot(range(epochs), losses, color='tab:blue')
plt.xlabel('Epoch')
plt.ylabel('MSE Loss')
plt.title('Training Loss Curve')
plt.grid(True)

# 右图:拟合直线与原始数据
plt.subplot(1, 2, 2)
plt.scatter(x.numpy(), y.numpy(), alpha=0.6, label='Original data')
with torch.no_grad():
    y_pred = model(x)
plt.plot(x.numpy(), y_pred.numpy(), color='tab:red', linewidth=2, label='Fitted line')
plt.xlabel('Area (m²)')
plt.ylabel('Price (万元)')
plt.title('Linear Regression Fit')
plt.legend()
plt.grid(True)

plt.tight_layout()
plt.savefig('linear_regression_result.png', dpi=100)
plt.show()
训练损失下降曲线 迭代次数 (Epoch) 损失值 线性回归拟合结果 房屋面积 (m²) 房价 (万元) 原始数据 拟合直线

运行与验证方法

将上述两段代码合并保存为 linear_regression.py,在已安装 torch 和 matplotlib 的Python环境中运行:

python linear_regression.py

判定标准:

  1. 控制台输出的学习参数接近真实值(w≈2.5,b≈10),偏差在±0.3以内视为收敛良好;
  2. 左侧损失曲线随迭代次数单调下降并趋于平稳;
  3. 右侧图中红色拟合直线穿过数据点分布的中心区域,与数据整体趋势一致。

满足以上三点即可判定案例实现成功。若参数偏差过大,可适当增大训练轮数或调整学习率后重新运行。