Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adding Gibbskernel #374

Merged
merged 28 commits into from
Oct 1, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
d50f2b4
add gibbskernel.jl
Cyberface Sep 28, 2021
2ca62f4
include gibbskernel.jl
Cyberface Sep 28, 2021
2b83286
some modifications for gibbskernel and added a small test
Cyberface Sep 28, 2021
e4d1414
fix missing definition of ell function in test
Cyberface Sep 28, 2021
f9f066a
fix gibbskernel test
Cyberface Sep 29, 2021
d6b53b9
add gibbskernel to test/runtests.jl
Cyberface Sep 29, 2021
698c453
Update test/kernels/gibbskernel.jl
Cyberface Sep 29, 2021
3a98028
Update src/kernels/gibbskernel.jl
Cyberface Sep 29, 2021
0f757a3
Update src/kernels/gibbskernel.jl
Cyberface Sep 29, 2021
2e1df2d
implement changes based on PR discussion and update test
Cyberface Sep 29, 2021
b5c6faa
add brackets back in
Cyberface Sep 29, 2021
19e6665
fix unit test for gibbs kernel
Cyberface Sep 29, 2021
21de7d4
update gibbskernel test: implement theogf's idea about using a non-tr…
Cyberface Sep 30, 2021
4ddafbe
ensure ell returns positive value in test
Cyberface Sep 30, 2021
9fd1d14
gibbs kernel: fixed implementation and unittest
Cyberface Sep 30, 2021
5531851
gibbs kernel: fix docstring
Cyberface Sep 30, 2021
78faeac
Update src/kernels/gibbskernel.jl
Cyberface Oct 1, 2021
ae8b3d4
Update src/kernels/gibbskernel.jl
Cyberface Oct 1, 2021
6b91a23
add gibbskernel to docs
Cyberface Oct 1, 2021
a914957
Update src/kernels/gibbskernel.jl
Cyberface Oct 1, 2021
6eb4099
Update test/kernels/gibbskernel.jl
Cyberface Oct 1, 2021
79aa4f5
gibbskernel test: formatting
Cyberface Oct 1, 2021
0942447
Merge branch 'master' into gibbskernel
devmotion Oct 1, 2021
de3e535
Fix format (hopefully)
devmotion Oct 1, 2021
0caf2fd
Add newline character
devmotion Oct 1, 2021
cfbca3d
Apply suggestions from code review
devmotion Oct 1, 2021
1fb7903
Export invsqrt2
theogf Oct 1, 2021
f577700
Version bump
theogf Oct 1, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Project.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
name = "KernelFunctions"
uuid = "ec8451be-7e33-11e9-00cf-bbf324bd1392"
version = "0.10.20"
version = "0.10.21"

[deps]
ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4"
Expand Down
1 change: 1 addition & 0 deletions docs/src/kernels.md
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ CosineKernel

```@docs
ExponentialKernel
GibbsKernel
LaplacianKernel
SqExponentialKernel
SEKernel
Expand Down
4 changes: 3 additions & 1 deletion src/KernelFunctions.jl
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ export PiecewisePolynomialKernel
export PeriodicKernel, NeuralNetworkKernel
export KernelSum, KernelProduct, KernelTensorProduct
export TransformedKernel, ScaledKernel, NormalizedKernel
export GibbsKernel

export Transform,
SelectTransform,
Expand Down Expand Up @@ -53,7 +54,7 @@ using Functors
using LinearAlgebra
using Requires
using SpecialFunctions: loggamma, besselk, polygamma
using IrrationalConstants: logtwo, twoπ
using IrrationalConstants: logtwo, twoπ, invsqrt2
using LogExpFunctions: softplus
using StatsBase
using TensorCore
Expand Down Expand Up @@ -94,6 +95,7 @@ include("basekernels/rational.jl")
include("basekernels/sm.jl")
include("basekernels/wiener.jl")

include("kernels/gibbskernel.jl")
include("kernels/scaledkernel.jl")
include("kernels/normalizedkernel.jl")
include("matrix/kernelmatrix.jl")
Expand Down
42 changes: 42 additions & 0 deletions src/kernels/gibbskernel.jl
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
"""
GibbsKernel(; lengthscale)

# Definition

The Gibbs kernel is non-stationary generalisation of the squared exponential
kernel. The lengthscale parameter ``l`` becomes a function of
position ``l(x)``.

For a constant function``l(x) = c``, one recovers the standard squared exponential kernel
with lengthscale `c`.

```math
k(x, y; l) = \\sqrt{ \\left(\\frac{2 l(x) l(y)}{l(x)^2 + l(y)^2} \\right) }
\\quad \\rm{exp} \\left( - \\frac{(x - y)^2}{l(x)^2 + l(y)^2} \\right)
```

# References

Mark N. Gibbs. "Bayesian Gaussian Processes for Regression and Classication." PhD thesis, 1997

Christopher J. Paciorek and Mark J. Schervish. "Nonstationary Covariance Functions
for Gaussian Process Regression". NeurIPS, 2003

Sami Remes, Markus Heinonen, Samuel Kaski. "Non-Stationary Spectral Kernels". arXiV:1705.08736, 2017

Sami Remes, Markus Heinonen, Samuel Kaski. "Neural Non-Stationary Spectral Kernel". arXiv:1811.10978, 2018
"""
struct GibbsKernel{T} <: Kernel
lengthscale::T
end

GibbsKernel(; lengthscale) = GibbsKernel(lengthscale)

function (k::GibbsKernel)(x, y)
lengthscale = k.lengthscale
lx = lengthscale(x)
ly = lengthscale(y)
l = invsqrt2 * hypot(lx, ly)
kernel = (sqrt(lx * ly) / l) * with_lengthscale(SqExponentialKernel(), l)
return kernel(x, y)
end
13 changes: 13 additions & 0 deletions test/kernels/gibbskernel.jl
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
@testset "gibbskernel" begin
x = randn()
y = randn()

# this is the gibbs lengthscale function.
ell(x) = exp(sum(sin, x))
# create a gibbs kernel with our specific lengthscale function
k_gibbs = GibbsKernel(ell)

@test k_gibbs(x, y) ≈
sqrt((2 * ell(x) * ell(y)) / (ell(x)^2 + ell(y)^2)) *
exp(-(x - y)^2 / (ell(x)^2 + ell(y)^2))
end
1 change: 1 addition & 0 deletions test/runtests.jl
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,7 @@ include("test_utils.jl")
include("kernels/transformedkernel.jl")
include("kernels/normalizedkernel.jl")
include("kernels/neuralkernelnetwork.jl")
include("kernels/gibbskernel.jl")
end
@info "Ran tests on Kernel"
end
Expand Down