在使用 gpytorch
创建多输出高斯过程模型时,可以利用 gpytorch
的 MultitaskGaussianProcess
。这个模型允许你处理多维度输出并且可以在 GPU 上进行加速。
下面是一个示例代码,演示如何使用 gpytorch
来实现多维输出高斯过程,并在 GPU 上进行运算。
示例代码
import torch
import gpytorch
from matplotlib import pyplot as plt
# 设置随机种子
torch.manual_seed(0)
# 生成示例数据
N = 100 # 数据点数量
X = torch.rand(N, 1) # 输入数据
Y1 = torch.sin(2 * torch.pi * X) + 0.1 * torch.randn(N, 1) # 第一输出
Y2 = torch.cos(2 * torch.pi * X) + 0.1 * torch.randn(N, 1) # 第二输出
Y = torch.cat((Y1, Y2), dim=1) # 合并两个输出
# 将数据移到GPU(如果可用)
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
X = X.to(device)
Y = Y.to(device)
# 定义模型
class MultitaskGPModel(gpytorch.models.ApproximateGP):
def __init__(self):
# 使用一个共享的内核,并为每个输出定义一个独立的输出内核
kernel = gpytorch.kernels.ScaleKernel(gpytorch.kernels.RBFKernel())
multitask_kernel = gpytorch.kernels.MultitaskKernel(kernel, num_tasks=2)
super(MultitaskGPModel, self).__init__(kernel=multitask_kernel)
self.mean_module = gpytorch.means.MultitaskMean(gpytorch.means.ConstantMean(), num_tasks=2)
def forward(self, x):
mean_x = self.mean_module(x) # 计算均值
cov_x = self.covar_module(x) # 计算协方差
return gpytorch.distributions.MultivariateNormal(mean_x, cov_x)
# 初始化模型和优化器
model = MultitaskGPModel().to(device)
likelihood = gpytorch.likelihoods.MultitaskGaussianLikelihood(num_tasks=2).to(device)
# 训练模式
model.train()
likelihood.train()
# 优化模型
optimizer = torch.optim.Adam(model.parameters(), lr=0.1) # 使用 Adam 优化器
mll = gpytorch.mlls.ExactMarginalLogLikelihood(likelihood, model)
# 训练迭代
for _ in range(50):
optimizer.zero_grad()
output = model(X)
loss = -mll(output, Y)
loss.backward()
optimizer.step()
# 评估模式
model.eval()
likelihood.eval()
# 进行预测
with torch.no_grad():
X_new = torch.rand(50, 1).to(device)
preds = model(X_new)
preds_mean = preds.mean
preds_variance = preds.variance
# 将预测结果移回CPU以便绘图
preds_mean = preds_mean.cpu()
preds_variance = preds_variance.cpu()
X_new = X_new.cpu()
# 可视化预测结果
plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)
plt.title("Mean Predictions")
plt.scatter(X.cpu(), Y.cpu()[:, 0], c='blue', label='Output 1 Data')
plt.scatter(X.cpu(), Y.cpu()[:, 1], c='orange', label='Output 2 Data')
plt.scatter(X_new.numpy(), preds_mean.numpy()[:, 0], c='blue', label='Predicted Output 1', marker='x')
plt.scatter(X_new.numpy(), preds_mean.numpy()[:, 1], c='orange', label='Predicted Output 2', marker='x')
plt.legend()
plt.subplot(1, 2, 2)
plt.title("Variance Predictions")
plt.scatter(X_new.numpy(), preds_variance.numpy()[:, 0], c='blue', label='Predicted Variance Output 1', marker='x')
plt.scatter(X_new.numpy(), preds_variance.numpy()[:, 1], c='orange', label='Predicted Variance Output 2', marker='x')
plt.legend()
plt.show()
说明
- 数据生成:
- 生成了 100 个随机输入,并计算两个输出(分别为正弦和余弦函数加上噪声)。
- 模型定义:
- 创建了一个
MultitaskGPModel
类,使用一个共享的 RBF 核和一个多任务内核来处理多输出。 - 使用
MultitaskMean
创建一个多任务均值模块。
- 模型训练:
- 使用 Adam 优化器最小化负对数边际似然(NLL)。
- 预测和可视化:
- 进行了预测并绘制了均值和方差的结