Skip to content

Commit 7be5e5c

Browse files
authored
Merge branch 'master' into syntacticsugarallkernels
2 parents 254be63 + 5d4744b commit 7be5e5c

File tree

8 files changed

+121
-12
lines changed

8 files changed

+121
-12
lines changed

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ Compat = "2.2, 3"
1818
Distances = "0.8"
1919
Requires = "1.0.1"
2020
SpecialFunctions = "0.8, 0.9, 0.10"
21-
StatsBase = "0.32"
21+
StatsBase = "0.32, 0.33"
2222
StatsFuns = "0.8, 0.9"
2323
ZygoteRules = "0.2"
2424
julia = "1.0"

README.md

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
1-
[![Build Status](https://travis-ci.org/theogf/KernelFunctions.jl.svg?branch=master)](https://travis-ci.org/theogf/KernelFunctions.jl)
2-
[![Coverage Status](https://coveralls.io/repos/github/theogf/KernelFunctions.jl/badge.svg?branch=master)](https://coveralls.io/github/theogf/KernelFunctions.jl?branch=master)
3-
[![Documentation](https://img.shields.io/badge/docs-dev-blue.svg)](https://theogf.github.io/KernelFunctions.jl/dev/)
41
# KernelFunctions.jl
2+
3+
[![Build Status](https://travis-ci.com/JuliaGaussianProcesses/KernelFunctions.jl.svg?branch=master)](https://travis-ci.com/JuliaGaussianProcesses/KernelFunctions.jl)
4+
[![Coverage Status](https://coveralls.io/repos/github/JuliaGaussianProcesses/KernelFunctions.jl/badge.svg?branch=master)](https://coveralls.io/github/JuliaGaussianProcesses/KernelFunctions.jl?branch=master)
5+
[![Documentation (stable)](https://img.shields.io/badge/docs-stable-blue.svg)](https://juliagaussianprocesses.github.io/KernelFunctions.jl/stable)
6+
[![Documentation (latest)](https://img.shields.io/badge/docs-dev-blue.svg)](https://juliagaussianprocesses.github.io/KernelFunctions.jl/dev)
7+
58
## Kernel functions for machine learning
69

710
KernelFunctions.jl provide a flexible and complete framework for kernel functions, pretransforming the input data.
@@ -43,4 +46,4 @@ Directly inspired by the [MLKernels](https://github.com/trthatcher/MLKernels.jl)
4346

4447
## Issues/Contributing
4548

46-
If you notice a problem or would like to contribute by adding more kernel functions or features please [submit an issue](https://github.com/theogf/KernelFunctions.jl/issues).
49+
If you notice a problem or would like to contribute by adding more kernel functions or features please [submit an issue](https://github.com/JuliaGaussianProcesses/KernelFunctions.jl/issues).

docs/make.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,6 @@ makedocs(
2121
# for more information.
2222
deploydocs(
2323
deps = Deps.pip("mkdocs", "python-markdown-math"),
24-
repo = "github.com/theogf/KernelFunctions.jl.git",
24+
repo = "github.com/JuliaGaussianProcesses/KernelFunctions.jl.git",
2525
target = "build"
2626
)

src/KernelFunctions.jl

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
"""
2-
KernelFunctions. [Github](https://github.com/theogf/KernelFunctions.jl) [Documentation](https://theogf.github.io/KernelFunctions.jl/dev/)
2+
KernelFunctions. [Github](https://github.com/JuliaGaussianProcesses/KernelFunctions.jl)
3+
[Documentation](https://juliagaussianprocesses.github.io/KernelFunctions.jl/stable/)
34
"""
45
module KernelFunctions
56

67
export kernelmatrix, kernelmatrix!, kerneldiagmatrix, kerneldiagmatrix!, kappa
78
export transform
8-
export params, duplicate, set! # Helpers
9+
export duplicate, set! # Helpers
910

1011
export Kernel
1112
export ConstantKernel, WhiteKernel, EyeKernel, ZeroKernel
@@ -45,7 +46,7 @@ include("distances/dotproduct.jl")
4546
include("distances/delta.jl")
4647
include("transform/transform.jl")
4748

48-
for k in ["exponential","matern","polynomial","constant","rationalquad","exponentiated","cosine","maha"]
49+
for k in ["exponential","matern","polynomial","constant","rationalquad","exponentiated","cosine","maha","fbm"]
4950
include(joinpath("kernels",k*".jl"))
5051
end
5152
include("kernels/transformedkernel.jl")

src/generic.jl

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,11 @@ printshifted(io::IO,κ::Kernel,shift::Int) = print(io,"$κ")
1515
Base.show(io::IO::Kernel) = print(io,nameof(typeof(κ)))
1616

1717
### Syntactic sugar for creating matrices and using kernel functions
18-
1918
function concretetypes(k, ktypes::Vector)
2019
isempty(subtypes(k)) ? push!(ktypes, k) : concretetypes.(subtypes(k), Ref(ktypes))
2120
return ktypes
2221
end
2322

24-
2523
for k in concretetypes(Kernel, [])
2624
@eval begin
2725
@inline::$k)(x::AbstractVector{<:Real}, y::AbstractVector{<:Real}) = kappa(κ, x, y)

src/kernels/fbm.jl

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
"""
2+
FBMKernel(; h::Real=0.5)
3+
4+
Fractional Brownian motion kernel with Hurst index h from (0,1) given by
5+
```
6+
κ(x,y) = ( |x|²ʰ + |y|²ʰ - |x-y|²ʰ ) / 2
7+
```
8+
9+
For h=1/2, this is the Wiener Kernel, for h>1/2, the increments are
10+
positively correlated and for h<1/2 the increments are negatively correlated.
11+
"""
12+
struct FBMKernel{T<:Real} <: BaseKernel
13+
h::T
14+
function FBMKernel(;h::T=0.5) where {T<:Real}
15+
@assert h<=1.0 && h>=0.0 "FBMKernel: Given Hurst index h is invalid."
16+
return new{T}(h)
17+
end
18+
end
19+
20+
_fbm(modX, modY, modXY, h) = (modX^h + modY^h - modXY^h)/2
21+
22+
function kernelmatrix::FBMKernel, X::AbstractMatrix; obsdim::Int = defaultobs)
23+
@assert obsdim [1,2] "obsdim should be 1 or 2 (see docs of kernelmatrix))"
24+
modX = sum(abs2, X; dims = 3 - obsdim)
25+
modXX = pairwise(SqEuclidean(), X, dims = obsdim)
26+
return _fbm.(vec(modX), reshape(modX, 1, :), modXX, κ.h)
27+
end
28+
29+
function kernelmatrix!(K::AbstractMatrix, κ::FBMKernel, X::AbstractMatrix; obsdim::Int = defaultobs)
30+
@assert obsdim [1,2] "obsdim should be 1 or 2 (see docs of kernelmatrix))"
31+
modX = sum(abs2, X; dims = 3 - obsdim)
32+
modXX = pairwise(SqEuclidean(), X, dims = obsdim)
33+
K .= _fbm.(vec(modX), reshape(modX, 1, :), modXX, κ.h)
34+
return K
35+
end
36+
37+
function kernelmatrix(
38+
κ::FBMKernel,
39+
X::AbstractMatrix,
40+
Y::AbstractMatrix;
41+
obsdim::Int = defaultobs,
42+
)
43+
@assert obsdim [1,2] "obsdim should be 1 or 2 (see docs of kernelmatrix))"
44+
modX = sum(abs2, X, dims=3-obsdim)
45+
modY = sum(abs2, Y, dims=3-obsdim)
46+
modXY = pairwise(SqEuclidean(), X, Y,dims=obsdim)
47+
return _fbm.(vec(modX), reshape(modY, 1, :), modXY, κ.h)
48+
end
49+
50+
function kernelmatrix!(
51+
K::AbstractMatrix,
52+
κ::FBMKernel,
53+
X::AbstractMatrix,
54+
Y::AbstractMatrix;
55+
obsdim::Int = defaultobs,
56+
)
57+
@assert obsdim [1,2] "obsdim should be 1 or 2 (see docs of kernelmatrix))"
58+
modX = sum(abs2, X, dims=3-obsdim)
59+
modY = sum(abs2, Y, dims=3-obsdim)
60+
modXY = pairwise(SqEuclidean(), X, Y,dims=obsdim)
61+
K .= _fbm.(vec(modX), reshape(modY, 1, :), modXY, κ.h)
62+
return K
63+
end
64+
65+
## Apply kernel on two vectors ##
66+
function _kernel(
67+
κ::FBMKernel,
68+
x::AbstractVector,
69+
y::AbstractVector;
70+
obsdim::Int = defaultobs
71+
)
72+
@assert length(x) == length(y) "x and y don't have the same dimension!"
73+
return κ(x,y)
74+
end
75+
76+
#Syntactic Sugar
77+
function::FBMKernel)(x::AbstractVector{<:Real}, y::AbstractVector{<:Real})
78+
modX = sum(abs2, x)
79+
modY = sum(abs2, y)
80+
modXY = sqeuclidean(x, y)
81+
return (modX^κ.h + modY^κ.h - modXY^κ.h)/2
82+
end
83+
84+
::FBMKernel)(x::Real, y::Real) = (abs2(x)^κ.h + abs2(y)^κ.h - abs2(x-y)^κ.h)/2
85+
86+
function::FBMKernel)(X::AbstractMatrix{<:Real}, Y::AbstractMatrix{<:Real}; obsdim::Integer=defaultobs)
87+
return kernelmatrix(κ, X, Y, obsdim=obsdim)
88+
end
89+
90+
function::FBMKernel)(X::AbstractMatrix{<:Real}; obsdim::Integer=defaultobs)
91+
return kernelmatrix(κ, X, obsdim=obsdim)
92+
end

src/matrix/kernelmatrix.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ kernelmatrix!
99

1010

1111
function kernelmatrix!(
12-
K::Matrix,
12+
K::AbstractMatrix,
1313
κ::Kernel,
1414
X::AbstractMatrix;
1515
obsdim::Int = defaultobs

test/test_kernels.jl

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,21 @@ id = IdentityTransform();
2929
@test kappa(k, 0.5) == c
3030
end
3131
end
32+
@testset "FBM" begin
33+
k = FBMKernel(h=0.3)
34+
@test k(v1,v2) (sqeuclidean(v1, zero(v1))^0.3 + sqeuclidean(v2, zero(v2))^0.3 - sqeuclidean(v1-v2, zero(v1-v2))^0.3)/2 atol=1e-5
35+
36+
# kernelmatrix tests
37+
m1 = rand(3,3)
38+
m2 = rand(3,3)
39+
@test kernelmatrix(k, m1, m1) kernelmatrix(k, m1) atol=1e-5
40+
@test kernelmatrix(k, m1, m2) k(m1, m2) atol=1e-5
41+
42+
43+
x1 = rand()
44+
x2 = rand()
45+
@test kernelmatrix(k, x1*ones(1,1), x2*ones(1,1))[1] k(x1, x2) atol=1e-5
46+
end
3247
@testset "Cosine" begin
3348
k = CosineKernel()
3449
@test eltype(k) == Any

0 commit comments

Comments
 (0)