在使用 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()

说明

  1. 数据生成
  • 生成了 100 个随机输入,并计算两个输出(分别为正弦和余弦函数加上噪声)。
  1. 模型定义
  • 创建了一个 MultitaskGPModel 类,使用一个共享的 RBF 核和一个多任务内核来处理多输出。
  • 使用 MultitaskMean 创建一个多任务均值模块。
  1. 模型训练
  • 使用 Adam 优化器最小化负对数边际似然(NLL)。
  1. 预测和可视化
  • 进行了预测并绘制了均值和方差的结