| @@ -4,155 +4,158 @@ These kernels are defined between pairs of vectors. | |||||
| import numpy as np | import numpy as np | ||||
| def deltakernel(x, y): | 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): | 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): | 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): | 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): | 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): | 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__': | if __name__ == '__main__': | ||||
| o = polynomialkernel([1, 2], [3, 4], 2, 3) | |||||
| o = polynomialkernel([1, 2], [3, 4], 2, 3) | |||||