# AbstractGPs

AbstractGPs.jl is a package that defines a low-level API for working with Gaussian processes (GPs), and basic functionality for working with them in the simplest cases. As such it is aimed more at developers and researchers who are interested in using it as a building block than end-users of GPs. You may want to go through the main API design documentation.

## Installation

AbstractGPs is an officially registered Julia package, so the following will install AbstractGPs using the Julia's package manager:

] add AbstractGPs

## Example

# Import packages.
using AbstractGPs, Plots
# Generate toy synthetic data.
x = rand(10)
y = sin.(x)
# Define GP prior with Matern-3/2 kernel
f = GP(Matern32Kernel())
# Finite projection of `f` at inputs `x`.
# Added Gaussian noise with variance 0.001.
fx = f(x, 0.001)
# Log marginal probability of `y` under `f` at `x`.
# Quantity typically maximised to train hyperparameters.
logpdf(fx, y)
# Exact posterior given `y`. This is another GP.
p_fx = posterior(fx, y)
# Log marginal posterior predictive probability.
logpdf(p_fx(x), y)
# Plot posterior.
scatter(x, y; label="Data")
plot!(-0.5:0.001:1.5, p_fx; label="Posterior")

## Related Julia packages

- AbstractGPsMakie.jl - Plotting GPs with Makie.jl.
- ApproximateGPs.jl - Approximate inference for GPs, both for sparse approximations and non-Gaussian likelihoods. Built on types which implement this package's APIs.
- BayesianLinearRegressors.jl - Accelerated inference in GPs with a linear kernel. Built on types which implement this package's APIs.
- GPLikelihoods.jl - Non-Gaussian likelihood functions to use with GPs.
- KernelFunctions.jl - Kernel functions for machine learning.
- Stheno.jl - Building probabilistic programmes involving GPs. Built on types which implement this package's APIs.
- TemporalGPs.jl - Accelerated inference in GPs involving time. Built on types which implement this package's APIs.

## Issues/Contributing

If you notice a problem or would like to contribute by adding more kernel functions or features please submit an issue.