线性回归:从理论到实现
1. 什么是线性回归?
线性回归是一种用于预测因变量(目标值)和自变量(特征值)之间关系的基本模型。它假设目标值(y
)是特征值(x
)的线性组合,公式如下:
y=w⋅x+b
其中:
w
是权重(也称为斜率),表示自变量对因变量的影响程度。b
是偏置(也称为截距),表示当自变量为零时因变量的值。x
是自变量(输入数据)。y
是预测的目标值(输出)。
2. 线性回归的工作流程
线性回归的目标是找到最优的 w
和 b
,使得预测的 y
值与真实的目标值之间的差距最小。这个差距通常用 均方误差(MSE,Mean Squared Error)来衡量。为了最小化 MSE,通常使用 梯度下降算法 来迭代更新 w
和 b
3. 代码实现:用 PyTorch 实现线性回归
我们接下来用代码一步步实现一个线性回归模型。PyTorch 是一个非常强大的深度学习框架,它能够方便地实现梯度计算、自动求导和优化操作。
3.1 数据准备
我们使用 numpy
来生成模拟数据。这里我们假设目标值 y
是一个线性函数,公式为 y = 2 * x + 1
,并添加一些噪声以模拟实际中的数据误差。
import numpy as np # numpy数组库
import matplotlib.pyplot as plt # 画图库
import torch # torch基础库
import torch.nn as nn # torch神经网络库
# 数据准备
x_sample = np.linspace(0, 5, 64) # 生成64个均匀分布的点,范围在0到5之间
noise = np.random.randn(64) # 生成高斯噪声
y_sample = 2 * x_sample + 1 + noise # 模拟 y = 2 * x + 1,并加上噪声
# 将数据转换为适合 PyTorch 处理的格式
x_numpy = x_sample.reshape(-1, 1).astype('float32') # 转换为列向量
y_numpy = y_sample.reshape(-1, 1).astype('float32') # 转换为列向量
# 转换为 PyTorch 张量
x_train = torch.from_numpy(x_numpy)
y_train = torch.from_numpy(y_numpy)
3.2 模型和损失函数
PyTorch 提供了一个非常方便的 nn.Linear
模块来实现线性回归。我们将输入特征数和输出特征数都设为1,因为这是一个简单的一元线性回归问题。
# 模型和损失函数
model = nn.Linear(in_features=1, out_features=1) # 输入特征为1,输出特征也为1
loss_fn = nn.MSELoss() # 使用均方误差作为损失函数
optimizer = torch.optim.SGD(model.parameters(), lr=0.01) # 使用随机梯度下降,学习率为0.01
3.3 模型训练
为了训练我们的模型,我们需要执行以下几个步骤:
- 前向传播:将输入数据传入模型,得到预测输出
y_pred
。 - 计算损失:将模型的预测输出与真实值进行比较,计算损失。
- 反向传播:通过误差计算得到梯度,更新模型参数。
- 更新参数:使用优化器(这里使用的是随机梯度下降,SGD)来调整权重和偏置,使得损失减小。
# 模型训练
epochs = 500 # 设置训练迭代次数
loss_history = [] # 记录每次迭代的损失
for i in range(epochs):
y_pred = model(x_train) # 前向计算,得到预测值
loss = loss_fn(y_pred, y_train) # 计算损失
optimizer.zero_grad() # 清零梯度
loss.backward() # 反向传播,计算梯度
optimizer.step() # 优化器更新参数
loss_history.append(loss.item()) # 记录损失
if i % 100 == 0: # 每100个 epoch 输出一次损失
print(f'Epoch {i}, Loss: {loss.item():.4f}')
3.4 提取最终的模型参数
经过 500 轮迭代后,模型的权重和偏置已经收敛到一个合理的值。我们可以提取并打印最终的 w
和 b
。
# 提取最终模型参数
final_w, final_b = model.weight.item(), model.bias.item() # 提取权重和偏置
print("Final weight (w):", final_w)
print("Final bias (b):", final_b)
3.5 可视化
为了直观地查看模型的拟合效果,我们将原始数据点与模型预测的直线绘制在同一张图上。
4. 结果分析
通过上面的代码,我们实现了一个简单的线性回归模型。在模型训练过程中,我们可以观察到损失逐渐减小,模型参数 w
和 b
最终收敛到接近真实值 2
和 1
。在绘制的图像中,我们可以看到模型拟合的直线与数据点非常接近,这表明我们的线性回归模型成功地拟合了数据。
5. 总结
通过本文的介绍,你应该已经理解了线性回归的基本概念以及如何使用 PyTorch 实现一个简单的线性回归模型。具体来说,你学习了:
- 如何生成和处理数据。
- 使用 PyTorch 搭建线性回归模型。
- 梯度下降的基本流程:前向传播、计算损失、反向传播、参数更新。
- 如何提取训练完成后的模型参数并进行可视化。
线性回归虽然简单,但它是理解更复杂机器学习模型的基础。接下来,你可以进一步探索多元线性回归、正则化、以及更复杂的神经网络模型。希望这篇博客能为你理解线性回归和深度学习的入门奠定坚实的基础!