|
|
@@ -4,155 +4,158 @@ These kernels are defined between pairs of vectors. |
|
|
|
import numpy as np |
|
|
|
|
|
|
|
def deltakernel(x, y): |
|
|
|
"""Delta kernel. Return 1 if x == y, 0 otherwise. |
|
|
|
"""Delta kernel. Return 1 if x == y, 0 otherwise. |
|
|
|
|
|
|
|
Parameters |
|
|
|
---------- |
|
|
|
x, y : any |
|
|
|
Two parts to compare. |
|
|
|
Parameters |
|
|
|
---------- |
|
|
|
x, y : any |
|
|
|
Two parts to compare. |
|
|
|
|
|
|
|
Return |
|
|
|
------ |
|
|
|
kernel : integer |
|
|
|
Delta kernel. |
|
|
|
Return |
|
|
|
------ |
|
|
|
kernel : integer |
|
|
|
Delta kernel. |
|
|
|
|
|
|
|
References |
|
|
|
---------- |
|
|
|
[1] H. Kashima, K. Tsuda, and A. Inokuchi. Marginalized kernels between |
|
|
|
labeled graphs. In Proceedings of the 20th International Conference on |
|
|
|
Machine Learning, Washington, DC, United States, 2003. |
|
|
|
""" |
|
|
|
return x == y #(1 if condition else 0) |
|
|
|
References |
|
|
|
---------- |
|
|
|
[1] H. Kashima, K. Tsuda, and A. Inokuchi. Marginalized kernels between |
|
|
|
labeled graphs. In Proceedings of the 20th International Conference on |
|
|
|
Machine Learning, Washington, DC, United States, 2003. |
|
|
|
""" |
|
|
|
return x == y #(1 if condition else 0) |
|
|
|
|
|
|
|
|
|
|
|
def gaussiankernel(x, y, gamma=None): |
|
|
|
"""Gaussian kernel. |
|
|
|
Compute the rbf (gaussian) kernel between x and y: |
|
|
|
"""Gaussian kernel. |
|
|
|
Compute the rbf (gaussian) kernel between x and y: |
|
|
|
|
|
|
|
K(x, y) = exp(-gamma ||x-y||^2). |
|
|
|
K(x, y) = exp(-gamma ||x-y||^2). |
|
|
|
|
|
|
|
Read more in the `User Guide of scikit-learn library <https://scikit-learn.org/stable/modules/metrics.html#rbf-kernel>`__. |
|
|
|
Read more in the `User Guide of scikit-learn library <https://scikit-learn.org/stable/modules/metrics.html#rbf-kernel>`__. |
|
|
|
|
|
|
|
Parameters |
|
|
|
---------- |
|
|
|
x, y : array |
|
|
|
Parameters |
|
|
|
---------- |
|
|
|
x, y : array |
|
|
|
|
|
|
|
gamma : float, default None |
|
|
|
If None, defaults to 1.0 / n_features |
|
|
|
gamma : float, default None |
|
|
|
If None, defaults to 1.0 / n_features |
|
|
|
|
|
|
|
Returns |
|
|
|
------- |
|
|
|
kernel : float |
|
|
|
""" |
|
|
|
if gamma is None: |
|
|
|
gamma = 1.0 / len(x) |
|
|
|
Returns |
|
|
|
------- |
|
|
|
kernel : float |
|
|
|
""" |
|
|
|
if gamma is None: |
|
|
|
gamma = 1.0 / len(x) |
|
|
|
|
|
|
|
# xt = np.array([float(itm) for itm in x]) # @todo: move this to dataset or datafile to speed up. |
|
|
|
# yt = np.array([float(itm) for itm in y]) |
|
|
|
# kernel = xt - yt |
|
|
|
# kernel = kernel ** 2 |
|
|
|
# kernel = np.sum(kernel) |
|
|
|
# kernel *= -gamma |
|
|
|
# kernel = np.exp(kernel) |
|
|
|
# return kernel |
|
|
|
|
|
|
|
return np.exp((np.sum((x - y) ** 2)) * -gamma) |
|
|
|
|
|
|
|
xt = np.array([float(itm) for itm in x]) # @todo: move this to dataset or datafile to speed up. |
|
|
|
yt = np.array([float(itm) for itm in y]) |
|
|
|
kernel = xt - yt |
|
|
|
kernel = kernel ** 2 |
|
|
|
kernel = np.sum(kernel) |
|
|
|
kernel *= -gamma |
|
|
|
kernel = np.exp(kernel) |
|
|
|
return kernel |
|
|
|
|
|
|
|
|
|
|
|
def polynomialkernel(x, y, d=1, c=0): |
|
|
|
"""Polynomial kernel. |
|
|
|
Compute the polynomial kernel between x and y: |
|
|
|
"""Polynomial kernel. |
|
|
|
Compute the polynomial kernel between x and y: |
|
|
|
|
|
|
|
K(x, y) = <x, y> ^d + c. |
|
|
|
K(x, y) = <x, y> ^d + c. |
|
|
|
|
|
|
|
Parameters |
|
|
|
---------- |
|
|
|
x, y : array |
|
|
|
Parameters |
|
|
|
---------- |
|
|
|
x, y : array |
|
|
|
|
|
|
|
d : integer, default 1 |
|
|
|
d : integer, default 1 |
|
|
|
|
|
|
|
c : float, default 0 |
|
|
|
c : float, default 0 |
|
|
|
|
|
|
|
Returns |
|
|
|
------- |
|
|
|
kernel : float |
|
|
|
""" |
|
|
|
return np.dot(x, y) ** d + c |
|
|
|
Returns |
|
|
|
------- |
|
|
|
kernel : float |
|
|
|
""" |
|
|
|
return np.dot(x, y) ** d + c |
|
|
|
|
|
|
|
|
|
|
|
def linearkernel(x, y): |
|
|
|
"""Polynomial kernel. |
|
|
|
Compute the polynomial kernel between x and y: |
|
|
|
"""Polynomial kernel. |
|
|
|
Compute the polynomial kernel between x and y: |
|
|
|
|
|
|
|
K(x, y) = <x, y>. |
|
|
|
K(x, y) = <x, y>. |
|
|
|
|
|
|
|
Parameters |
|
|
|
---------- |
|
|
|
x, y : array |
|
|
|
Parameters |
|
|
|
---------- |
|
|
|
x, y : array |
|
|
|
|
|
|
|
d : integer, default 1 |
|
|
|
d : integer, default 1 |
|
|
|
|
|
|
|
c : float, default 0 |
|
|
|
c : float, default 0 |
|
|
|
|
|
|
|
Returns |
|
|
|
------- |
|
|
|
kernel : float |
|
|
|
""" |
|
|
|
return np.dot(x, y) |
|
|
|
Returns |
|
|
|
------- |
|
|
|
kernel : float |
|
|
|
""" |
|
|
|
return np.dot(x, y) |
|
|
|
|
|
|
|
|
|
|
|
def kernelsum(k1, k2, d11, d12, d21=None, d22=None, lamda1=1, lamda2=1): |
|
|
|
"""Sum of a pair of kernels. |
|
|
|
"""Sum of a pair of kernels. |
|
|
|
|
|
|
|
k = lamda1 * k1(d11, d12) + lamda2 * k2(d21, d22) |
|
|
|
k = lamda1 * k1(d11, d12) + lamda2 * k2(d21, d22) |
|
|
|
|
|
|
|
Parameters |
|
|
|
---------- |
|
|
|
k1, k2 : function |
|
|
|
A pair of kernel functions. |
|
|
|
d11, d12: |
|
|
|
Inputs of k1. If d21 or d22 is None, apply d11, d12 to both k1 and k2. |
|
|
|
d21, d22: |
|
|
|
Inputs of k2. |
|
|
|
lamda1, lamda2: float |
|
|
|
Coefficients of the product. |
|
|
|
Parameters |
|
|
|
---------- |
|
|
|
k1, k2 : function |
|
|
|
A pair of kernel functions. |
|
|
|
d11, d12: |
|
|
|
Inputs of k1. If d21 or d22 is None, apply d11, d12 to both k1 and k2. |
|
|
|
d21, d22: |
|
|
|
Inputs of k2. |
|
|
|
lamda1, lamda2: float |
|
|
|
Coefficients of the product. |
|
|
|
|
|
|
|
Return |
|
|
|
------ |
|
|
|
kernel : integer |
|
|
|
Return |
|
|
|
------ |
|
|
|
kernel : integer |
|
|
|
|
|
|
|
""" |
|
|
|
if d21 == None or d22 == None: |
|
|
|
kernel = lamda1 * k1(d11, d12) + lamda2 * k2(d11, d12) |
|
|
|
else: |
|
|
|
kernel = lamda1 * k1(d11, d12) + lamda2 * k2(d21, d22) |
|
|
|
return kernel |
|
|
|
""" |
|
|
|
if d21 == None or d22 == None: |
|
|
|
kernel = lamda1 * k1(d11, d12) + lamda2 * k2(d11, d12) |
|
|
|
else: |
|
|
|
kernel = lamda1 * k1(d11, d12) + lamda2 * k2(d21, d22) |
|
|
|
return kernel |
|
|
|
|
|
|
|
|
|
|
|
def kernelproduct(k1, k2, d11, d12, d21=None, d22=None, lamda=1): |
|
|
|
"""Product of a pair of kernels. |
|
|
|
|
|
|
|
k = lamda * k1(d11, d12) * k2(d21, d22) |
|
|
|
|
|
|
|
Parameters |
|
|
|
---------- |
|
|
|
k1, k2 : function |
|
|
|
A pair of kernel functions. |
|
|
|
d11, d12: |
|
|
|
Inputs of k1. If d21 or d22 is None, apply d11, d12 to both k1 and k2. |
|
|
|
d21, d22: |
|
|
|
Inputs of k2. |
|
|
|
lamda: float |
|
|
|
Coefficient of the product. |
|
|
|
|
|
|
|
Return |
|
|
|
------ |
|
|
|
kernel : integer |
|
|
|
""" |
|
|
|
if d21 == None or d22 == None: |
|
|
|
kernel = lamda * k1(d11, d12) * k2(d11, d12) |
|
|
|
else: |
|
|
|
kernel = lamda * k1(d11, d12) * k2(d21, d22) |
|
|
|
return kernel |
|
|
|
"""Product of a pair of kernels. |
|
|
|
|
|
|
|
k = lamda * k1(d11, d12) * k2(d21, d22) |
|
|
|
|
|
|
|
Parameters |
|
|
|
---------- |
|
|
|
k1, k2 : function |
|
|
|
A pair of kernel functions. |
|
|
|
d11, d12: |
|
|
|
Inputs of k1. If d21 or d22 is None, apply d11, d12 to both k1 and k2. |
|
|
|
d21, d22: |
|
|
|
Inputs of k2. |
|
|
|
lamda: float |
|
|
|
Coefficient of the product. |
|
|
|
|
|
|
|
Return |
|
|
|
------ |
|
|
|
kernel : integer |
|
|
|
""" |
|
|
|
if d21 == None or d22 == None: |
|
|
|
kernel = lamda * k1(d11, d12) * k2(d11, d12) |
|
|
|
else: |
|
|
|
kernel = lamda * k1(d11, d12) * k2(d21, d22) |
|
|
|
return kernel |
|
|
|
|
|
|
|
|
|
|
|
if __name__ == '__main__': |
|
|
|
o = polynomialkernel([1, 2], [3, 4], 2, 3) |
|
|
|
o = polynomialkernel([1, 2], [3, 4], 2, 3) |