以下是PyTorch实现多项式回归的完整攻略,包括数据准备、模型定义、训练和预测等步骤。同时,还提供了两个示例说明。
1. 数据准备
多项式回归是一种回归分析方法,它可以用于拟合非线性数据。在PyTorch中,我们可以使用torch.utils.data.Dataset和torch.utils.data.DataLoader来加载数据集。
以下是一个生成多项式数据集的示例代码:
import torch
from torch.utils.data import Dataset, DataLoader
class PolynomialDataset(Dataset):
def __init__(self, degree, num_samples, noise=0.1):
self.degree = degree
self.num_samples = num_samples
self.noise = noise
self.x = torch.linspace(-1, 1, num_samples)
self.y = self._generate_polynomial(self.x, degree) + noise * torch.randn(num_samples)
def __len__(self):
return self.num_samples
def __getitem__(self, idx):
return self.x[idx], self.y[idx]
def _generate_polynomial(self, x, degree):
y = torch.zeros_like(x)
for d in range(degree + 1):
y += x ** d
return y
在这个示例中,我们定义了一个PolynomialDataset类,用于生成多项式数据集。我们可以指定多项式的阶数、样本数量和噪声水平。在__init__方法中,我们首先生成x轴上的均匀采样点,然后使用_generate_polynomial方法生成对应的y轴上的值,并加上一定的噪声。在__getitem__方法中,我们返回x和y的值。
接下来,我们可以使用DataLoader来加载数据集:
dataset = PolynomialDataset(degree=2, num_samples=1000)
dataloader = DataLoader(dataset, batch_size=32, shuffle=True)
在这个示例中,我们使用PolynomialDataset类生成一个二次多项式数据集,并使用DataLoader来加载数据集。我们指定了批量大小为32,并打开了shuffle选项。
2. 模型定义
在PyTorch中,我们可以使用torch.nn.Module来定义模型。对于多项式回归,我们可以使用一个全连接层来拟合数据。
以下是一个定义多项式回归模型的示例代码:
import torch.nn as nn
class PolynomialRegression(nn.Module):
def __init__(self, degree):
super(PolynomialRegression, self).__init__()
self.degree = degree
self.fc = nn.Linear(degree + 1, 1)
def forward(self, x):
x = x.unsqueeze(1)
x = torch.cat([x ** i for i in range(self.degree + 1)], dim=1)
x = self.fc(x)
return x.squeeze(1)
在这个示例中,我们定义了一个PolynomialRegression类,用于拟合多项式数据。我们可以指定多项式的阶数。在__init__方法中,我们定义了一个全连接层,输入维度为degree + 1,输出维度为1。在forward方法中,我们首先将输入x的维度从(batch_size,)变为(batch_size, 1),然后使用torch.cat方法将x的各次幂拼接在一起,最后使用全连接层进行线性变换,并将输出的维度从(batch_size, 1)变为(batch_size,)。
3. 训练模型
在PyTorch中,我们可以使用torch.optim来定义优化器,使用torch.nn.MSELoss来定义损失函数。然后,我们可以使用模型的train方法来训练模型。
以下是一个训练多项式回归模型的示例代码:
import torch.optim as optim
import torch.nn.functional as F
degree = 2
model = PolynomialRegression(degree)
optimizer = optim.SGD(model.parameters(), lr=0.1)
criterion = nn.MSELoss()
for epoch in range(100):
running_loss = 0.0
for x, y in dataloader:
optimizer.zero_grad()
y_pred = model(x)
loss = criterion(y_pred, y)
loss.backward()
optimizer.step()
running_loss += loss.item()
print(f"Epoch {epoch + 1}, loss: {running_loss / len(dataloader)}")
在这个示例中,我们首先定义了模型、优化器和损失函数。然后,我们使用模型的train方法来训练模型。在每个epoch中,我们遍历数据集,并使用优化器来更新模型的参数。最后,我们输出每个epoch的平均损失。
4. 预测数据
在PyTorch中,我们可以使用训练好的模型来预测新的数据。
以下是一个使用训练好的模型预测数据的示例代码:
import matplotlib.pyplot as plt
x_test = torch.linspace(-1, 1, 100)
y_test = model(x_test).detach()
plt.plot(dataset.x.numpy(), dataset.y.numpy(), 'o')
plt.plot(x_test.numpy(), y_test.numpy(), '-')
plt.show()
在这个示例中,我们首先生成测试数据x_test,并使用训练好的模型来预测对应的y_test。然后,我们使用matplotlib库来绘制原始数据和预测结果。
5. 示例说明
以下是两个使用多项式回归的示例说明:
示例1:使用一次多项式拟合数据
以下是一个使用一次多项式拟合数据的示例代码:
dataset = PolynomialDataset(degree=1, num_samples=1000)
dataloader = DataLoader(dataset, batch_size=32, shuffle=True)
degree = 1
model = PolynomialRegression(degree)
optimizer = optim.SGD(model.parameters(), lr=0.1)
criterion = nn.MSELoss()
for epoch in range(100):
running_loss = 0.0
for x, y in dataloader:
optimizer.zero_grad()
y_pred = model(x)
loss = criterion(y_pred, y)
loss.backward()
optimizer.step()
running_loss += loss.item()
print(f"Epoch {epoch + 1}, loss: {running_loss / len(dataloader)}")
x_test = torch.linspace(-1, 1, 100)
y_test = model(x_test).detach()
plt.plot(dataset.x.numpy(), dataset.y.numpy(), 'o')
plt.plot(x_test.numpy(), y_test.numpy(), '-')
plt.show()
在这个示例中,我们使用一次多项式拟合数据。我们首先生成一个一次多项式数据集,并使用PolynomialRegression类定义模型。然后,我们使用SGD优化器和MSELoss损失函数来训练模型。最后,我们使用训练好的模型来预测数据,并绘制原始数据和预测结果。
示例2:使用三次多项式拟合数据
以下是一个使用三次多项式拟合数据的示例代码:
dataset = PolynomialDataset(degree=3, num_samples=1000)
dataloader = DataLoader(dataset, batch_size=32, shuffle=True)
degree = 3
model = PolynomialRegression(degree)
optimizer = optim.SGD(model.parameters(), lr=0.1)
criterion = nn.MSELoss()
for epoch in range(100):
running_loss = 0.0
for x, y in dataloader:
optimizer.zero_grad()
y_pred = model(x)
loss = criterion(y_pred, y)
loss.backward()
optimizer.step()
running_loss += loss.item()
print(f"Epoch {epoch + 1}, loss: {running_loss / len(dataloader)}")
x_test = torch.linspace(-1, 1, 100)
y_test = model(x_test).detach()
plt.plot(dataset.x.numpy(), dataset.y.numpy(), 'o')
plt.plot(x_test.numpy(), y_test.numpy(), '-')
plt.show()
在这个示例中,我们使用三次多项式拟合数据。我们首先生成一个三次多项式数据集,并使用PolynomialRegression类定义模型。然后,我们使用SGD优化器和MSELoss损失函数来训练模型。最后,我们使用训练好的模型来预测数据,并绘制原始数据和预测结果。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:pytorch实现多项式回归 - Python技术站