NSGP-Torch

Examples

`gpytorch`

model with `skgpytorch`

```
# Import packages
import torch
from regdata import NonStat2D
from gpytorch.kernels import RBFKernel, ScaleKernel
from skgpytorch.models import ExactGPRegressor
from skgpytorch.metrics import mean_squared_error
# Hyperparameters
n_iters = 100
# Load data
datafunc = NonStat2D(backend="torch")
X_train, y_train, X_test = map(lambda x: x.to(torch.float32), datafunc.get_data())
y_test = datafunc.f(X_test[:, 0], X_test[:, 1]).to(torch.float32)
# Define a kernel
kernel = ScaleKernel(RBFKernel(ard_num_dims=X_train.shape[1]))
# Define a model
model = ExactGPRegressor(X_train, y_train, kernel, device='cpu')
# Train the model
model.fit(n_iters=n_iters, random_state=seed)
# Predict the distribution
pred_dist = model.predict(X_train, y_train, X_test)
# Compute RMSE and/or NLPD
mse = mean_squared_error(pred_dist, y_test, squared=False)
nlpd = neg_log_posterior_density(pred_dist, y_test)
```

`nsgptorch`

model with `skgpytorch`

```
# Import packages
import torch
from regdata import NonStat2D
from nsgptorch.kernels import rbf
from skgpytorch.models import ExactNSGPRegressor
from skgpytorch.metrics import mean_squared_error
# Hyperparameters
n_iters = 100
# Load data
datafunc = NonStat2D(backend="torch")
X_train, y_train, X_test = map(lambda x: x.to(torch.float32), datafunc.get_data())
y_test = datafunc.f(X_test[:, 0], X_test[:, 1]).to(torch.float32)
# Define a kernel list for each dimension
kernel_list = [rbf, rbf]
# Define inducing points for each dimension (must be none if not applicable)
inducing_points = [None, None]
# Define a model
model = ExactNSGPRegressor(kernel_list, input_dim=2, inducing_points, device='cpu')
# Train the model
model.fit(X_train, y_train, n_iters=n_iters, random_state=seed)
# Predict the distribution
pred_dist = model.predict(X_train, y_train, X_test)
# Compute RMSE and/or NLPD
mse = mean_squared_error(pred_dist, y_test, squared=False)
nlpd = neg_log_posterior_density(pred_dist, y_test)
```

Plan

- Each kernel is 1D
- Multiply kernels to each other

Ideas

- Compute distance once and save it
- Update skgpytorch to use 1 std instead of 0.1
- Do something about mean learning of gpytorch for comparison