Skip to content

Instantly share code, notes, and snippets.

@gajomi
Created November 19, 2018 23:27
Show Gist options
  • Save gajomi/ac02b9faa33c63213e35d7cd5fff6c1a to your computer and use it in GitHub Desktop.
Save gajomi/ac02b9faa33c63213e35d7cd5fff6c1a to your computer and use it in GitHub Desktop.
random gaussian process thingy
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# GPyTorch Regression Tutorial\n",
"\n",
"## Introduction\n",
"\n",
"In this notebook, we demonstrate many of the design features of GPyTorch using the simplest example, training an RBF kernel Gaussian process on a simple function. We'll be modeling the function\n",
"\n",
"\\begin{align*}\n",
" y &= \\sin(2\\pi x) + \\epsilon \\\\\n",
" \\epsilon &\\sim \\mathcal{N}(0, 0.2)\n",
"\\end{align*}\n",
"\n",
"with 11 training examples, and testing on 51 test examples.\n",
"\n",
"**Note:** this notebook is not necessarily intended to teach the mathematical background of Gaussian processes, but rather how to train a simple one and make predictions in GPyTorch. For a mathematical treatment, Chapter 2 of Gaussian Processes for Machine Learning provides a very thorough introduction to GP regression (this entire text is highly recommended): http://www.gaussianprocess.org/gpml/chapters/RW2.pdf"
]
},
{
"cell_type": "code",
"execution_count": 387,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"The autoreload extension is already loaded. To reload it, use:\n",
" %reload_ext autoreload\n"
]
}
],
"source": [
"import math\n",
"import torch\n",
"import gpytorch\n",
"from matplotlib import pyplot as plt\n",
"\n",
"%matplotlib inline\n",
"%load_ext autoreload\n",
"%autoreload 2"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Set up training data\n",
"\n",
"In the next cell, we set up the training data for this example. We'll be using 11 regularly spaced points on [0,1] which we evaluate the function on and add Gaussian noise to get the training labels."
]
},
{
"cell_type": "code",
"execution_count": 393,
"metadata": {},
"outputs": [],
"source": [
"def true_y(x):\n",
" return torch.sin(2 * math.pi*x)\n",
"\n",
"q = .1\n",
"def sample_x(N, x0 = .5):\n",
" x = torch.zeros(N)\n",
" x[0] = x0\n",
" for i in range(1,N):\n",
" a = q*(1+true_y(x[i-1]))\n",
" x[i] = x[i-1] + a*torch.randn(1)\n",
" return x"
]
},
{
"cell_type": "code",
"execution_count": 394,
"metadata": {},
"outputs": [],
"source": [
"# generate points to sample from\n",
"N = 50\n",
"train_x = sample_x(50)\n",
"delta_train_x = torch.cat((torch.zeros(1),train_x[1:]-train_x[:-1]))\n",
"# True function is sin(2*pi*x) with Gaussian noise\n",
"#train_y = true_y(train_x) + torch.randn(train_x.size()) * 0.2\n",
"train_y = abs((delta_train_x/q))"
]
},
{
"cell_type": "code",
"execution_count": 395,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x11ee51898>]"
]
},
"execution_count": 395,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 576x504 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"f, ax = plt.subplots(1, 1, figsize=(8, 7))\n",
"ax.plot(torch.arange(N).numpy(), train_x.numpy())"
]
},
{
"cell_type": "code",
"execution_count": 396,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x11e7fb208>]"
]
},
"execution_count": 396,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 576x504 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"f, ax = plt.subplots(1, 1, figsize=(8, 7))\n",
"ax.plot(torch.arange(N).numpy(), delta_train_x.numpy())"
]
},
{
"cell_type": "code",
"execution_count": 397,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0.5, 0, 'time')"
]
},
"execution_count": 397,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 864x432 with 2 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"f, axs = plt.subplots(1, 2, figsize=(12, 6))\n",
"axs[0].plot(1+true_y(train_x).numpy(), train_x.numpy(),'.')\n",
"axs[0].set_xlabel('true_y')\n",
"axs[0].set_ylabel('x')\n",
"axs[1].plot(torch.arange(N).numpy(), train_x.numpy())\n",
"axs[1].set_xlabel('time')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Setting up the model\n",
"\n",
"The next cell demonstrates the most critical features of a user-defined Gaussian process model in GPyTorch. Building a GP model in GPyTorch is different in a number of ways.\n",
"\n",
"First in contrast to many existing GP packages, we do not provide full GP models for the user. Rather, we provide *the tools necessary to quickly construct one*. This is because we believe, analogous to building a neural network in standard PyTorch, it is important to have the flexibility to include whatever components are necessary. As can be seen in more complicated examples, like the [CIFAR10 Deep Kernel Learning](../08_Deep_Kernel_Learning/Deep_Kernel_Learning_DenseNet_CIFAR_Tutorial.ipynb) example which combines deep learning and Gaussian processes, this allows the user great flexibility in designing custom models.\n",
"\n",
"For most GP regression models, you will need to construct the following GPyTorch objects:\n",
"\n",
"1. A **GP Model** (`gpytorch.models.ExactGP`) - This handles most of the inference.\n",
"1. A **Likelihood** (`gpytorch.likelihoods.GaussianLikelihood`) - This is the most common likelihood used for GP regression.\n",
"1. A **Mean** - This defines the prior mean of the GP.\n",
" - If you don't know which mean to use, a `gpytorch.means.ConstantMean()` is a good place to start.\n",
"1. A **Kernel** - This defines the prior covariance of the GP.\n",
" - If you don't know which kernel to use, a `gpytorch.kernels.ScaleKernel(gpytorch.kernels.RBFKernel())` is a good place to start.\n",
"1. A **MultivariateNormal** Distribution (`gpytorch.distributions.MultivariateNormal`) - This is the object used to represent multivariate normal distributions.\n",
" \n",
" \n",
"### The GP Model\n",
" \n",
"The components of a user built (Exact, i.e. non-variational) GP model in GPyTorch are, broadly speaking:\n",
"\n",
"1. An `__init__` method that takes the training data and a likelihood, and constructs whatever objects are necessary for the model's `forward` method. This will most commonly include things like a mean module and a kernel module.\n",
"\n",
"2. A `forward` method that takes in some $n \\times d$ data `x` and returns a `MultivariateNormal` with the *prior* mean and covariance evaluated at `x`. In other words, we return the vector $\\mu(x)$ and the $n \\times n$ matrix $K_{xx}$ representing the prior mean and covariance matrix of the GP. \n",
"\n",
"This specification leaves a large amount of flexibility when defining a model. For example, to compose two kernels via addition, you can either add the kernel modules directly:\n",
"\n",
"```python\n",
"self.covar_module = ScaleKernel(RBFKernel() + WhiteNoiseKernel())\n",
"```\n",
"\n",
"Or you can add the outputs of the kernel in the forward method:\n",
"\n",
"```python\n",
"covar_x = self.rbf_kernel_module(x) + self.white_noise_module(x)\n",
"```"
]
},
{
"cell_type": "code",
"execution_count": 398,
"metadata": {},
"outputs": [],
"source": [
"# We will use the simplest form of GP model, exact inference\n",
"class ExactGPModel(gpytorch.models.ExactGP):\n",
" def __init__(self, train_x, train_y, likelihood):\n",
" super(ExactGPModel, self).__init__(train_x, train_y, likelihood)\n",
" self.mean_module = gpytorch.means.ConstantMean()\n",
" self.covar_module = gpytorch.kernels.ScaleKernel(gpytorch.kernels.RBFKernel())\n",
" \n",
" def forward(self, x):\n",
" mean_x = self.mean_module(x)\n",
" covar_x = self.covar_module(x)\n",
" return gpytorch.distributions.MultivariateNormal(mean_x, covar_x)\n",
"\n",
"# initialize likelihood and model\n",
"likelihood = gpytorch.likelihoods.GaussianLikelihood()\n",
"model = ExactGPModel(train_x, train_y, likelihood)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Model modes\n",
"\n",
"Like most PyTorch modules, the `ExactGP` has a `.train()` and `.eval()` mode.\n",
"- `.train()` mode is for optimizing model hyperameters.\n",
"- `.eval()` mode is for computing predictions through the model posterior."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Training the model\n",
"\n",
"In the next cell, we handle using Type-II MLE to train the hyperparameters of the Gaussian process.\n",
"\n",
"The most obvious difference here compared to many other GP implementations is that, as in standard PyTorch, the core training loop is written by the user. In GPyTorch, we make use of the standard PyTorch optimizers as from `torch.optim`, and all trainable parameters of the model should be of type `torch.nn.Parameter`. Because GP models directly extend `torch.nn.Module`, calls to methods like `model.parameters()` or `model.named_parameters()` function as you might expect coming from PyTorch.\n",
"\n",
"In most cases, the boilerplate code below will work well. It has the same basic components as the standard PyTorch training loop:\n",
"\n",
"1. Zero all parameter gradients\n",
"2. Call the model and compute the loss\n",
"3. Call backward on the loss to fill in gradients\n",
"4. Take a step on the optimizer\n",
"\n",
"However, defining custom training loops allows for greater flexibility. For example, it is easy to save the parameters at each step of training, or use different learning rates for different parameters (which may be useful in deep kernel learning for example)."
]
},
{
"cell_type": "code",
"execution_count": 268,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "code",
"execution_count": 408,
"metadata": {
"scrolled": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Iter 1/250 - Loss: -0.151 log_lengthscale: -3.634 log_noise: -3.780\n",
"Iter 11/250 - Loss: -0.121 log_lengthscale: -3.586 log_noise: -3.855\n",
"Iter 21/250 - Loss: -0.222 log_lengthscale: -3.504 log_noise: -3.781\n",
"Iter 31/250 - Loss: -0.177 log_lengthscale: -3.449 log_noise: -3.765\n",
"Iter 41/250 - Loss: -0.209 log_lengthscale: -3.262 log_noise: -3.717\n",
"Iter 51/250 - Loss: -0.225 log_lengthscale: -3.407 log_noise: -3.787\n",
"Iter 61/250 - Loss: -0.218 log_lengthscale: -3.215 log_noise: -3.723\n",
"Iter 71/250 - Loss: -0.192 log_lengthscale: -3.256 log_noise: -3.733\n",
"Iter 81/250 - Loss: -0.201 log_lengthscale: -3.438 log_noise: -3.758\n",
"Iter 91/250 - Loss: -0.189 log_lengthscale: -3.522 log_noise: -3.779\n",
"Iter 101/250 - Loss: -0.196 log_lengthscale: -3.347 log_noise: -3.746\n",
"Iter 111/250 - Loss: -0.202 log_lengthscale: -3.602 log_noise: -3.853\n",
"Iter 121/250 - Loss: -0.201 log_lengthscale: -3.475 log_noise: -3.773\n",
"Iter 131/250 - Loss: -0.214 log_lengthscale: -3.422 log_noise: -3.755\n",
"Iter 141/250 - Loss: -0.220 log_lengthscale: -3.416 log_noise: -3.739\n",
"Iter 151/250 - Loss: -0.241 log_lengthscale: -3.600 log_noise: -3.754\n",
"Iter 161/250 - Loss: -0.206 log_lengthscale: -3.537 log_noise: -3.736\n",
"Iter 171/250 - Loss: -0.221 log_lengthscale: -3.508 log_noise: -3.746\n",
"Iter 181/250 - Loss: -0.230 log_lengthscale: -3.472 log_noise: -3.795\n",
"Iter 191/250 - Loss: -0.211 log_lengthscale: -3.591 log_noise: -3.803\n",
"Iter 201/250 - Loss: -0.219 log_lengthscale: -3.550 log_noise: -3.827\n",
"Iter 211/250 - Loss: -0.225 log_lengthscale: -3.536 log_noise: -3.782\n",
"Iter 221/250 - Loss: -0.227 log_lengthscale: -3.542 log_noise: -3.773\n",
"Iter 231/250 - Loss: -0.224 log_lengthscale: -3.614 log_noise: -3.803\n",
"Iter 241/250 - Loss: -0.226 log_lengthscale: -3.440 log_noise: -3.780\n"
]
}
],
"source": [
"# Find optimal model hyperparameters\n",
"model.train()\n",
"likelihood.train()\n",
"\n",
"# Use the adam optimizer\n",
"optimizer = torch.optim.Adam([\n",
" {'params': model.parameters()}, # Includes GaussianLikelihood parameters\n",
"], lr=0.1)\n",
"\n",
"# \"Loss\" for GPs - the marginal log likelihood\n",
"mll = gpytorch.mlls.ExactMarginalLogLikelihood(likelihood, model)\n",
"\n",
"training_iter = 250\n",
"for i in range(training_iter):\n",
" # Zero gradients from previous iteration\n",
" optimizer.zero_grad()\n",
" # Output from model\n",
" output = model(train_x)\n",
" # Calc loss and backprop gradients\n",
" #additional component\n",
" current_y = model(train_x)\n",
" mu = current_y.mean\n",
" sigma = current_y.variance\n",
" local_log_loss = 10**-1*sum(((delta_train_x-mu)**2)/sigma**2)\n",
" #origonal component\n",
" loss = -mll(output, train_y)+local_log_loss\n",
" loss.backward()\n",
" if i%10 == 0:\n",
" print('Iter %d/%d - Loss: %.3f log_lengthscale: %.3f log_noise: %.3f' % (\n",
" i + 1, training_iter, loss.item(),\n",
" model.covar_module.base_kernel.log_lengthscale.item(),\n",
" model.likelihood.log_noise.item()\n",
" ))\n",
" optimizer.step()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Make predictions with the model\n",
"\n",
"In the next cell, we make predictions with the model. To do this, we simply put the model and likelihood in eval mode, and call both modules on the test data.\n",
"\n",
"Just as a user defined GP model returns a `MultivariateNormal` containing the prior mean and covariance from forward, a trained GP model in eval mode returns a `MultivariateNormal` containing the posterior mean and covariance. Thus, getting the predictive mean and variance, and then sampling functions from the GP at the given test points could be accomplished with calls like:\n",
"\n",
"```python\n",
"f_preds = model(test_x)\n",
"y_preds = likelihood(model(test_x))\n",
"\n",
"f_mean = f_preds.mean\n",
"f_var = f_preds.variance\n",
"f_covar = f_preds.covariance_matrix\n",
"f_samples = f_preds.sample(sample_shape=torch.Size(1000,))\n",
"```\n",
"\n",
"The `gpytorch.fast_pred_var` context is not needed, but here we are giving a preview of using one of our cool features, getting faster predictive distributions using [LOVE](https://arxiv.org/abs/1803.06058)."
]
},
{
"cell_type": "code",
"execution_count": 409,
"metadata": {},
"outputs": [],
"source": [
"# Get into evaluation (predictive posterior) mode\n",
"model.eval()\n",
"likelihood.eval()\n",
"\n",
"# Test points are regularly spaced along [0,1]\n",
"# Make predictions by feeding model through likelihood\n",
"with torch.no_grad(), gpytorch.fast_pred_var():\n",
" test_x = torch.linspace(0, 1, 51)\n",
" observed_pred = likelihood(model(test_x))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Plot the model fit\n",
"\n",
"In the next cell, we plot the mean and confidence region of the Gaussian process model. The `confidence_region` method is a helper method that returns 2 standard deviations above and below the mean."
]
},
{
"cell_type": "code",
"execution_count": 410,
"metadata": {
"scrolled": false
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAeYAAAGfCAYAAACKvnHGAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4xLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvDW2N/gAAIABJREFUeJzt3Xl81PWB//HXZ2aSTCY3R0i4L0GOBAREEClIvaqIx2o9u1tta7F1q23ttdb1bLu/2tW2q+uu3bXV1qJWrVp1q9BKERDLISC3yA0BkpCEXJNkZj6/PyZEjoRMkknmOzPv5+MxD2Ym3/l+P/MlM+98Pt/PYay1iIiIiDO4Yl0AERER+ZSCWURExEEUzCIiIg6iYBYREXEQBbOIiIiDKJhFREQcJGrBbIxxG2M+NMa8Ea19ioiIJJto1pjvBDZHcX8iIiJJJyrBbIwZCFwG/E809iciIpKsPFHaz8+B7wJZbW1gjLkNuA0gIyNj8plnnhmlQ4uIiDjb6tWry6y1fSPZtsvBbIyZCxy21q42xsxuaztr7VPAUwBTpkyxq1at6uqhRURE4oIxZnek20ajKXsGMM8Yswt4HphjjPldFPYrIiKSdLoczNbaH1hrB1prhwLXA3+11t7c5ZKJiIgkIY1jFhERcZBodf4CwFq7GFgczX2KiCSjpqYm9u3bh9/vj3VRpAO8Xi8DBw4kJSWl0/uIajCLiEh07Nu3j6ysLIYOHYoxJtbFkQhYaykvL2ffvn0MGzas0/tRU7aIiAP5/X569+6tUI4jxhh69+7d5VYOBbOIiEMplONPNP7PFMwiIiIOomAWEZFW7du3jyuuuIIzzjiDESNGcOedd9LY2AjAb37zG+64444Yl/BUmZmZrT7vdruZOHEi48aNY8KECTz66KOEQqHT7mvXrl38/ve/745inpaCWUQkQZSUlDBr1iwOHjzY5X1Za7n66qu58sor+fjjj9m2bRs1NTXcc889UShp6wKBQLftOz09nbVr17Jx40YWLlzIW2+9xQMPPHDa1yiYRUSkSx566CGWLl3Kgw8+2OV9/fWvf8Xr9XLLLbcA4RrnY489xtNPP01dXR0Ae/fu5ZJLLmH06NEtIVdbW8tll13GhAkTGD9+PC+88AIAq1evZtasWUyePJmLL76YkpISAGbPns2//Mu/MGvWLH70ox8xdOjQlppsXV0dgwYNoqmpiU8++YRLLrmEyZMnM3PmTLZs2QLAzp07mT59OmeffTb33ntvRO8tPz+fp556iscffxxrLbt27WLmzJlMmjSJSZMmsXz5cgC+//3v89577zFx4kQee+yxNreLOmttj98mT55sRUSkbZs2bYp4W6/Xa4FTbl6vt9PH/8UvfmHvuuuuU56fOHGiXbdunf31r39tCwoKbFlZma2rq7Pjxo2zK1eutC+99JL98pe/3LJ9ZWWlbWxstNOnT7eHDx+21lr7/PPP21tuucVaa+2sWbPs7bff3rL9vHnz7F//+teW7b70pS9Za62dM2eO3bZtm7XW2hUrVtjzzz/fWmvt5Zdfbp955hlrrbWPP/64zcjIaPX9tPZ8bm6uPXjwoK2trbX19fXWWmu3bdtmj2XUu+++ay+77LKW7dva7mSt/d8Bq2yEGakas4hInNuxYwc33ngjPp8PAJ/Px0033cTOnTs7vU9rbas9jI9//sILL6R3796kp6dz9dVXs3TpUoqKili0aBHf+973eO+998jJyWHr1q1s2LCBCy+8kIkTJ/Lwww+zb9++ln1ed911J9w/Vst+/vnnue6666ipqWH58uVce+21TJw4ka9+9astNe5ly5Zxww03APCFL3yhw+8RwpO5fOUrX6GoqIhrr72WTZs2tbp9pNt1lSYYERGJc4WFhWRnZ+P3+/F6vfj9frKzsykoKOj0PseNG8fLL798wnNHjx5l7969jBgxgtWrV58S3MYYRo0axerVq3nrrbf4wQ9+wEUXXcRVV13FuHHjeP/991s9VkZGRsv9efPm8YMf/IAjR46wevVq5syZQ21tLbm5uaxdu7bV13dmiNKOHTtwu93k5+fzwAMP0K9fP9atW0coFMLr9bb6msceeyyi7bpKNWYRkQRw6NAh5s+fz4oVK5g/f36XO4B99rOfpa6ujmeffRaAYDDIt7/9bb74xS+21MwXLlzIkSNHqK+v59VXX2XGjBkcOHAAn8/HzTffzN13382aNWsYPXo0paWlLcHc1NTExo0bWz1uZmYmU6dO5c4772Tu3Lm43W6ys7MZNmwYf/jDH4BwTXfdunUAzJgxg+effx6A5557LqL3Vlpayvz587njjjswxlBVVUVhYSEul4vf/va3BINBALKysqiurm55XVvbRV2kbd7RvOkas4jI6XXkGnN32bNnj507d64dOXKkHT58uL3jjjus3++31lr761//2l577bX20ksvtaNGjbL333+/tdbaP//5z7aoqMhOmDDBTpkyxa5cudJaa+2HH35oZ86caYuLi+3YsWPtU089Za0NX2M+ts0xf/jDHyxgFy9e3PLcjh077MUXX2yLi4vtmDFj7AMPPNDy/LRp0+yUKVPsT37ykzavMbtcLjthwgQ7duxYW1xcbB955BEbDAatteHrxUVFRfacc86x3//+91v20djYaOfMmWOLi4vto48+2uZ2J+vqNWZjm9vYe9KUKVPsqlWrevy4IiLxYvPmzYwZMybWxZBOaO3/zhiz2lo7JZLXqylbRETEQRTMIiIiDqJgFhERcRAFs4iIiIMomEVERBxEwSwiIuIgCmYREWmVMeaEaS4DgQB9+/Zl7ty5MSxV4lMwi4hIqzIyMtiwYQP19fVAeKavAQMGxLhUiU/BLCIibfrc5z7Hm2++CcCCBQtaFoyA8BKPt956K2effTZnnXUWr732GkCbyyMuXryY2bNnc80113DmmWdy0003EYtJrpxOi1iIiDjcXXdBG+s3dNrEifDzn7e/3fXXX8+DDz7I3LlzWb9+PbfeeivvvfceAD/60Y+YM2cOTz/9NJWVlUydOpULLriA/Px8Fi5ciNfr5eOPP+aGG27g2GyPH374IRs3bqR///7MmDGDZcuWcd5550X3zcU5BbOIiLSpuLiYXbt2sWDBAi699NITfvbOO+/w+uuv87Of/QwAv9/Pnj176N+/P3fccQdr167F7Xazbdu2ltdMnTqVgQMHAjBx4kR27dqlYD6JgllExOEiqdl2p3nz5nH33XezePFiysvLW5631vLyyy8zevToE7a///7721weMS0treW+2+0mEAh0/xuIM7rGLCIip3Xrrbfyr//6rxQVFZ3w/MUXX8x//Md/tFwn/vDDD4EeXB4xQSmYRUTktAYOHMidd955yvP33nsvTU1NFBcXM378eO69914Avva1r/HMM88wbdo0tm3bRkZGRk8XOa5p2UcREQfSso/xS8s+ioiIJBAFs4iIiIMomEVERBxEwSwiIuIgCmYREREHUTCLiIg4iGb+EhGJA48t3Nb+Rh3wzQtHRbTdwYMHueuuu1i5ciVpaWkMHTqUn//854waFdnrj3nvvfeYP38+KSkpvPnm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\n",
"text/plain": [
"<Figure size 576x504 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"with torch.no_grad():\n",
" # Initialize plot\n",
" f, ax = plt.subplots(1, 1, figsize=(8, 7))\n",
"\n",
" # Get upper and lower confidence bounds\n",
" lower, upper = observed_pred.confidence_region()\n",
" # Plot training data as black stars\n",
" ax.plot(train_x.numpy(), 1+train_y.numpy(), 'k*')\n",
" # Plot predictive means as blue line\n",
" ax.plot(test_x.numpy(), 1+observed_pred.mean.numpy(), 'b')\n",
" # Shade between the lower and upper confidence bounds\n",
" ax.fill_between(test_x.numpy(), 1+lower.numpy(), 1+upper.numpy(), alpha=0.5)\n",
" ax.set_ylim([-1, 4])\n",
" ax.legend(['Observed Data', 'Mean', 'Confidence'])"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"anaconda-cloud": {},
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.7.1"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment