forked from CoNG-harvard/bio_batch_BO
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathGP_models.py
More file actions
120 lines (101 loc) · 3.76 KB
/
GP_models.py
File metadata and controls
120 lines (101 loc) · 3.76 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
import anndata as an
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.widgets import Slider
import scipy.stats as stats
import random
import joblib
from joblib import Parallel, delayed
import multiprocessing
import itertools
import time
import sklearn.gaussian_process as gp
from sklearn.gaussian_process import GaussianProcessRegressor
from sklearn.gaussian_process.kernels import Matern, RBF, ConstantKernel
from scipy.stats import norm
from scipy.optimize import minimize
import torch
import gpytorch
from sklearn.utils import check_random_state
from sklearn.model_selection import train_test_split
from gpytorch.constraints.constraints import Interval
import re
import os
import copy
class ExactGPModel(gpytorch.models.ExactGP):
def __init__(self, train_x, train_y, likelihood):
super(ExactGPModel, self).__init__(train_x, train_y, likelihood)
self.mean_module = gpytorch.means.ConstantMean()
self.covar_module = gpytorch.kernels.ScaleKernel(gpytorch.kernels.MaternKernel(nu = 1.5))
def forward(self, x):
mean_x = self.mean_module(x)
covar_x = self.covar_module(x)
return gpytorch.distributions.MultivariateNormal(mean_x, covar_x)
class TorchGPModel():
def __init__(self, X, Y):
self.likelihood = gpytorch.likelihoods.GaussianLikelihood()
self.model = ExactGPModel(X, Y, self.likelihood)
self.train()
def train(self):
self.model.train()
self.likelihood.train()
def fit(self, X, Y):
if isinstance(X, list):
X = np.array(X)
if isinstance(X, np.ndarray):
X = torch.tensor(X).float()
if isinstance(Y, np.ndarray):
Y = torch.tensor(Y).float()
if len(X.shape) == 2:
X = X
if len(Y.shape) == 2:
Y = torch.reshape(Y, [-1, ])
# try:
self.model.set_train_data(X, Y, strict=False)
# except:
# self.__init__(X, Y, likelihood)
def predict(self, X, return_std= False, return_cov = False, return_tensor=False):
self.model.eval()
self.likelihood.eval()
if isinstance(X, np.ndarray):
X = torch.tensor(X).float()
if len(X.shape) == 1:
X = torch.reshape(X, [1, -1])
with gpytorch.settings.fast_pred_var():
f_pred = self.model(X)
if return_tensor:
if return_std:
return f_pred.mean, torch.sqrt(f_pred.variance)
elif return_cov:
return f_pred.mean, f_pred.covariance_matrix
else:
return f_pred.mean
else:
if return_std:
return f_pred.mean.detach().numpy(), np.sqrt(f_pred.variance.detach().numpy())
elif return_cov:
return f_pred.mean.detach().numpy(), f_pred.covariance_matrix.detach().numpy()
else:
return f_pred.mean.detach().numpy()
def sample_y(self, X, n_samples, random_state = None):
rng = check_random_state(random_state)
y_mean, y_cov = self.predict(X, return_cov=True)
if y_mean.ndim == 1:
y_samples = rng.multivariate_normal(y_mean, y_cov, n_samples).T
else:
y_samples = [
rng.multivariate_normal(
y_mean[:, target], y_cov[..., target], n_samples
).T[:, np.newaxis]
for target in range(y_mean.shape[1])
]
y_samples = np.hstack(y_samples)
return y_samples
@property
def y_train_(self):
return self.model.train_targets.detach().numpy()
@property
def X_train_(self):
return self.model.train_inputs[0].detach().numpy()