QEP Regression with Uncertain Inputs

Introduction

In this notebook, we’re going to demonstrate one way of dealing with uncertainty in our training data. Let’s say that we’re collecting training data that models the following function.

\[\begin{split}\begin{align} y &= \sin(2\pi x) + \epsilon \\ \epsilon &\sim \mathcal{Q}(0, 0.2) \end{align}\end{split}\]

However, now assume that we’re a bit uncertain about our features. In particular, we’re going to assume that every x_i value is not a point but a distribution instead. E.g.

\[x_i \sim \mathcal{Q}(\mu_i, \sigma_i).\]

Using a distributional kernel to deal with uncertain inputs

Rather than using a variational method (see the QEP Regression with Uncertian Inputs tutorial in the variational examples), if we explicitly know the type of uncertainty in our inputs we can pass that into our kernel.

More specifically, assuming Gaussian inputs, we will compute the symmetrized KL divergence between the Q-exponential inputs.

[1]:
import math
import torch
import tqdm
import qpytorch
from matplotlib import pyplot as plt

%matplotlib inline
%load_ext autoreload
%autoreload 2
[2]:
# Training data is 100 points in [0,1] inclusive regularly spaced
train_x_mean = torch.linspace(0, 1, 20)
# We'll assume the variance shrinks the closer we get to 1
train_x_stdv = torch.linspace(0.03, 0.01, 20)

# True function is sin(2*pi*x) with Gaussian noise
train_y = torch.sin(train_x_mean * (2 * math.pi)) + torch.randn(train_x_mean.size()) * 0.2

To effectively pass in the training distributional data, we will need to stack the mean and log variances.

[3]:
train_x_distributional = torch.stack((train_x_mean, (train_x_stdv**2).log()), dim=1)
[4]:
f, ax = plt.subplots(1, 1, figsize=(8, 3))
ax.errorbar(train_x_mean, train_y, xerr=(train_x_stdv * 2), fmt="k*", label="Train Data")
ax.legend()
[4]:
<matplotlib.legend.Legend at 0x124cb7b20>
../../_images/examples_01_Exact_QEPs_QEP_Regression_DistributionalKernel_6_1.png

We train the hyperparameters of the resulting distributional GP via type-II gradient descent, as is standard in many settings. We could also do fully Bayesian inference.

[5]:
from qpytorch.models import ExactQEP
from qpytorch.kernels import QExponentialSymmetrizedKLKernel, ScaleKernel
from qpytorch.means import ConstantMean
POWER =1.0

class ExactQEPModel(ExactQEP):
    def __init__(self, train_x, train_y, likelihood):
        super(ExactQEPModel, self).__init__(train_x, train_y, likelihood)
        self.power = torch.tensor(POWER)
        self.mean_module = ConstantMean()
        self.covar_module = ScaleKernel(QExponentialSymmetrizedKLKernel())

    def forward(self, x):
        mean_x = self.mean_module(x)
        covar_x = self.covar_module(x)
        return qpytorch.distributions.MultivariateQExponential(mean_x, covar_x, power=self.power)

# initialize likelihood and model
likelihood = qpytorch.likelihoods.QExponentialLikelihood(power=torch.tensor(POWER))
model = ExactQEPModel(train_x_distributional, train_y, likelihood)
[6]:
# this is for running the notebook in our testing framework
import os
smoke_test = ('CI' in os.environ)
training_iter = 2 if smoke_test else 500


# Find optimal model hyperparameters
model.train()
likelihood.train()

# Use the adam optimizer
optimizer = torch.optim.Adam(model.parameters(), lr=0.25)  # Includes QExponentialLikelihood parameters

# "Loss" for QEPs - the marginal log likelihood
mll = qpytorch.mlls.ExactMarginalLogLikelihood(likelihood, model)

for i in range(training_iter):
    # Zero gradients from previous iteration
    optimizer.zero_grad()
    # Output from model
    output = model(train_x_distributional)
    # Calc loss and backprop gradients
    loss = -mll(output, train_y)
    loss.backward()
    print('Iter %d/%d - Loss: %.3f   lengthscale: %.3f   noise: %.3f' % (
        i + 1, training_iter, loss.item(),
        model.covar_module.base_kernel.lengthscale.item(),
        model.likelihood.noise.item()
    ))
    optimizer.step()
