Online Gaussian Process
Loading necessary packages
Preliminary steps
Load the necessary packages
using Plots
using AugmentedGaussianProcesses
using MLDataUtils, Distributions
We create a toy dataset with a noisy sinus
N = 2000
σ = 0.1
X, y = noisy_sin(N, 0, 20; noise=σ)
X_train = X[1:2:end];
y_train = y[1:2:end]; # We split the data equally
X_test = X[2:2:end];
y_test = y[2:2:end];
scatter(X_train, y_train)
Plot model at each step
function plot_model(model, X, X_test, X_train, y_train)
y_pred, sig_pred = proba_y(model, X_test)
plot(X, sin; lab="f", color=:black, lw=3.0, ylims=(-2, 2))
plot!(X_test, y_pred; ribbon=sqrt.(sig_pred), lab="Prediction", lw=3.0)
scatter!(X_train, y_train; msw=0.0, alpha=0.5, lab="Data")
return scatter!(first.(model[1].Z), mean(model[1]); lab="IP")
end
plot_model (generic function with 1 method)
Model training
Create a kernel
k = SqExponentialKernel();
Create an inducing point selection method
IP_alg = OIPS(0.8);
Create the model and stream the data
model = OnlineSVGP(k, GaussianLikelihood(σ), AnalyticVI(), IP_alg; optimiser=false)
anim = Animation()
size_batch = 100
let state = nothing
for (i, (X_batch, y_batch)) in
enumerate(eachbatch((X_train, y_train); obsdim=1, size=size_batch))
_, state = train!(model, X_batch, y_batch, state; iterations=5)
plot_model(
model, X, X_test, X_train[1:(i * size_batch)], y_train[1:(i * size_batch)]
)
frame(anim)
end
end
gif(anim; fps=4)
This works just as well with any likelihood! Just try it out!
This page was generated using Literate.jl.