PyTorch线性/非线性回归拟合
目录
引言
在机器学习中,回归分析是一种常用的技术,用于预测数值型数据。回归模型可以分为线性和非线性两类。PyTorch是一个广泛使用的深度学习框架,可以用于实现各种回归模型。本文将探讨如何使用PyTorch进行线性和非线性回归拟合,并通过真实案例来演示其应用。
线性回归
线性回归的基本概念
线性回归是一种统计学方法,用于建模两个或多个变量之间的关系。其基本假设是自变量与因变量之间存在线性关系。线性回归模型通常表示为:
其中, 是因变量, 是自变量, 是回归系数, 是误差项。
PyTorch中的线性回归实现
在PyTorch中实现线性回归相对简单。下面是一个基本的线性回归实现步骤:
- 导入必要的库
- 生成数据集
- 定义线性回归模型
- 定义损失函数和优化器
- 训练模型
- 评估模型性能
以下是使用PyTorch实现线性回归的代码示例:
pythonCopy Codeimport torch
import torch.nn as nn
import torch.optim as optim
import numpy as np
import matplotlib.pyplot as plt
# 生成数据集
np.random.seed(0)
x = np.random.rand(100, 1) * 10 # 自变量
y = 2 * x + 1 + np.random.randn(100, 1) # 因变量
# 转换为PyTorch张量
X = torch.FloatTensor(x)
Y = torch.FloatTensor(y)
# 定义线性回归模型
class LinearRegressionModel(nn.Module):
def __init__(self):
super(LinearRegressionModel, self).__init__()
self.linear = nn.Linear(1, 1)
def forward(self, x):
return self.linear(x)
model = LinearRegressionModel()
# 定义损失函数和优化器
criterion = nn.MSELoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)
# 训练模型
num_epochs = 1000
for epoch in range(num_epochs):
model.train()
optimizer.zero_grad()
outputs = model(X)
loss = criterion(outputs, Y)
loss.backward()
optimizer.step()
if (epoch+1) % 100 == 0:
print(f'Epoch [{epoch+1}/{num_epochs}], Loss: {loss.item():.4f}')
# 可视化结果
predicted = model(X).detach().numpy()
plt.scatter(x, y, label='Original data')
plt.plot(x, predicted, color='red', label='Fitted line')
plt.legend()
plt.show()
案例研究:房价预测
背景
房价预测是一个经典的回归问题。我们可以利用历史数据(如房屋面积、房间数量、位置等)来预测未来的房价。这里我们将使用生成的房价数据进行线性回归模型的训练。
数据集
假设我们有一个包含房屋面积和对应房价的数据集。我们将生成一些模拟数据来作为示例。
pythonCopy Code# 生成模拟房价数据
np.random.seed(0)
area = np.random.rand(100, 1) * 2000 # 房屋面积
price = 300 + area * 120 + np.random.randn(100, 1) * 10000 # 房价
# 转换为PyTorch张量
Area = torch.FloatTensor(area)
Price = torch.FloatTensor(price)
模型训练
我们将使用之前定义的线性回归模型进行训练。训练过程与上面的示例相似,只需更改输入数据即可。
pythonCopy Code# 定义并训练模型
model = LinearRegressionModel()
criterion = nn.MSELoss()
optimizer = optim.SGD(model.parameters(), lr=0.01)
num_epochs = 1000
for epoch in range(num_epochs):
model.train()
optimizer.zero_grad()
outputs = model(Area)
loss = criterion(outputs, Price)
loss.backward()
optimizer.step()
# 可视化结果
predicted_price = model(Area).detach().numpy()
plt.scatter(area, price, label='Original data')
plt.plot(area, predicted_price, color='green', label='Fitted line')
plt.xlabel('Area (sq ft)')
plt.ylabel('Price ($)')
plt.legend()
plt.show()
非线性回归
非线性回归的基本概念
非线性回归用于建模自变量与因变量之间的非线性关系。相比于线性回归,非线性回归可以捕捉更复杂的模式。常见的非线性模型包括多项式回归、指数回归等。
PyTorch中的非线性回归实现
在PyTorch中实现非线性回归也很简单。以下是实现步骤:
- 导入必要的库
- 生成数据集
- 定义非线性回归模型
- 定义损失函数和优化器
- 训练模型
- 评估模型性能
下面是使用PyTorch实现非线性回归的代码示例,以多项式回归为例:
pythonCopy Code# 生成非线性数据
np.random.seed(0)
x = np.linspace(-3, 3, 100)
y = x**3 + np.random.randn(100) * 3 # 非线性关系
# 转换为PyTorch张量
X = torch.FloatTensor(x).view(-1, 1)
Y = torch.FloatTensor(y).view(-1, 1)
# 定义多项式回归模型
class PolynomialRegressionModel(nn.Module):
def __init__(self):
super(PolynomialRegressionModel, self).__init__()
self.poly = nn.Sequential(
nn.Linear(1, 10), # 输入层
nn.ReLU(), # 激活函数
nn.Linear(10, 1) # 输出层
)
def forward(self, x):
return self.poly(x)
model = PolynomialRegressionModel()
# 定义损失函数和优化器
criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=0.01)
# 训练模型
num_epochs = 2000
for epoch in range(num_epochs):
model.train()
optimizer.zero_grad()
outputs = model(X)
loss = criterion(outputs, Y)
loss.backward()
optimizer.step()
# 可视化结果
predicted = model(X).detach().numpy()
plt.scatter(x, y, label='Original data')
plt.scatter(x, predicted, color='red', label='Fitted curve')
plt.legend()
plt.show()
案例研究:股票价格预测
背景
股票价格变化受到多种因素的影响,因此往往呈现出非线性的趋势。我们可以利用历史股票价格数据,通过构建非线性回归模型来预测未来的股价。
数据集
假设我们有一个简单的股票价格数据集,包括过去的几天价格。我们将生成一些模拟数据作为示例。
pythonCopy Code# 生成模拟股票价格数据
days = np.arange(30)
prices = 100 + 10 * np.sin(days / 3) + np.random.randn(30) * 2 # 模拟价格
# 转换为PyTorch张量
Days = torch.FloatTensor(days).view(-1, 1)
Prices = torch.FloatTensor(prices).view(-1, 1)
模型训练
与前面的示例相似,我们将使用多项式回归模型进行训练。以下是实现代码:
pythonCopy Code# 定义并训练模型
model = PolynomialRegressionModel()
criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=0.01)
num_epochs = 2000
for epoch in range(num_epochs):
model.train()
optimizer.zero_grad()
outputs = model(Days)
loss = criterion(outputs, Prices)
loss.backward()
optimizer.step()
# 可视化结果
predicted_prices = model(Days).detach().numpy()
plt.plot(days, prices, label='Original prices', marker='o')
plt.plot(days, predicted_prices, color='red', label='Fitted curve')
plt.xlabel('Days')
plt.ylabel('Price')
plt.legend()
plt.show()
总结
本文介绍了如何使用PyTorch实现线性和非线性回归模型。通过实际案例(房价预测和股票价格预测),我们展示了如何生成数据、定义模型、训练模型并可视化结果。线性回归适用于简单的线性关系,而非线性回归则能够处理更复杂的模式。在实际应用中,选择合适的模型对于预测的准确性至关重要。
参考文献
- Deep Learning with PyTorch, by Eli Stevens, Luca Antiga, and Thomas Viehmann.
- Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow, by Aurélien Géron.
- PyTorch Documentation - https://pytorch.org/docs/stable/index.html
以上内容提供了关于PyTorch线性和非线性回归拟合的基本介绍和实现,结合实例展示了其应用场景。希望对读者有帮助。