Iter 1/500 - Loss: 1.597   lengthscale: 0.693   noise: 0.693
Iter 2/500 - Loss: 1.589   lengthscale: 0.826   noise: 0.576
Iter 3/500 - Loss: 1.508   lengthscale: 0.973   noise: 0.474
Iter 4/500 - Loss: 1.459   lengthscale: 1.133   noise: 0.387
Iter 5/500 - Loss: 1.418   lengthscale: 1.302   noise: 0.313
Iter 6/500 - Loss: 1.357   lengthscale: 1.483   noise: 0.251
Iter 7/500 - Loss: 1.290   lengthscale: 1.678   noise: 0.200
Iter 8/500 - Loss: 1.232   lengthscale: 1.884   noise: 0.158
Iter 9/500 - Loss: 1.181   lengthscale: 2.102   noise: 0.125
Iter 10/500 - Loss: 1.127   lengthscale: 2.327   noise: 0.098
Iter 11/500 - Loss: 1.066   lengthscale: 2.561   noise: 0.077
Iter 12/500 - Loss: 1.006   lengthscale: 2.800   noise: 0.060
Iter 13/500 - Loss: 0.952   lengthscale: 3.045   noise: 0.046
Iter 14/500 - Loss: 0.904   lengthscale: 3.294   noise: 0.036
Iter 15/500 - Loss: 0.857   lengthscale: 3.546   noise: 0.028
Iter 16/500 - Loss: 0.807   lengthscale: 3.801   noise: 0.021
Iter 17/500 - Loss: 0.758   lengthscale: 4.058   noise: 0.017
Iter 18/500 - Loss: 0.715   lengthscale: 4.316   noise: 0.013
Iter 19/500 - Loss: 0.677   lengthscale: 4.574   noise: 0.010
Iter 20/500 - Loss: 0.641   lengthscale: 4.831   noise: 0.008
Iter 21/500 - Loss: 0.605   lengthscale: 5.087   noise: 0.006
Iter 22/500 - Loss: 0.572   lengthscale: 5.342   noise: 0.005
Iter 23/500 - Loss: 0.544   lengthscale: 5.595   noise: 0.004
Iter 24/500 - Loss: 0.521   lengthscale: 5.845   noise: 0.003
Iter 25/500 - Loss: 0.501   lengthscale: 6.092   noise: 0.002
Iter 26/500 - Loss: 0.483   lengthscale: 6.335   noise: 0.002
Iter 27/500 - Loss: 0.467   lengthscale: 6.573   noise: 0.002
Iter 28/500 - Loss: 0.455   lengthscale: 6.807   noise: 0.001
Iter 29/500 - Loss: 0.445   lengthscale: 7.034   noise: 0.001
Iter 30/500 - Loss: 0.437   lengthscale: 7.256   noise: 0.001
Iter 31/500 - Loss: 0.431   lengthscale: 7.471   noise: 0.001
Iter 32/500 - Loss: 0.425   lengthscale: 7.679   noise: 0.001
Iter 33/500 - Loss: 0.420   lengthscale: 7.880   noise: 0.001
Iter 34/500 - Loss: 0.416   lengthscale: 8.073   noise: 0.001
Iter 35/500 - Loss: 0.414   lengthscale: 8.260   noise: 0.001
Iter 36/500 - Loss: 0.411   lengthscale: 8.438   noise: 0.000
Iter 37/500 - Loss: 0.409   lengthscale: 8.609   noise: 0.000
Iter 38/500 - Loss: 0.407   lengthscale: 8.773   noise: 0.000
Iter 39/500 - Loss: 0.405   lengthscale: 8.929   noise: 0.000
Iter 40/500 - Loss: 0.404   lengthscale: 9.078   noise: 0.000
Iter 41/500 - Loss: 0.402   lengthscale: 9.221   noise: 0.000
Iter 42/500 - Loss: 0.401   lengthscale: 9.356   noise: 0.000
Iter 43/500 - Loss: 0.400   lengthscale: 9.486   noise: 0.000
Iter 44/500 - Loss: 0.400   lengthscale: 9.609   noise: 0.000
Iter 45/500 - Loss: 0.399   lengthscale: 9.726   noise: 0.000
Iter 46/500 - Loss: 0.398   lengthscale: 9.839   noise: 0.000
Iter 47/500 - Loss: 0.398   lengthscale: 9.946   noise: 0.000
Iter 48/500 - Loss: 0.397   lengthscale: 10.048   noise: 0.000
Iter 49/500 - Loss: 0.397   lengthscale: 10.145   noise: 0.000
Iter 50/500 - Loss: 0.396   lengthscale: 10.238   noise: 0.000
Iter 51/500 - Loss: 0.396   lengthscale: 10.327   noise: 0.000
Iter 52/500 - Loss: 0.395   lengthscale: 10.412   noise: 0.000
Iter 53/500 - Loss: 0.395   lengthscale: 10.493   noise: 0.000
Iter 54/500 - Loss: 0.395   lengthscale: 10.571   noise: 0.000
Iter 55/500 - Loss: 0.394   lengthscale: 10.645   noise: 0.000
Iter 56/500 - Loss: 0.394   lengthscale: 10.716   noise: 0.000
Iter 57/500 - Loss: 0.394   lengthscale: 10.784   noise: 0.000
Iter 58/500 - Loss: 0.394   lengthscale: 10.849   noise: 0.000
Iter 59/500 - Loss: 0.393   lengthscale: 10.911   noise: 0.000
Iter 60/500 - Loss: 0.393   lengthscale: 10.971   noise: 0.000
Iter 61/500 - Loss: 0.393   lengthscale: 11.028   noise: 0.000
Iter 62/500 - Loss: 0.393   lengthscale: 11.083   noise: 0.000
Iter 63/500 - Loss: 0.392   lengthscale: 11.136   noise: 0.000
Iter 64/500 - Loss: 0.392   lengthscale: 11.187   noise: 0.000
Iter 65/500 - Loss: 0.392   lengthscale: 11.236   noise: 0.000
Iter 66/500 - Loss: 0.392   lengthscale: 11.284   noise: 0.000
Iter 67/500 - Loss: 0.392   lengthscale: 11.330   noise: 0.000
Iter 68/500 - Loss: 0.391   lengthscale: 11.375   noise: 0.000
Iter 69/500 - Loss: 0.391   lengthscale: 11.418   noise: 0.000
Iter 70/500 - Loss: 0.391   lengthscale: 11.460   noise: 0.000
Iter 71/500 - Loss: 0.391   lengthscale: 11.501   noise: 0.000
Iter 72/500 - Loss: 0.391   lengthscale: 11.542   noise: 0.000
Iter 73/500 - Loss: 0.390   lengthscale: 11.581   noise: 0.000
Iter 74/500 - Loss: 0.390   lengthscale: 11.619   noise: 0.000
Iter 75/500 - Loss: 0.390   lengthscale: 11.656   noise: 0.000
Iter 76/500 - Loss: 0.390   lengthscale: 11.693   noise: 0.000
Iter 77/500 - Loss: 0.390   lengthscale: 11.728   noise: 0.000
Iter 78/500 - Loss: 0.390   lengthscale: 11.763   noise: 0.000
Iter 79/500 - Loss: 0.389   lengthscale: 11.797   noise: 0.000
Iter 80/500 - Loss: 0.389   lengthscale: 11.831   noise: 0.000
Iter 81/500 - Loss: 0.389   lengthscale: 11.864   noise: 0.000
Iter 82/500 - Loss: 0.389   lengthscale: 11.896   noise: 0.000
Iter 83/500 - Loss: 0.389   lengthscale: 11.928   noise: 0.000
Iter 84/500 - Loss: 0.388   lengthscale: 11.960   noise: 0.000
Iter 85/500 - Loss: 0.388   lengthscale: 11.991   noise: 0.000
Iter 86/500 - Loss: 0.388   lengthscale: 12.022   noise: 0.000
Iter 87/500 - Loss: 0.388   lengthscale: 12.052   noise: 0.000
Iter 88/500 - Loss: 0.387   lengthscale: 12.083   noise: 0.000
Iter 89/500 - Loss: 0.387   lengthscale: 12.113   noise: 0.000
Iter 90/500 - Loss: 0.387   lengthscale: 12.143   noise: 0.000
Iter 91/500 - Loss: 0.387   lengthscale: 12.172   noise: 0.000
Iter 92/500 - Loss: 0.386   lengthscale: 12.202   noise: 0.000
Iter 93/500 - Loss: 0.386   lengthscale: 12.231   noise: 0.000
Iter 94/500 - Loss: 0.386   lengthscale: 12.261   noise: 0.000
Iter 95/500 - Loss: 0.386   lengthscale: 12.290   noise: 0.000
Iter 96/500 - Loss: 0.385   lengthscale: 12.319   noise: 0.000
Iter 97/500 - Loss: 0.385   lengthscale: 12.348   noise: 0.000
Iter 98/500 - Loss: 0.385   lengthscale: 12.378   noise: 0.000
Iter 99/500 - Loss: 0.384   lengthscale: 12.407   noise: 0.000
Iter 100/500 - Loss: 0.384   lengthscale: 12.436   noise: 0.000
Iter 101/500 - Loss: 0.384   lengthscale: 12.465   noise: 0.000
Iter 102/500 - Loss: 0.383   lengthscale: 12.495   noise: 0.000
Iter 103/500 - Loss: 0.383   lengthscale: 12.525   noise: 0.000
Iter 104/500 - Loss: 0.383   lengthscale: 12.554   noise: 0.000
Iter 105/500 - Loss: 0.382   lengthscale: 12.584   noise: 0.000
Iter 106/500 - Loss: 0.382   lengthscale: 12.614   noise: 0.000
Iter 107/500 - Loss: 0.382   lengthscale: 12.645   noise: 0.001
Iter 108/500 - Loss: 0.381   lengthscale: 12.676   noise: 0.001
Iter 109/500 - Loss: 0.381   lengthscale: 12.707   noise: 0.001
Iter 110/500 - Loss: 0.381   lengthscale: 12.738   noise: 0.001
Iter 111/500 - Loss: 0.380   lengthscale: 12.769   noise: 0.001
Iter 112/500 - Loss: 0.380   lengthscale: 12.801   noise: 0.001
Iter 113/500 - Loss: 0.380   lengthscale: 12.834   noise: 0.001
Iter 114/500 - Loss: 0.379   lengthscale: 12.866   noise: 0.001
Iter 115/500 - Loss: 0.379   lengthscale: 12.899   noise: 0.001
Iter 116/500 - Loss: 0.379   lengthscale: 12.933   noise: 0.001
Iter 117/500 - Loss: 0.378   lengthscale: 12.966   noise: 0.001
Iter 118/500 - Loss: 0.378   lengthscale: 13.001   noise: 0.001
Iter 119/500 - Loss: 0.378   lengthscale: 13.035   noise: 0.001
Iter 120/500 - Loss: 0.378   lengthscale: 13.070   noise: 0.001
Iter 121/500 - Loss: 0.377   lengthscale: 13.105   noise: 0.001
Iter 122/500 - Loss: 0.377   lengthscale: 13.141   noise: 0.001
Iter 123/500 - Loss: 0.377   lengthscale: 13.177   noise: 0.001
Iter 124/500 - Loss: 0.377   lengthscale: 13.214   noise: 0.001
Iter 125/500 - Loss: 0.377   lengthscale: 13.251   noise: 0.001
Iter 126/500 - Loss: 0.377   lengthscale: 13.288   noise: 0.001
Iter 127/500 - Loss: 0.377   lengthscale: 13.325   noise: 0.001
Iter 128/500 - Loss: 0.376   lengthscale: 13.363   noise: 0.001
Iter 129/500 - Loss: 0.376   lengthscale: 13.401   noise: 0.001
Iter 130/500 - Loss: 0.376   lengthscale: 13.440   noise: 0.001
Iter 131/500 - Loss: 0.376   lengthscale: 13.478   noise: 0.001
Iter 132/500 - Loss: 0.376   lengthscale: 13.517   noise: 0.001
Iter 133/500 - Loss: 0.376   lengthscale: 13.556   noise: 0.001
Iter 134/500 - Loss: 0.376   lengthscale: 13.594   noise: 0.001
Iter 135/500 - Loss: 0.376   lengthscale: 13.633   noise: 0.001
Iter 136/500 - Loss: 0.376   lengthscale: 13.672   noise: 0.001
Iter 137/500 - Loss: 0.375   lengthscale: 13.712   noise: 0.001
Iter 138/500 - Loss: 0.375   lengthscale: 13.751   noise: 0.001
Iter 139/500 - Loss: 0.375   lengthscale: 13.789   noise: 0.001
Iter 140/500 - Loss: 0.375   lengthscale: 13.828   noise: 0.001
Iter 141/500 - Loss: 0.375   lengthscale: 13.867   noise: 0.001
Iter 142/500 - Loss: 0.375   lengthscale: 13.906   noise: 0.001
Iter 143/500 - Loss: 0.375   lengthscale: 13.944   noise: 0.001
Iter 144/500 - Loss: 0.375   lengthscale: 13.982   noise: 0.001
Iter 145/500 - Loss: 0.375   lengthscale: 14.020   noise: 0.001
Iter 146/500 - Loss: 0.375   lengthscale: 14.058   noise: 0.001
Iter 147/500 - Loss: 0.374   lengthscale: 14.096   noise: 0.001
Iter 148/500 - Loss: 0.374   lengthscale: 14.133   noise: 0.001
Iter 149/500 - Loss: 0.374   lengthscale: 14.170   noise: 0.001
Iter 150/500 - Loss: 0.374   lengthscale: 14.206   noise: 0.001
Iter 151/500 - Loss: 0.374   lengthscale: 14.243   noise: 0.001
Iter 152/500 - Loss: 0.374   lengthscale: 14.278   noise: 0.001
Iter 153/500 - Loss: 0.374   lengthscale: 14.314   noise: 0.001
Iter 154/500 - Loss: 0.374   lengthscale: 14.349   noise: 0.001
Iter 155/500 - Loss: 0.374   lengthscale: 14.384   noise: 0.001
Iter 156/500 - Loss: 0.374   lengthscale: 14.419   noise: 0.001
Iter 157/500 - Loss: 0.374   lengthscale: 14.453   noise: 0.001
Iter 158/500 - Loss: 0.374   lengthscale: 14.487   noise: 0.001
Iter 159/500 - Loss: 0.373   lengthscale: 14.520   noise: 0.001
Iter 160/500 - Loss: 0.373   lengthscale: 14.554   noise: 0.001
Iter 161/500 - Loss: 0.373   lengthscale: 14.587   noise: 0.001
Iter 162/500 - Loss: 0.373   lengthscale: 14.619   noise: 0.001
Iter 163/500 - Loss: 0.373   lengthscale: 14.651   noise: 0.001
Iter 164/500 - Loss: 0.373   lengthscale: 14.683   noise: 0.001
Iter 165/500 - Loss: 0.373   lengthscale: 14.715   noise: 0.001
Iter 166/500 - Loss: 0.373   lengthscale: 14.746   noise: 0.001
Iter 167/500 - Loss: 0.373   lengthscale: 14.778   noise: 0.001
Iter 168/500 - Loss: 0.373   lengthscale: 14.808   noise: 0.001
Iter 169/500 - Loss: 0.373   lengthscale: 14.839   noise: 0.001
Iter 170/500 - Loss: 0.373   lengthscale: 14.869   noise: 0.001
Iter 171/500 - Loss: 0.373   lengthscale: 14.899   noise: 0.001
Iter 172/500 - Loss: 0.373   lengthscale: 14.929   noise: 0.001
Iter 173/500 - Loss: 0.373   lengthscale: 14.959   noise: 0.001
Iter 174/500 - Loss: 0.373   lengthscale: 14.988   noise: 0.001
Iter 175/500 - Loss: 0.372   lengthscale: 15.017   noise: 0.001
Iter 176/500 - Loss: 0.372   lengthscale: 15.046   noise: 0.001
Iter 177/500 - Loss: 0.372   lengthscale: 15.075   noise: 0.001
Iter 178/500 - Loss: 0.372   lengthscale: 15.103   noise: 0.001
Iter 179/500 - Loss: 0.372   lengthscale: 15.132   noise: 0.001
Iter 180/500 - Loss: 0.372   lengthscale: 15.160   noise: 0.001
Iter 181/500 - Loss: 0.372   lengthscale: 15.188   noise: 0.001
Iter 182/500 - Loss: 0.372   lengthscale: 15.215   noise: 0.001
Iter 183/500 - Loss: 0.372   lengthscale: 15.243   noise: 0.001
Iter 184/500 - Loss: 0.372   lengthscale: 15.270   noise: 0.001
Iter 185/500 - Loss: 0.372   lengthscale: 15.297   noise: 0.001
Iter 186/500 - Loss: 0.372   lengthscale: 15.324   noise: 0.001
Iter 187/500 - Loss: 0.372   lengthscale: 15.351   noise: 0.001
Iter 188/500 - Loss: 0.372   lengthscale: 15.378   noise: 0.001
Iter 189/500 - Loss: 0.372   lengthscale: 15.404   noise: 0.001
Iter 190/500 - Loss: 0.372   lengthscale: 15.430   noise: 0.001
Iter 191/500 - Loss: 0.372   lengthscale: 15.456   noise: 0.001
Iter 192/500 - Loss: 0.372   lengthscale: 15.482   noise: 0.001
Iter 193/500 - Loss: 0.372   lengthscale: 15.508   noise: 0.001
Iter 194/500 - Loss: 0.372   lengthscale: 15.533   noise: 0.001
Iter 195/500 - Loss: 0.372   lengthscale: 15.558   noise: 0.001
Iter 196/500 - Loss: 0.372   lengthscale: 15.584   noise: 0.001
Iter 197/500 - Loss: 0.372   lengthscale: 15.608   noise: 0.001
Iter 198/500 - Loss: 0.371   lengthscale: 15.633   noise: 0.001
Iter 199/500 - Loss: 0.371   lengthscale: 15.658   noise: 0.001
Iter 200/500 - Loss: 0.371   lengthscale: 15.682   noise: 0.001
Iter 201/500 - Loss: 0.371   lengthscale: 15.706   noise: 0.001
Iter 202/500 - Loss: 0.371   lengthscale: 15.730   noise: 0.001
Iter 203/500 - Loss: 0.371   lengthscale: 15.754   noise: 0.001
Iter 204/500 - Loss: 0.371   lengthscale: 15.778   noise: 0.001
Iter 205/500 - Loss: 0.371   lengthscale: 15.801   noise: 0.001
Iter 206/500 - Loss: 0.371   lengthscale: 15.825   noise: 0.001
Iter 207/500 - Loss: 0.371   lengthscale: 15.848   noise: 0.001
Iter 208/500 - Loss: 0.371   lengthscale: 15.871   noise: 0.001
Iter 209/500 - Loss: 0.371   lengthscale: 15.894   noise: 0.001
Iter 210/500 - Loss: 0.371   lengthscale: 15.916   noise: 0.001
Iter 211/500 - Loss: 0.371   lengthscale: 15.939   noise: 0.001
Iter 212/500 - Loss: 0.371   lengthscale: 15.961   noise: 0.001
Iter 213/500 - Loss: 0.371   lengthscale: 15.983   noise: 0.001
Iter 214/500 - Loss: 0.371   lengthscale: 16.005   noise: 0.001
Iter 215/500 - Loss: 0.371   lengthscale: 16.027   noise: 0.001
Iter 216/500 - Loss: 0.371   lengthscale: 16.049   noise: 0.001
Iter 217/500 - Loss: 0.371   lengthscale: 16.070   noise: 0.001
Iter 218/500 - Loss: 0.371   lengthscale: 16.092   noise: 0.001
Iter 219/500 - Loss: 0.371   lengthscale: 16.113   noise: 0.001
Iter 220/500 - Loss: 0.371   lengthscale: 16.134   noise: 0.001
Iter 221/500 - Loss: 0.371   lengthscale: 16.155   noise: 0.001
Iter 222/500 - Loss: 0.371   lengthscale: 16.176   noise: 0.001
Iter 223/500 - Loss: 0.371   lengthscale: 16.197   noise: 0.001
Iter 224/500 - Loss: 0.371   lengthscale: 16.217   noise: 0.001
Iter 225/500 - Loss: 0.371   lengthscale: 16.238   noise: 0.001
Iter 226/500 - Loss: 0.371   lengthscale: 16.258   noise: 0.001
Iter 227/500 - Loss: 0.371   lengthscale: 16.278   noise: 0.001
Iter 228/500 - Loss: 0.371   lengthscale: 16.298   noise: 0.001
Iter 229/500 - Loss: 0.371   lengthscale: 16.318   noise: 0.001
Iter 230/500 - Loss: 0.371   lengthscale: 16.338   noise: 0.001
Iter 231/500 - Loss: 0.371   lengthscale: 16.358   noise: 0.001
Iter 232/500 - Loss: 0.371   lengthscale: 16.377   noise: 0.001
Iter 233/500 - Loss: 0.371   lengthscale: 16.397   noise: 0.001
Iter 234/500 - Loss: 0.371   lengthscale: 16.416   noise: 0.001
Iter 235/500 - Loss: 0.371   lengthscale: 16.435   noise: 0.001
Iter 236/500 - Loss: 0.370   lengthscale: 16.454   noise: 0.001
Iter 237/500 - Loss: 0.370   lengthscale: 16.473   noise: 0.001
Iter 238/500 - Loss: 0.370   lengthscale: 16.492   noise: 0.001
Iter 239/500 - Loss: 0.370   lengthscale: 16.510   noise: 0.001
Iter 240/500 - Loss: 0.370   lengthscale: 16.529   noise: 0.001
Iter 241/500 - Loss: 0.370   lengthscale: 16.547   noise: 0.001
Iter 242/500 - Loss: 0.370   lengthscale: 16.566   noise: 0.001
Iter 243/500 - Loss: 0.370   lengthscale: 16.584   noise: 0.001
Iter 244/500 - Loss: 0.370   lengthscale: 16.602   noise: 0.001
Iter 245/500 - Loss: 0.370   lengthscale: 16.620   noise: 0.001
Iter 246/500 - Loss: 0.370   lengthscale: 16.638   noise: 0.001
Iter 247/500 - Loss: 0.370   lengthscale: 16.655   noise: 0.001
Iter 248/500 - Loss: 0.370   lengthscale: 16.673   noise: 0.001
Iter 249/500 - Loss: 0.370   lengthscale: 16.691   noise: 0.001
Iter 250/500 - Loss: 0.370   lengthscale: 16.708   noise: 0.001
Iter 251/500 - Loss: 0.370   lengthscale: 16.725   noise: 0.001
Iter 252/500 - Loss: 0.370   lengthscale: 16.742   noise: 0.001
Iter 253/500 - Loss: 0.370   lengthscale: 16.759   noise: 0.001
Iter 254/500 - Loss: 0.370   lengthscale: 16.776   noise: 0.001
Iter 255/500 - Loss: 0.370   lengthscale: 16.793   noise: 0.001
Iter 256/500 - Loss: 0.370   lengthscale: 16.810   noise: 0.001
Iter 257/500 - Loss: 0.370   lengthscale: 16.827   noise: 0.001
Iter 258/500 - Loss: 0.370   lengthscale: 16.843   noise: 0.001
Iter 259/500 - Loss: 0.370   lengthscale: 16.860   noise: 0.001
Iter 260/500 - Loss: 0.370   lengthscale: 16.876   noise: 0.001
Iter 261/500 - Loss: 0.370   lengthscale: 16.892   noise: 0.001
Iter 262/500 - Loss: 0.370   lengthscale: 16.908   noise: 0.001
Iter 263/500 - Loss: 0.370   lengthscale: 16.924   noise: 0.001
Iter 264/500 - Loss: 0.370   lengthscale: 16.940   noise: 0.001
Iter 265/500 - Loss: 0.370   lengthscale: 16.956   noise: 0.001
Iter 266/500 - Loss: 0.370   lengthscale: 16.972   noise: 0.001
Iter 267/500 - Loss: 0.370   lengthscale: 16.987   noise: 0.001
Iter 268/500 - Loss: 0.370   lengthscale: 17.003   noise: 0.001
Iter 269/500 - Loss: 0.370   lengthscale: 17.018   noise: 0.001
Iter 270/500 - Loss: 0.370   lengthscale: 17.034   noise: 0.001
Iter 271/500 - Loss: 0.370   lengthscale: 17.049   noise: 0.001
Iter 272/500 - Loss: 0.370   lengthscale: 17.064   noise: 0.001
Iter 273/500 - Loss: 0.370   lengthscale: 17.079   noise: 0.001
Iter 274/500 - Loss: 0.370   lengthscale: 17.094   noise: 0.001
Iter 275/500 - Loss: 0.370   lengthscale: 17.109   noise: 0.001
Iter 276/500 - Loss: 0.370   lengthscale: 17.124   noise: 0.001
Iter 277/500 - Loss: 0.370   lengthscale: 17.138   noise: 0.001
Iter 278/500 - Loss: 0.370   lengthscale: 17.153   noise: 0.001
Iter 279/500 - Loss: 0.370   lengthscale: 17.167   noise: 0.001
Iter 280/500 - Loss: 0.370   lengthscale: 17.182   noise: 0.001
Iter 281/500 - Loss: 0.370   lengthscale: 17.196   noise: 0.001
Iter 282/500 - Loss: 0.370   lengthscale: 17.211   noise: 0.001
Iter 283/500 - Loss: 0.370   lengthscale: 17.225   noise: 0.001
Iter 284/500 - Loss: 0.370   lengthscale: 17.239   noise: 0.001
Iter 285/500 - Loss: 0.370   lengthscale: 17.253   noise: 0.001
Iter 286/500 - Loss: 0.370   lengthscale: 17.267   noise: 0.001
Iter 287/500 - Loss: 0.370   lengthscale: 17.281   noise: 0.001
Iter 288/500 - Loss: 0.370   lengthscale: 17.294   noise: 0.001
Iter 289/500 - Loss: 0.370   lengthscale: 17.308   noise: 0.001
Iter 290/500 - Loss: 0.370   lengthscale: 17.321   noise: 0.001
Iter 291/500 - Loss: 0.370   lengthscale: 17.335   noise: 0.001
Iter 292/500 - Loss: 0.370   lengthscale: 17.348   noise: 0.001
Iter 293/500 - Loss: 0.370   lengthscale: 17.362   noise: 0.001
Iter 294/500 - Loss: 0.370   lengthscale: 17.375   noise: 0.001
Iter 295/500 - Loss: 0.370   lengthscale: 17.388   noise: 0.001
Iter 296/500 - Loss: 0.370   lengthscale: 17.401   noise: 0.001
Iter 297/500 - Loss: 0.370   lengthscale: 17.414   noise: 0.001
Iter 298/500 - Loss: 0.370   lengthscale: 17.427   noise: 0.001
Iter 299/500 - Loss: 0.370   lengthscale: 17.440   noise: 0.001
Iter 300/500 - Loss: 0.370   lengthscale: 17.453   noise: 0.001
Iter 301/500 - Loss: 0.370   lengthscale: 17.466   noise: 0.001
Iter 302/500 - Loss: 0.370   lengthscale: 17.478   noise: 0.001
Iter 303/500 - Loss: 0.370   lengthscale: 17.491   noise: 0.001
Iter 304/500 - Loss: 0.370   lengthscale: 17.503   noise: 0.001
Iter 305/500 - Loss: 0.370   lengthscale: 17.516   noise: 0.001
Iter 306/500 - Loss: 0.370   lengthscale: 17.528   noise: 0.001
Iter 307/500 - Loss: 0.370   lengthscale: 17.540   noise: 0.001
Iter 308/500 - Loss: 0.370   lengthscale: 17.553   noise: 0.001
Iter 309/500 - Loss: 0.370   lengthscale: 17.565   noise: 0.001
Iter 310/500 - Loss: 0.370   lengthscale: 17.577   noise: 0.001
Iter 311/500 - Loss: 0.370   lengthscale: 17.589   noise: 0.001
Iter 312/500 - Loss: 0.370   lengthscale: 17.601   noise: 0.001
Iter 313/500 - Loss: 0.370   lengthscale: 17.612   noise: 0.001
Iter 314/500 - Loss: 0.370   lengthscale: 17.624   noise: 0.001
Iter 315/500 - Loss: 0.370   lengthscale: 17.636   noise: 0.001
Iter 316/500 - Loss: 0.370   lengthscale: 17.648   noise: 0.001
Iter 317/500 - Loss: 0.370   lengthscale: 17.659   noise: 0.001
Iter 318/500 - Loss: 0.370   lengthscale: 17.671   noise: 0.001
Iter 319/500 - Loss: 0.370   lengthscale: 17.682   noise: 0.001
Iter 320/500 - Loss: 0.370   lengthscale: 17.693   noise: 0.001
Iter 321/500 - Loss: 0.370   lengthscale: 17.705   noise: 0.001
Iter 322/500 - Loss: 0.370   lengthscale: 17.716   noise: 0.001
Iter 323/500 - Loss: 0.370   lengthscale: 17.727   noise: 0.001
Iter 324/500 - Loss: 0.370   lengthscale: 17.738   noise: 0.001
Iter 325/500 - Loss: 0.370   lengthscale: 17.749   noise: 0.001
Iter 326/500 - Loss: 0.370   lengthscale: 17.760   noise: 0.001
Iter 327/500 - Loss: 0.370   lengthscale: 17.771   noise: 0.001
Iter 328/500 - Loss: 0.370   lengthscale: 17.782   noise: 0.001
Iter 329/500 - Loss: 0.370   lengthscale: 17.793   noise: 0.001
Iter 330/500 - Loss: 0.370   lengthscale: 17.803   noise: 0.001
Iter 331/500 - Loss: 0.370   lengthscale: 17.814   noise: 0.001
Iter 332/500 - Loss: 0.370   lengthscale: 17.825   noise: 0.001
Iter 333/500 - Loss: 0.370   lengthscale: 17.835   noise: 0.001
Iter 334/500 - Loss: 0.369   lengthscale: 17.846   noise: 0.001
Iter 335/500 - Loss: 0.369   lengthscale: 17.856   noise: 0.001
Iter 336/500 - Loss: 0.369   lengthscale: 17.866   noise: 0.001
Iter 337/500 - Loss: 0.369   lengthscale: 17.877   noise: 0.001
Iter 338/500 - Loss: 0.369   lengthscale: 17.887   noise: 0.001
Iter 339/500 - Loss: 0.369   lengthscale: 17.897   noise: 0.001
Iter 340/500 - Loss: 0.369   lengthscale: 17.907   noise: 0.001
Iter 341/500 - Loss: 0.369   lengthscale: 17.917   noise: 0.001
Iter 342/500 - Loss: 0.369   lengthscale: 17.927   noise: 0.001
Iter 343/500 - Loss: 0.369   lengthscale: 17.937   noise: 0.001
Iter 344/500 - Loss: 0.369   lengthscale: 17.947   noise: 0.001
Iter 345/500 - Loss: 0.369   lengthscale: 17.957   noise: 0.001
Iter 346/500 - Loss: 0.369   lengthscale: 17.967   noise: 0.001
Iter 347/500 - Loss: 0.369   lengthscale: 17.976   noise: 0.001
Iter 348/500 - Loss: 0.369   lengthscale: 17.986   noise: 0.001
Iter 349/500 - Loss: 0.369   lengthscale: 17.996   noise: 0.001
Iter 350/500 - Loss: 0.369   lengthscale: 18.005   noise: 0.001
Iter 351/500 - Loss: 0.369   lengthscale: 18.015   noise: 0.001
Iter 352/500 - Loss: 0.369   lengthscale: 18.024   noise: 0.001
Iter 353/500 - Loss: 0.369   lengthscale: 18.033   noise: 0.001
Iter 354/500 - Loss: 0.369   lengthscale: 18.043   noise: 0.001
Iter 355/500 - Loss: 0.369   lengthscale: 18.052   noise: 0.001
Iter 356/500 - Loss: 0.369   lengthscale: 18.061   noise: 0.001
Iter 357/500 - Loss: 0.369   lengthscale: 18.070   noise: 0.001
Iter 358/500 - Loss: 0.369   lengthscale: 18.079   noise: 0.001
Iter 359/500 - Loss: 0.369   lengthscale: 18.088   noise: 0.001
Iter 360/500 - Loss: 0.369   lengthscale: 18.097   noise: 0.001
Iter 361/500 - Loss: 0.369   lengthscale: 18.106   noise: 0.001
Iter 362/500 - Loss: 0.369   lengthscale: 18.115   noise: 0.001
Iter 363/500 - Loss: 0.369   lengthscale: 18.124   noise: 0.001
Iter 364/500 - Loss: 0.369   lengthscale: 18.133   noise: 0.001
Iter 365/500 - Loss: 0.369   lengthscale: 18.142   noise: 0.001
Iter 366/500 - Loss: 0.369   lengthscale: 18.150   noise: 0.001
Iter 367/500 - Loss: 0.369   lengthscale: 18.159   noise: 0.001
Iter 368/500 - Loss: 0.369   lengthscale: 18.167   noise: 0.001
Iter 369/500 - Loss: 0.369   lengthscale: 18.176   noise: 0.001
Iter 370/500 - Loss: 0.369   lengthscale: 18.184   noise: 0.001
Iter 371/500 - Loss: 0.369   lengthscale: 18.193   noise: 0.001
Iter 372/500 - Loss: 0.369   lengthscale: 18.201   noise: 0.001
Iter 373/500 - Loss: 0.369   lengthscale: 18.210   noise: 0.001
Iter 374/500 - Loss: 0.369   lengthscale: 18.218   noise: 0.001
Iter 375/500 - Loss: 0.369   lengthscale: 18.226   noise: 0.001
Iter 376/500 - Loss: 0.369   lengthscale: 18.234   noise: 0.001
Iter 377/500 - Loss: 0.369   lengthscale: 18.243   noise: 0.001
Iter 378/500 - Loss: 0.369   lengthscale: 18.251   noise: 0.001
Iter 379/500 - Loss: 0.369   lengthscale: 18.259   noise: 0.001
Iter 380/500 - Loss: 0.369   lengthscale: 18.267   noise: 0.001
Iter 381/500 - Loss: 0.369   lengthscale: 18.275   noise: 0.001
Iter 382/500 - Loss: 0.369   lengthscale: 18.283   noise: 0.001
Iter 383/500 - Loss: 0.369   lengthscale: 18.290   noise: 0.001
Iter 384/500 - Loss: 0.369   lengthscale: 18.298   noise: 0.001
Iter 385/500 - Loss: 0.369   lengthscale: 18.306   noise: 0.001
Iter 386/500 - Loss: 0.369   lengthscale: 18.314   noise: 0.001
Iter 387/500 - Loss: 0.369   lengthscale: 18.321   noise: 0.001
Iter 388/500 - Loss: 0.369   lengthscale: 18.329   noise: 0.001
Iter 389/500 - Loss: 0.369   lengthscale: 18.337   noise: 0.001
Iter 390/500 - Loss: 0.369   lengthscale: 18.344   noise: 0.001
Iter 391/500 - Loss: 0.369   lengthscale: 18.352   noise: 0.001
Iter 392/500 - Loss: 0.369   lengthscale: 18.359   noise: 0.001
Iter 393/500 - Loss: 0.369   lengthscale: 18.367   noise: 0.001
Iter 394/500 - Loss: 0.369   lengthscale: 18.374   noise: 0.001
Iter 395/500 - Loss: 0.369   lengthscale: 18.381   noise: 0.001
Iter 396/500 - Loss: 0.369   lengthscale: 18.389   noise: 0.001
Iter 397/500 - Loss: 0.369   lengthscale: 18.396   noise: 0.001
Iter 398/500 - Loss: 0.369   lengthscale: 18.403   noise: 0.001
Iter 399/500 - Loss: 0.369   lengthscale: 18.410   noise: 0.001
Iter 400/500 - Loss: 0.369   lengthscale: 18.417   noise: 0.001
Iter 401/500 - Loss: 0.369   lengthscale: 18.424   noise: 0.001
Iter 402/500 - Loss: 0.369   lengthscale: 18.431   noise: 0.001
Iter 403/500 - Loss: 0.369   lengthscale: 18.438   noise: 0.001
Iter 404/500 - Loss: 0.369   lengthscale: 18.445   noise: 0.001
Iter 405/500 - Loss: 0.369   lengthscale: 18.452   noise: 0.001
Iter 406/500 - Loss: 0.369   lengthscale: 18.459   noise: 0.001
Iter 407/500 - Loss: 0.369   lengthscale: 18.466   noise: 0.001
Iter 408/500 - Loss: 0.369   lengthscale: 18.473   noise: 0.001
Iter 409/500 - Loss: 0.369   lengthscale: 18.480   noise: 0.001
Iter 410/500 - Loss: 0.369   lengthscale: 18.486   noise: 0.001
Iter 411/500 - Loss: 0.369   lengthscale: 18.493   noise: 0.001
Iter 412/500 - Loss: 0.369   lengthscale: 18.500   noise: 0.001
Iter 413/500 - Loss: 0.369   lengthscale: 18.506   noise: 0.001
Iter 414/500 - Loss: 0.369   lengthscale: 18.513   noise: 0.001
Iter 415/500 - Loss: 0.369   lengthscale: 18.519   noise: 0.001
Iter 416/500 - Loss: 0.369   lengthscale: 18.526   noise: 0.001
Iter 417/500 - Loss: 0.369   lengthscale: 18.532   noise: 0.001
Iter 418/500 - Loss: 0.369   lengthscale: 18.539   noise: 0.001
Iter 419/500 - Loss: 0.369   lengthscale: 18.545   noise: 0.001
Iter 420/500 - Loss: 0.369   lengthscale: 18.551   noise: 0.001
Iter 421/500 - Loss: 0.369   lengthscale: 18.558   noise: 0.001
Iter 422/500 - Loss: 0.369   lengthscale: 18.564   noise: 0.001
Iter 423/500 - Loss: 0.369   lengthscale: 18.570   noise: 0.001
Iter 424/500 - Loss: 0.369   lengthscale: 18.576   noise: 0.001
Iter 425/500 - Loss: 0.369   lengthscale: 18.582   noise: 0.001
Iter 426/500 - Loss: 0.369   lengthscale: 18.589   noise: 0.001
Iter 427/500 - Loss: 0.369   lengthscale: 18.595   noise: 0.001
Iter 428/500 - Loss: 0.369   lengthscale: 18.601   noise: 0.001
Iter 429/500 - Loss: 0.369   lengthscale: 18.607   noise: 0.001
Iter 430/500 - Loss: 0.369   lengthscale: 18.613   noise: 0.001
Iter 431/500 - Loss: 0.369   lengthscale: 18.619   noise: 0.001
Iter 432/500 - Loss: 0.369   lengthscale: 18.624   noise: 0.001
Iter 433/500 - Loss: 0.369   lengthscale: 18.630   noise: 0.001
Iter 434/500 - Loss: 0.369   lengthscale: 18.636   noise: 0.001
Iter 435/500 - Loss: 0.369   lengthscale: 18.642   noise: 0.001
Iter 436/500 - Loss: 0.369   lengthscale: 18.648   noise: 0.001
Iter 437/500 - Loss: 0.369   lengthscale: 18.653   noise: 0.001
Iter 438/500 - Loss: 0.369   lengthscale: 18.659   noise: 0.001
Iter 439/500 - Loss: 0.369   lengthscale: 18.665   noise: 0.001
Iter 440/500 - Loss: 0.369   lengthscale: 18.670   noise: 0.001
Iter 441/500 - Loss: 0.369   lengthscale: 18.676   noise: 0.001
Iter 442/500 - Loss: 0.369   lengthscale: 18.682   noise: 0.001
Iter 443/500 - Loss: 0.369   lengthscale: 18.687   noise: 0.001
Iter 444/500 - Loss: 0.369   lengthscale: 18.693   noise: 0.001
Iter 445/500 - Loss: 0.369   lengthscale: 18.698   noise: 0.001
Iter 446/500 - Loss: 0.369   lengthscale: 18.703   noise: 0.001
Iter 447/500 - Loss: 0.369   lengthscale: 18.709   noise: 0.001
Iter 448/500 - Loss: 0.369   lengthscale: 18.714   noise: 0.001
Iter 449/500 - Loss: 0.369   lengthscale: 18.720   noise: 0.001
Iter 450/500 - Loss: 0.369   lengthscale: 18.725   noise: 0.001
Iter 451/500 - Loss: 0.369   lengthscale: 18.730   noise: 0.001
Iter 452/500 - Loss: 0.369   lengthscale: 18.735   noise: 0.001
Iter 453/500 - Loss: 0.369   lengthscale: 18.741   noise: 0.001
Iter 454/500 - Loss: 0.369   lengthscale: 18.746   noise: 0.001
Iter 455/500 - Loss: 0.369   lengthscale: 18.751   noise: 0.001
Iter 456/500 - Loss: 0.369   lengthscale: 18.756   noise: 0.001
Iter 457/500 - Loss: 0.369   lengthscale: 18.761   noise: 0.001
Iter 458/500 - Loss: 0.369   lengthscale: 18.766   noise: 0.001
Iter 459/500 - Loss: 0.369   lengthscale: 18.771   noise: 0.001
Iter 460/500 - Loss: 0.369   lengthscale: 18.776   noise: 0.001
Iter 461/500 - Loss: 0.369   lengthscale: 18.781   noise: 0.001
Iter 462/500 - Loss: 0.369   lengthscale: 18.786   noise: 0.001
Iter 463/500 - Loss: 0.369   lengthscale: 18.791   noise: 0.001
Iter 464/500 - Loss: 0.369   lengthscale: 18.796   noise: 0.001
Iter 465/500 - Loss: 0.369   lengthscale: 18.801   noise: 0.001
Iter 466/500 - Loss: 0.369   lengthscale: 18.806   noise: 0.001
Iter 467/500 - Loss: 0.369   lengthscale: 18.810   noise: 0.001
Iter 468/500 - Loss: 0.369   lengthscale: 18.815   noise: 0.001
Iter 469/500 - Loss: 0.369   lengthscale: 18.820   noise: 0.001
Iter 470/500 - Loss: 0.369   lengthscale: 18.825   noise: 0.001
Iter 471/500 - Loss: 0.369   lengthscale: 18.829   noise: 0.001
Iter 472/500 - Loss: 0.369   lengthscale: 18.834   noise: 0.001
Iter 473/500 - Loss: 0.369   lengthscale: 18.838   noise: 0.001
Iter 474/500 - Loss: 0.369   lengthscale: 18.843   noise: 0.001
Iter 475/500 - Loss: 0.369   lengthscale: 18.848   noise: 0.001
Iter 476/500 - Loss: 0.369   lengthscale: 18.852   noise: 0.001
Iter 477/500 - Loss: 0.369   lengthscale: 18.857   noise: 0.001
Iter 478/500 - Loss: 0.369   lengthscale: 18.861   noise: 0.001
Iter 479/500 - Loss: 0.369   lengthscale: 18.866   noise: 0.001
Iter 480/500 - Loss: 0.369   lengthscale: 18.870   noise: 0.001
Iter 481/500 - Loss: 0.369   lengthscale: 18.874   noise: 0.001
Iter 482/500 - Loss: 0.369   lengthscale: 18.879   noise: 0.001
Iter 483/500 - Loss: 0.369   lengthscale: 18.883   noise: 0.001
Iter 484/500 - Loss: 0.369   lengthscale: 18.887   noise: 0.001
Iter 485/500 - Loss: 0.369   lengthscale: 18.892   noise: 0.001
Iter 486/500 - Loss: 0.369   lengthscale: 18.896   noise: 0.001
Iter 487/500 - Loss: 0.369   lengthscale: 18.900   noise: 0.001
Iter 488/500 - Loss: 0.369   lengthscale: 18.904   noise: 0.001
Iter 489/500 - Loss: 0.369   lengthscale: 18.909   noise: 0.001
Iter 490/500 - Loss: 0.369   lengthscale: 18.913   noise: 0.001
Iter 491/500 - Loss: 0.369   lengthscale: 18.917   noise: 0.001
Iter 492/500 - Loss: 0.369   lengthscale: 18.921   noise: 0.001
Iter 493/500 - Loss: 0.369   lengthscale: 18.925   noise: 0.001
Iter 494/500 - Loss: 0.369   lengthscale: 18.929   noise: 0.001
Iter 495/500 - Loss: 0.369   lengthscale: 18.933   noise: 0.001
Iter 496/500 - Loss: 0.369   lengthscale: 18.937   noise: 0.001
Iter 497/500 - Loss: 0.369   lengthscale: 18.941   noise: 0.001
Iter 498/500 - Loss: 0.369   lengthscale: 18.945   noise: 0.001
Iter 499/500 - Loss: 0.369   lengthscale: 18.949   noise: 0.001
Iter 500/500 - Loss: 0.369   lengthscale: 18.953   noise: 0.001

