|
|
import torch |
|
|
import gpytorch |
|
|
from gauche.kernels.fingerprint_kernels.tanimoto_kernel import TanimotoKernel |
|
|
from gpytorch.kernels import ScaleKernel |
|
|
from gpytorch.means import ConstantMean |
|
|
from gpytorch.distributions import MultivariateNormal |
|
|
|
|
|
|
|
|
class ExactGPModel(gpytorch.models.ExactGP): |
|
|
def __init__(self, train_x, train_y, likelihood): |
|
|
super().__init__(train_x, train_y, likelihood) |
|
|
self.mean_module = ConstantMean() |
|
|
self.covar_module = ScaleKernel(TanimotoKernel()) |
|
|
|
|
|
def forward(self, x): |
|
|
mean_x = self.mean_module(x) |
|
|
covar_x = self.covar_module(x) |
|
|
return MultivariateNormal(mean_x, covar_x) |
|
|
|
|
|
|
|
|
class TanimotoGP: |
|
|
def __init__(self): |
|
|
self.likelihood = gpytorch.likelihoods.GaussianLikelihood() |
|
|
self.model = None |
|
|
self.train_x = None |
|
|
self.train_y = None |
|
|
|
|
|
def fit(self, X, y): |
|
|
self.train_x = torch.tensor(X, dtype=torch.float) |
|
|
self.train_y = torch.tensor(y, dtype=torch.float) |
|
|
|
|
|
self.model = ExactGPModel(self.train_x, self.train_y, self.likelihood) |
|
|
self.model.train() |
|
|
self.likelihood.train() |
|
|
|
|
|
optimizer = torch.optim.Adam(self.model.parameters(), lr=0.1) |
|
|
mll = gpytorch.mlls.ExactMarginalLogLikelihood(self.likelihood, self.model) |
|
|
|
|
|
for i in range(50): |
|
|
optimizer.zero_grad() |
|
|
output = self.model(self.train_x) |
|
|
loss = -1 * mll(output, self.train_y) |
|
|
loss.backward() |
|
|
optimizer.step() |
|
|
|
|
|
def predict(self, X): |
|
|
self.model.eval() |
|
|
self.likelihood.eval() |
|
|
|
|
|
test_x = torch.tensor(X, dtype=torch.float) |
|
|
with torch.no_grad(), gpytorch.settings.fast_pred_var(): |
|
|
preds = self.likelihood(self.model(test_x)) |
|
|
return preds.mean.numpy(), preds.variance.numpy() |
|
|
|