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()
运行与验证方法
将上述两段代码合并保存为 linear_regression.py,在已安装 torch 和 matplotlib 的Python环境中运行:
python linear_regression.py
判定标准:
- 控制台输出的学习参数接近真实值(
w≈2.5,b≈10),偏差在±0.3以内视为收敛良好; - 左侧损失曲线随迭代次数单调下降并趋于平稳;
- 右侧图中红色拟合直线穿过数据点分布的中心区域,与数据整体趋势一致。
满足以上三点即可判定案例实现成功。若参数偏差过大,可适当增大训练轮数或调整学习率后重新运行。