1
1
"""
2
- MaternKernel([[ ρ=1],ν=3/2 ])
2
+ MaternKernel([ρ=1.0,[ν=1.0] ])
3
3
4
4
The matern kernel is an isotropic Mercer kernel given by the formula:
5
5
6
6
```
7
- κ(x,y) = 2^{1-ν}/Γ(ν)*(√(2ν)‖x-y‖/ρ )^ν K_ν(√(2ν)‖x-y‖/ρ )
7
+ κ(x,y) = 2^{1-ν}/Γ(ν)*(√(2ν)‖x-y‖)^ν K_ν(√(2ν)‖x-y‖)
8
8
```
9
9
10
- For `ν=n+1/2, n=0,1,2,...` it can be simplified (it will be converted automatically) .
11
- `ρ` is a lengthscale parameter.
10
+ For `ν=n+1/2, n=0,1,2,...` it can be simplified and you should instead use `ExponentialKernel` for `n=0`, `Matern32Kernel`, for `n=1`, Matern52Kernel for `n=2` and `SqExponentialKernel` for `n=∞` .
11
+ `ρ` is the lengthscale parameter(s) or the transform object .
12
12
13
13
# Examples
14
14
15
15
```jldoctest; setup = :(using KernelFunctions)
16
16
julia> MaternKernel()
17
- Matern3_2Kernel {Float64,Float64}(1.0)
17
+ MaternKernel {Float64,Float64}(1.0, 1.0)
18
18
19
19
julia> MaternKernel(2.0f0,3.0)
20
20
MaternKernel{Float32,Float32}(2.0,3.0)
21
21
22
- julia> MaternKernel([2.0,3.0],5/2 )
23
- Matern5_2Kernel {Float64,Array{Float64}}([2.0,3.0])
22
+ julia> MaternKernel([2.0,3.0],2.5 )
23
+ MaternKernel {Float64,Array{Float64}}([2.0,3.0],2.5 )
24
24
```
25
25
"""
26
26
struct MaternKernel{T,Tr<: Transform } <: Kernel{T,Tr}
34
34
35
35
function MaternKernel (ρ:: T₁ = 1.0 ,ν:: T₂ = 1.5 ) where {T₁<: Real ,T₂<: Real }
36
36
@check_args (MaternKernel, ν, ν > zero (T₂), " ν > 0" )
37
- if ν == 0.5
38
- ExponentialKernel {T₁,ScaleTransform{T₁}} (ScaleTransform (ρ))
39
- elseif ν == 1.5
40
- Matern32Kernel {T₁,ScaleTransform{T₁}} (ScaleTransform (ρ))
41
- elseif ν == 2.5
42
- Matern52Kernel {T₁,ScaleTransform{T₁}} (ScaleTransform (ρ))
43
- elseif ν == Inf
44
- SquaredExponentialKernel {T₁,ScaleTransform{T₁}} (ScaleTransform (ρ))
45
- else
46
- MaternKernel {T₁,ScaleTransform{T₁}} (ScaleTransform (ρ),ν)
47
- end
37
+ MaternKernel {T₁,ScaleTransform{T₁}} (ScaleTransform (ρ),ν)
48
38
end
49
39
50
40
function MaternKernel (ρ:: A ,ν:: T = 1.5 ) where {A<: AbstractVector{<:Real} ,T<: Real }
51
41
@check_args (MaternKernel, ν, ν > zero (T), " ν > 0" )
52
- if ν == 0.5
53
- ExponentialKernel {eltype(A),ScaleTransform{A}} (ScaleTransform (ρ))
54
- elseif ν == 1.5
55
- Matern32Kernel {eltype(A),ScaleTransform{A}} (ScaleTransform (ρ))
56
- elseif ν == 2.5
57
- Matern52Kernel {eltype(A),ScaleTransform{A}} (ScaleTransform (ρ))
58
- elseif ν == Inf
59
- SquaredExponentialKernel {eltype(A),ScaleTransform{A}} (ScaleTransform (ρ))
60
- else
61
- MaternKernel {eltype(A),ScaleTransform{A}} (ScaleTransform (ρ),ν)
62
- end
42
+ MaternKernel {eltype(A),ScaleTransform{A}} (ScaleTransform (ρ),ν)
63
43
end
64
44
65
- function MaternKernel (t:: T₁ ,ν:: T₂ = 1.5 ) where {T₁<: Transform ,T₂<: Real }
66
- @check_args (MaternKernel, ν, ν > zero (T₂), " ν > 0" )
67
- if ν == 0.5
68
- ExponentialKernel {eltype(t),T₁} (t)
69
- elseif ν == 1.5
70
- Matern32Kernel {eltype(t),T₁} (t)
71
- elseif ν == 2.5
72
- Matern52Kernel {eltype(t),T₁} (t)
73
- elseif ν == Inf
74
- SquaredExponentialKernel {eltype(t),T₁} (t)
75
- else
76
- MaternKernel {eltype(t),T₁} (t,ν)
77
- end
45
+ function MaternKernel (t:: Tr ,ν:: T = 1.5 ) where {Tr<: Transform ,T<: Real }
46
+ @check_args (MaternKernel, ν, ν > zero (T), " ν > 0" )
47
+ MaternKernel {eltype(t),Tr} (t,ν)
78
48
end
79
49
80
50
@inline kappa (κ:: MaternKernel , d:: Real ) where {T} = exp ((1.0 - κ. ν)* logtwo - lgamma (κ. ν) - κ. ν* log (sqrt (2 κ. ν)* d))* besselk (κ. ν,sqrt (2 κ. ν)* d)
@@ -96,8 +66,8 @@ function Matern32Kernel(ρ::A) where {A<:AbstractVector{<:Real}}
96
66
Matern32Kernel {eltype(A),ScaleTransform{A}} (ScaleTransform (ρ))
97
67
end
98
68
99
- function Matern32Kernel (t:: Transform )
100
- Matern52Kernel {eltype(A),ScaleTransform{A} } (t)
69
+ function Matern32Kernel (t:: Tr ) where {Tr <: Transform }
70
+ Matern52Kernel {eltype(Tr),Tr } (t)
101
71
end
102
72
103
73
@inline kappa (κ:: Matern32Kernel , d:: T ) where {T<: Real } = (1 + sqrt (3 )* d)* exp (- sqrt (3 )* d)
@@ -118,8 +88,8 @@ function Matern52Kernel(ρ::A) where {A<:AbstractVector{<:Real}}
118
88
Matern52Kernel {eltype(A),ScaleTransform{A}} (ScaleTransform (ρ))
119
89
end
120
90
121
- function Matern52Kernel (t:: Transform )
122
- Matern52Kernel {eltype(A),ScaleTransform{A} } (t)
91
+ function Matern52Kernel (t:: Tr ) where {Tr <: Transform }
92
+ Matern52Kernel {eltype(Tr),Tr } (t)
123
93
end
124
94
125
95
@inline kappa (κ:: Matern52Kernel , d:: Real ) where {T} = (1 + sqrt (5 )* d+ 5 * d^ 2 / 3 )* exp (- sqrt (5 )* d)
0 commit comments