Skip to content

Commit 5cbc0f5

Browse files
authored
Merge pull request #52 from sharanry/gabor
Add Gabor Kernel
2 parents 18e3730 + efcf72c commit 5cbc0f5

File tree

5 files changed

+97
-2
lines changed

5 files changed

+97
-2
lines changed

src/KernelFunctions.jl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ export ExponentiatedKernel
1515
export MaternKernel, Matern32Kernel, Matern52Kernel
1616
export LinearKernel, PolynomialKernel
1717
export RationalQuadraticKernel, GammaRationalQuadraticKernel
18-
export MahalanobisKernel
18+
export MahalanobisKernel, GaborKernel
1919
export KernelSum, KernelProduct
2020
export TransformedKernel, ScaledKernel
2121

@@ -46,7 +46,7 @@ include("distances/dotproduct.jl")
4646
include("distances/delta.jl")
4747
include("transform/transform.jl")
4848

49-
for k in ["exponential","matern","polynomial","constant","rationalquad","exponentiated","cosine","maha","fbm"]
49+
for k in ["exponential","matern","polynomial","constant","rationalquad","exponentiated","cosine","maha","fbm","gabor"]
5050
include(joinpath("kernels",k*".jl"))
5151
end
5252
include("kernels/transformedkernel.jl")

src/kernels/gabor.jl

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
"""
2+
GaborKernel(; ell::Real=1.0, p::Real=1.0)
3+
4+
Gabor kernel with length scale ell and period p. Given by
5+
```math
6+
κ(x,y) = h(x-z), h(t) = exp(-sum(t.^2./(ell.^2)))*cos(pi*sum(t./p))
7+
```
8+
9+
"""
10+
struct GaborKernel{K<:Kernel} <: BaseKernel
11+
kernel::K
12+
function GaborKernel(;ell=nothing, p=nothing)
13+
k = _gabor(ell=ell, p=p)
14+
new{typeof(k)}(k)
15+
end
16+
end
17+
18+
function _gabor(; ell = nothing, p = nothing)
19+
if ell === nothing
20+
if p === nothing
21+
return SqExponentialKernel() * CosineKernel()
22+
else
23+
return SqExponentialKernel() * transform(CosineKernel(), 1 ./ p)
24+
end
25+
elseif p === nothing
26+
return transform(SqExponentialKernel(), 1 ./ ell) * CosineKernel()
27+
else
28+
return transform(SqExponentialKernel(), 1 ./ ell) * transform(CosineKernel(), 1 ./ p)
29+
end
30+
end
31+
32+
function Base.getproperty(k::GaborKernel, v::Symbol)
33+
if v == :kernel
34+
return getfield(k, v)
35+
elseif v == :ell
36+
kernel1 = k.kernel.kernels[1]
37+
if kernel1 isa TransformedKernel
38+
return 1 ./ kernel1.transform.s[1]
39+
else
40+
return 1.0
41+
end
42+
elseif v == :p
43+
kernel2 = k.kernel.kernels[2]
44+
if kernel2 isa TransformedKernel
45+
return 1 ./ kernel2.transform.s[1]
46+
else
47+
return 1.0
48+
end
49+
else
50+
error("Invalid Property")
51+
end
52+
end
53+
54+
Base.show(io::IO, κ::GaborKernel) = print(io, "Gabor Kernel (ell = $(κ.ell), p = $(κ.p))")
55+
56+
kappa::GaborKernel, x, y) = kappa.kernel, x ,y)
57+
58+
function kernelmatrix(
59+
κ::GaborKernel,
60+
X::AbstractMatrix;
61+
obsdim::Int=defaultobs)
62+
kernelmatrix.kernel, X; obsdim=obsdim)
63+
end
64+
65+
function kernelmatrix(
66+
κ::GaborKernel,
67+
X::AbstractMatrix,
68+
Y::AbstractMatrix;
69+
obsdim::Int=defaultobs)
70+
kernelmatrix.kernel, X, Y; obsdim=obsdim)
71+
end
72+
73+
function kerneldiagmatrix(
74+
κ::GaborKernel,
75+
X::AbstractMatrix;
76+
obsdim::Int=defaultobs) #TODO Add test
77+
kerneldiagmatrix.kernel, X; obsdim=obsdim)
78+
end

src/trainable.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ trainable(k::RationalQuadraticKernel) = (k.α,)
2020

2121
trainable(k::MahalanobisKernel) = (k.P,)
2222

23+
trainable(k::GaborKernel) = (k.kernel,)
24+
2325
#### Composite kernels
2426

2527
trainable::KernelProduct) = κ.kernels

test/kernels/gabor.jl

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
@testset "Gabor" begin
2+
v1 = rand(3); v2 = rand(3)
3+
ell = abs(rand())
4+
p = abs(rand())
5+
k = GaborKernel(ell=ell, p=p)
6+
@test k.ell ell atol=1e-5
7+
@test k.p p atol=1e-5
8+
@test kappa(k,v1,v2) exp(-sqeuclidean(v1,v2) ./(k.ell.^2))*cospi(euclidean(v1,v2)./ k.p) atol=1e-5
9+
@test kappa(k,v1,v2) kappa(transform(SqExponentialKernel(), 1/k.ell),v1,v2)*kappa(transform(CosineKernel(), 1/k.p), v1,v2) atol=1e-5
10+
11+
k = GaborKernel()
12+
@test k.ell 1.0 atol=1e-5
13+
@test k.p 1.0 atol=1e-5
14+
end

test/runtests.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ using KernelFunctions: metric
6767
include(joinpath("kernels", "exponential.jl"))
6868
include(joinpath("kernels", "exponentiated.jl"))
6969
include(joinpath("kernels", "fbm.jl"))
70+
include(joinpath("kernels", "gabor.jl"))
7071
include(joinpath("kernels", "kernelproduct.jl"))
7172
include(joinpath("kernels", "kernelsum.jl"))
7273
include(joinpath("kernels", "matern.jl"))

0 commit comments

Comments
 (0)