"""Those who are not graph kernels. We can be kernels for nodes or edges! These kernels are defined between pairs of vectors. """ import numpy as np def kronecker_delta_kernel(x, y): """Delta kernel. Return 1 if x == y, 0 otherwise. Parameters ---------- x, y : any Two parts to compare. 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 (1 if np.array_equal(x, y) else 0) def delta_kernel(x, y): return x == y #(1 if condition else 0) def deltakernel(x, y): return delta_kernel(x, y) def gaussian_kernel(x, y, gamma=None): """Gaussian kernel. Compute the rbf (gaussian) kernel between x and y: K(x, y) = exp(-gamma ||x-y||^2). Read more in the `User Guide of scikit-learn library `__. Parameters ---------- x, y : array gamma : float, default None If None, defaults to 1.0 / n_features 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(np.subtract(x, y) ** 2)) * -gamma) def gaussiankernel(x, y, gamma=None): return gaussian_kernel(x, y, gamma=gamma) def polynomial_kernel(x, y, gamma=1, coef0=0, d=1): return (np.dot(x, y) * gamma + coef0) ** d def highest_polynomial_kernel(x, y, d=1, c=0): """Polynomial kernel. Compute the polynomial kernel between x and y: K(x, y) = ^d + c. Parameters ---------- x, y : array d : integer, default 1 c : float, default 0 Returns ------- kernel : float """ return np.dot(x, y) ** d + c def polynomialkernel(x, y, d=1, c=0): return highest_polynomial_kernel(x, y, d=d, c=c) def linear_kernel(x, y): """Polynomial kernel. Compute the polynomial kernel between x and y: K(x, y) = . Parameters ---------- x, y : array d : integer, default 1 c : float, default 0 Returns ------- kernel : float """ return np.dot(x, y) def linearkernel(x, y): return linear_kernel(x, y) def cosine_kernel(x, y): return np.dot(x, y) / (np.linalg.norm(x) * np.linalg.norm(y)) def sigmoid_kernel(x, y, gamma=None, coef0=1): if gamma is None: gamma = 1.0 / len(x) k = np.dot(x, y) k *= gamma k += coef0 k = np.tanh(k) # k = np.tanh(k, k) # compute tanh in-place return k def laplacian_kernel(x, y, gamma=None): if gamma is None: gamma = 1.0 / len(x) k = -gamma * np.linalg.norm(np.subtract(x, y)) k = np.exp(k) return k def chi2_kernel(x, y, gamma=1.0): k = np.divide(np.subtract(x, y) ** 2, np.add(x, y)) k = np.sum(k) k *= -gamma return np.exp(k) def exponential_kernel(x, y, gamma=None): if gamma is None: gamma = 1.0 / len(x) return np.exp(np.dot(x, y) * gamma) def intersection_kernel(x, y): return np.sum(np.minimum(x, y)) def multiquadratic_kernel(x, y, c=0): return np.sqrt((np.sum(np.subtract(x, y) ** 2)) + c) def inverse_multiquadratic_kernel(x, y, c=0): return 1 / multiquadratic_kernel(x, y, c=c) def kernelsum(k1, k2, d11, d12, d21=None, d22=None, lamda1=1, lamda2=1): """Sum of a pair of kernels. 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. 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 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 if __name__ == '__main__': o = polynomialkernel([1, 2], [3, 4], 2, 3)