Now, we test predictions. For simplicity, we will assume a fixed variance of \(0.01.\)

[7]:
# Get into evaluation (predictive posterior) mode
model.eval()
likelihood.eval()

# Test points are regularly spaced along [0,1]
# Make predictions by feeding model through likelihood
with torch.no_grad(), qpytorch.settings.fast_pred_var():
    test_x = torch.linspace(0, 1, 51)
    test_x_distributional = torch.stack((test_x, (1e-3 * torch.ones_like(test_x)).log()), dim=1)
    observed_pred = likelihood(model(test_x_distributional))

with torch.no_grad():
    # Initialize plot
    f, ax = plt.subplots(1, 1, figsize=(8, 3))

    # Get upper and lower confidence bounds
    lower, upper = observed_pred.confidence_region(rescale=True)
    # Plot training data as black stars
    ax.errorbar(train_x_mean.numpy(), train_y.numpy(), xerr=train_x_stdv, fmt='k*')
    # Plot predictive means as blue line
    ax.plot(test_x.numpy(), observed_pred.mean.numpy(), 'b')
    # Shade between the lower and upper confidence bounds
    ax.fill_between(test_x.numpy(), lower.numpy(), upper.numpy(), alpha=0.5)
    ax.set_ylim([-3, 3])
    ax.legend(['Observed Data', 'Mean', 'Confidence'])
../../_images/examples_01_Exact_QEPs_QEP_Regression_DistributionalKernel_11_0.png

As a final note, we’ve made it very easy to extend the distributional kernel class by exposing a generic DistributionalInputKernel class that takes as input any distance function over probability distributions.

[ ]: