PyTorch线性/非线性回归拟合

目录

  1. 引言
  2. 线性回归
  3. 非线性回归
  4. 总结
  5. 参考文献

引言

在机器学习中,回归分析是一种常用的技术,用于预测数值型数据。回归模型可以分为线性和非线性两类。PyTorch是一个广泛使用的深度学习框架,可以用于实现各种回归模型。本文将探讨如何使用PyTorch进行线性和非线性回归拟合,并通过真实案例来演示其应用。


线性回归

线性回归的基本概念

线性回归是一种统计学方法,用于建模两个或多个变量之间的关系。其基本假设是自变量与因变量之间存在线性关系。线性回归模型通常表示为:

y=β0+β1x1+β2x2++βnxn+ϵy = \beta_0 + \beta_1 x_1 + \beta_2 x_2 + \ldots + \beta_n x_n + \epsilon

其中,y y 是因变量,xi x_i 是自变量,βi \beta_i 是回归系数,ϵ \epsilon 是误差项。

PyTorch中的线性回归实现

在PyTorch中实现线性回归相对简单。下面是一个基本的线性回归实现步骤:

  1. 导入必要的库
  2. 生成数据集
  3. 定义线性回归模型
  4. 定义损失函数和优化器
  5. 训练模型
  6. 评估模型性能

以下是使用PyTorch实现线性回归的代码示例:

pythonCopy Code
import 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中实现非线性回归也很简单。以下是实现步骤:

  1. 导入必要的库
  2. 生成数据集
  3. 定义非线性回归模型
  4. 定义损失函数和优化器
  5. 训练模型
  6. 评估模型性能

下面是使用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实现线性和非线性回归模型。通过实际案例(房价预测和股票价格预测),我们展示了如何生成数据、定义模型、训练模型并可视化结果。线性回归适用于简单的线性关系,而非线性回归则能够处理更复杂的模式。在实际应用中,选择合适的模型对于预测的准确性至关重要。


参考文献

  1. Deep Learning with PyTorch, by Eli Stevens, Luca Antiga, and Thomas Viehmann.
  2. Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow, by Aurélien Géron.
  3. PyTorch Documentation - https://pytorch.org/docs/stable/index.html

以上内容提供了关于PyTorch线性和非线性回归拟合的基本介绍和实现,结合实例展示了其应用场景。希望对读者有帮助。