11"""
2- LinearKernel(; c = 0.0)
2+ LinearKernel(; c::Real= 0.0)
33
4- The linear kernel is a Mercer kernel given by
5- ```
6- κ(x,y) = xᵀy + c
4+ Linear kernel with constant offset `c`.
5+
6+ # Definition
7+
8+ For inputs ``x, x' \\ in \\ mathbb{R}^d``, the linear kernel with constant offset
9+ ``c \\ geq 0`` is defined as
10+ ```math
11+ k(x, x'; c) = x^\\ top x' + c.
712```
8- Where `c` is a real number
13+
14+ See also: [`PolynomialKernel`](@ref)
915"""
1016struct LinearKernel{Tc<: Real } <: SimpleKernel
1117 c:: Vector{Tc}
12- function LinearKernel (; c:: T = 0.0 ) where {T}
13- return new {T} ([c])
18+
19+ function LinearKernel (; c:: Real = 0.0 )
20+ @check_args (LinearKernel, c, c >= zero (c), " c ≥ 0" )
21+ return new {typeof(c)} ([c])
1422 end
1523end
1624
@@ -23,29 +31,53 @@ metric(::LinearKernel) = DotProduct()
2331Base. show (io:: IO , κ:: LinearKernel ) = print (io, " Linear Kernel (c = " , first (κ. c), " )" )
2432
2533"""
26- PolynomialKernel(; d = 2.0 , c = 0.0)
34+ PolynomialKernel(; degree::Int=2 , c::Real= 0.0)
2735
28- The polynomial kernel is a Mercer kernel given by
29- ```
30- κ(x,y) = (xᵀy + c)^d
36+ Polynomial kernel of degree `degree` with constant offset `c`.
37+
38+ # Definition
39+
40+ For inputs ``x, x' \\ in \\ mathbb{R}^d``, the polynomial kernel of degree
41+ ``\\ nu \\ in \\ mathbb{N}`` with constant offset ``c \\ geq 0`` is defined as
42+ ```math
43+ k(x, x'; c, \\ nu) = (x^\\ top x' + c)^\\ nu.
3144```
32- Where `c` is a real number, and `d` is a shape parameter bigger than 1. For `d = 1` see [`LinearKernel`](@ref)
45+
46+ See also: [`LinearKernel`](@ref)
3347"""
34- struct PolynomialKernel{Td <: Real , Tc<: Real } <: SimpleKernel
35- d :: Vector{Td}
48+ struct PolynomialKernel{Tc<: Real } <: SimpleKernel
49+ degree :: Int
3650 c:: Vector{Tc}
37- function PolynomialKernel (; d:: Td = 2.0 , c:: Tc = 0.0 ) where {Td<: Real ,Tc<: Real }
38- @check_args (PolynomialKernel, d, d >= one (Td), " d >= 1" )
39- return new {Td,Tc} ([d], [c])
51+
52+ function PolynomialKernel {Tc} (degree:: Int , c:: Vector{Tc} ) where {Tc}
53+ @check_args (PolynomialKernel, degree, degree >= one (degree), " degree ≥ 1" )
54+ @check_args (PolynomialKernel, c, first (c) >= zero (Tc), " c ≥ 0" )
55+ return new {Tc} (degree, c)
4056 end
4157end
4258
43- @functor PolynomialKernel
59+ function PolynomialKernel (; d:: Real = - 1 , degree:: Int = 2 , c:: Real = 0.0 )
60+ if d != - 1
61+ Base. depwarn (
62+ " keyword argument `d` is deprecated, use `degree` instead" ,
63+ :PiecewisePolynomialKernel ,
64+ )
65+ isinteger (d) || error (" polynomial degree has to be an integer" )
66+ degree:: Int = convert (Int, d)
67+ end
68+ return PolynomialKernel {typeof(c)} (degree, [c])
69+ end
70+
71+ # The degree of the polynomial kernel is a fixed discrete parameter
72+ function Functors. functor (:: Type{<:PolynomialKernel} , x)
73+ reconstruct_polynomialkernel (xs) = PolynomialKernel {typeof(xs.c)} (x. degree, xs. c)
74+ return (c= x. c,), reconstruct_polynomialkernel
75+ end
4476
45- kappa (κ:: PolynomialKernel , xᵀy:: Real ) = (xᵀy + first (κ. c))^ ( first (κ . d))
77+ kappa (κ:: PolynomialKernel , xᵀy:: Real ) = (xᵀy + first (κ. c))^ κ . degree
4678
4779metric (:: PolynomialKernel ) = DotProduct ()
4880
4981function Base. show (io:: IO , κ:: PolynomialKernel )
50- return print (io, " Polynomial Kernel (c = " , first (κ. c), " , d = " , first (κ . d) , " )" )
82+ return print (io, " Polynomial Kernel (c = " , first (κ. c), " , degree = " , κ . degree , " )" )
5183end
0 commit comments