Revision b81e94e16826a1c8d996b0f590b8c3407a0e6a07 authored by Jesper Nielsen on 23 September 2022, 09:50:10 UTC, committed by Jesper Nielsen on 26 October 2022, 13:02:08 UTC
1 parent f66a708
Raw File
models.py
# Copyright 2022 The GPflow Contributors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""
Concrete code for creating models.
"""
import numpy as np
from scipy.stats.qmc import Halton  # pylint: disable=no-name-in-module

import benchmark.dataset_api as ds
from benchmark.dataset_api import XYData
from benchmark.model_api import REGRESSION, SPARSE, VARIATIONAL, make_model_factory
from gpflow.inducing_variables import InducingPoints
from gpflow.kernels import RBF, Kernel
from gpflow.likelihoods import Gaussian
from gpflow.models import GPR, SGPR, SVGP, VGP, GPModel
from gpflow.models.util import InducingPointsLike


def create_rbf(data: XYData, rng: np.random.Generator) -> Kernel:
    return RBF(
        variance=rng.gamma(5.0, 0.2, []),
        lengthscales=rng.gamma(5.0, 0.2, [data.D]),
    )


def create_inducing(data: XYData, rng: np.random.Generator) -> InducingPointsLike:
    n = min(data.N // 2, 200)
    Z = Halton(data.D, scramble=False).random(n)
    lower = np.min(data.X, axis=0)
    upper = np.max(data.X, axis=0)
    Z = Z * (upper - lower) + lower
    return InducingPoints(Z)


def create_gaussian(data: XYData, rng: np.random.Generator) -> Gaussian:
    return Gaussian(variance=rng.gamma(5.0, 0.2, []))


@make_model_factory(tags={REGRESSION}, dataset_req=ds.REGRESSION & ~ds.LARGE)
def gpr(data: XYData, rng: np.random.Generator) -> GPModel:
    return GPR(
        data.XY,
        kernel=create_rbf(data, rng),
        noise_variance=rng.gamma(5.0, 0.2, []),
    )


@make_model_factory(tags={REGRESSION, VARIATIONAL}, dataset_req=ds.REGRESSION & ~ds.LARGE)
def vgp(data: XYData, rng: np.random.Generator) -> GPModel:
    return VGP(
        data.XY,
        kernel=create_rbf(data, rng),
        likelihood=create_gaussian(data, rng),
    )


@make_model_factory(tags={REGRESSION, SPARSE}, dataset_req=ds.REGRESSION)
def sgpr(data: XYData, rng: np.random.Generator) -> GPModel:
    return SGPR(
        data.XY,
        kernel=create_rbf(data, rng),
        inducing_variable=create_inducing(data, rng),
        noise_variance=rng.gamma(5.0, 0.2, []),
    )


@make_model_factory(tags={REGRESSION, SPARSE, VARIATIONAL}, dataset_req=ds.REGRESSION)
def svgp(data: XYData, rng: np.random.Generator) -> GPModel:
    return SVGP(
        kernel=create_rbf(data, rng),
        likelihood=create_gaussian(data, rng),
        inducing_variable=create_inducing(data, rng),
    )
back to top