Kernel Matrices¶
Linear Kernel¶
def linear_kernel(x: np.ndarray, y: np.ndarray) -> float:
    return np.inner(x, y)
Polynomial Kernel¶
def polynomial_kernel(params, x: np.ndarray, y: np.ndarray) -> float:
    return np.power(params['alpha'] * np.inner(x, y)), params['degree']
Sigmoid Kernel¶
def sigmoid_kernel(params, x: np.ndarray, y: np.ndarray) -> float:
    return np.tanh(params['alpha'], np.inner(x, y) + c)
RBF Kernel¶
k(x,y) = \exp(-\gamma ||x-y||_2^2)
def rbf_kernel(params, x: np.ndarray, y: np.ndarray) -> float:
    """The RBF Kernel"""
    # calculate the kernel
    return np.exp(- params['gamma'] * (sqeuclidean_distances(x, y)) )
ARD Kernel¶
def ard_kernel(params, x, y):
    """The RBF Kernel"""
    # scale the data
    x = np.divide(x, params['length_scale'])
    y = np.divide(y, params['length_scale'])
    # calculate the kernel
    return np.exp(- (sqeuclidean_distances(x, y)) )
Gram Matrix¶
Method I - single call
def gram(kernel_func, params, X, Y=None):
    if Y is None:
        return vmap(lambda x: vmap(lambda y: kernel_func(params, x, y))(X))(X)
    else:
        return vmap(lambda x: vmap(lambda y: kernel_func(params, x, y))(Y))(X)
Method II - multiple calls
# Covariance Matrix
def covariance_matrix(kernel_func, x, y):
    mapx1 = jax.vmap(lambda x, y: kernel_func(x, y), in_axes=(0, None), out_axes=0)
    mapx2 = jax.vmap(lambda x, y: mapx1(x, y), in_axes=(None, 0), out_axes=1)
    return mapx2(x, y)