Skip to content

Commit 823219b

Browse files
authored
Adding Matern72Kernel object, tests and docs (#580)
* Adding Matern72Kernel object, tests and docs * Bump patch version
1 parent 3303ca9 commit 823219b

File tree

5 files changed

+62
-3
lines changed

5 files changed

+62
-3
lines changed

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name = "KernelFunctions"
22
uuid = "ec8451be-7e33-11e9-00cf-bbf324bd1392"
3-
version = "0.10.65"
3+
version = "0.10.66"
44

55
[deps]
66
ChainRulesCore = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4"

docs/src/kernels.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ MaternKernel
6161
Matern12Kernel
6262
Matern32Kernel
6363
Matern52Kernel
64+
Matern72Kernel
6465
```
6566

6667
### Neural Network Kernel

src/KernelFunctions.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ export SqExponentialKernel, RBFKernel, GaussianKernel, SEKernel
1010
export LaplacianKernel, ExponentialKernel, GammaExponentialKernel
1111
export ExponentiatedKernel
1212
export FBMKernel
13-
export MaternKernel, Matern12Kernel, Matern32Kernel, Matern52Kernel
13+
export MaternKernel, Matern12Kernel, Matern32Kernel, Matern52Kernel, Matern72Kernel
1414
export LinearKernel, PolynomialKernel
1515
export RationalKernel, RationalQuadraticKernel, GammaRationalKernel
1616
export PiecewisePolynomialKernel

src/basekernels/matern.jl

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ differentiable in the mean-square sense.
2121
2222
Differentiation with respect to the order ν is not currently supported.
2323
24-
See also: [`Matern12Kernel`](@ref), [`Matern32Kernel`](@ref), [`Matern52Kernel`](@ref)
24+
See also: [`Matern12Kernel`](@ref), [`Matern32Kernel`](@ref), [`Matern52Kernel`](@ref), [`Matern72Kernel`](@ref)
2525
"""
2626
struct MaternKernel{Tν<:Real,M} <: SimpleKernel
2727
ν::Vector{Tν}
@@ -118,3 +118,36 @@ metric(k::Matern52Kernel) = k.metric
118118
function Base.show(io::IO, k::Matern52Kernel)
119119
return print(io, "Matern 5/2 Kernel (metric = ", k.metric, ")")
120120
end
121+
122+
"""
123+
Matern72Kernel(; metric=Euclidean())
124+
125+
Matérn kernel of order ``7/2`` with respect to the `metric`.
126+
127+
# Definition
128+
129+
For inputs ``x, x'`` and metric ``d(\\cdot, \\cdot)``, the Matérn kernel of order ``7/2`` is
130+
given by
131+
```math
132+
k(x, x') = \\bigg(1 + \\sqrt{7} d(x, x') + \\frac{14}{5} d(x, x')^2 +
133+
\\frac{7\\sqrt{7}}{15} d(x, x')^3\\bigg)\\exp\\big(- \\sqrt{7} d(x, x') \\big).
134+
```
135+
By default, ``d`` is the Euclidean metric ``d(x, x') = \\|x - x'\\|_2``.
136+
137+
See also: [`MaternKernel`](@ref)
138+
"""
139+
struct Matern72Kernel{M} <: SimpleKernel
140+
metric::M
141+
end
142+
143+
Matern72Kernel(; metric=Euclidean()) = Matern72Kernel(metric)
144+
145+
function kappa(::Matern72Kernel, d::Real)
146+
return (1 + sqrt(7) * d + 14 / 5 * d^2 + 7 * sqrt(7) / 15 * d^3) * exp(-sqrt(7) * d)
147+
end
148+
149+
metric(k::Matern72Kernel) = k.metric
150+
151+
function Base.show(io::IO, k::Matern72Kernel)
152+
return print(io, "Matern 7/2 Kernel (metric = ", k.metric, ")")
153+
end

test/basekernels/matern.jl

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,9 +82,34 @@
8282
test_ADs(Matern52Kernel)
8383
test_interface_ad_perf(_ -> Matern52Kernel(), nothing, StableRNG(123456))
8484
end
85+
@testset "Matern72Kernel" begin
86+
k = Matern72Kernel()
87+
@test kappa(k, x)
88+
(1 + sqrt(7) * x + 14 / 5 * x^2 + 7 * sqrt(7) / 15 * x^3) * exp(-sqrt(7) * x)
89+
@test k(v1, v2)
90+
(
91+
1 +
92+
sqrt(7) * norm(v1 - v2) +
93+
14 / 5 * norm(v1 - v2)^2 +
94+
7 * sqrt(7) / 15 * norm(v1 - v2)^3
95+
) * exp(-sqrt(7) * norm(v1 - v2))
96+
@test kappa(Matern72Kernel(), x) == kappa(k, x)
97+
@test metric(Matern72Kernel()) == Euclidean()
98+
@test repr(k) == "Matern 7/2 Kernel (metric = Euclidean(0.0))"
99+
100+
k2 = Matern72Kernel(; metric=WeightedEuclidean(ones(3)))
101+
@test metric(k2) isa WeightedEuclidean
102+
@test k2(v1, v2) k(v1, v2)
103+
104+
# Standardised tests.
105+
TestUtils.test_interface(k, Float64)
106+
test_ADs(Matern72Kernel)
107+
test_interface_ad_perf(_ -> Matern72Kernel(), nothing, StableRNG(123456))
108+
end
85109
@testset "Coherence Materns" begin
86110
@test kappa(MaternKernel(; ν=0.5), x) kappa(ExponentialKernel(), x)
87111
@test kappa(MaternKernel(; ν=1.5), x) kappa(Matern32Kernel(), x)
88112
@test kappa(MaternKernel(; ν=2.5), x) kappa(Matern52Kernel(), x)
113+
@test kappa(MaternKernel(; ν=3.5), x) kappa(Matern72Kernel(), x)
89114
end
90115
end

0 commit comments

Comments
 (0)