Scikit-learn 的高斯过程:如何在内核/cov 函数中包含多个超参数?

机器算法验证 机器学习 高斯过程 scikit-学习
2022-03-24 17:40:26

我正在使用 scikit-learn 的高斯过程实现。一个简单的事情是将多个内核组合为线性组合以正确描述您的时间序列。所以我想包括平方指数核和周期核。有效内核的线性组合产生有效内核,乘以有效内核也是如此(由 Rasmussen 和 Williams 给出)。

不幸的是,我还没有弄清楚如何将 theta 参数正确地提供给模型。例如,如果我们有:

kGauss(x,x)=exp(θ(xx)2)

然后就可以了(这就是在 scikit-learn 中定义平方指数内核的方式)。但如果我想要:

kGauss(x,x)=θ0exp(θ1(xx)2)

那么这是不可能的,似乎。θthing 应该是一个数组,以防你有多个维度/特征(即使 scikit-learn 不支持多维 GP,有人开发了它,它很快就会被合并)。所以有一行的列是某某维度中的参数。但是你不能有更多的行,否则它会向你尖叫。

所以问题是:有没有人真正能够使用使用多个超参数的内核?如果是这样,我做错了什么?如果 scikit 中的当前代码确实不可能,是否有人对如何扩展它有一些提示?这是我需要的一个非常重要的功能。谢谢。

2个回答

在 scikit-learn==0.14.1 上。

θ0可以是向量。以下代码适用于我。

import numpy as np
from sklearn.gaussian_process import GaussianProcess
from sklearn.datasets import make_regression
X, y = make_regression()
bad_theta = np.abs(np.random.normal(0,1,100))
model = GaussianProcess(theta0=bad_theta)
model.fit(X,y)

您可以将任何您想要的内核作为参数 corr 传递。以下是 sklearn 用于高斯过程的径向基函数。

def squared_exponential(theta, d):
    """
    Squared exponential correlation model (Radial Basis Function).
    (Infinitely differentiable stochastic process, very smooth)::

                                            n
        theta, dx --> r(theta, dx) = exp(  sum  - theta_i * (dx_i)^2 )
                                        i = 1

    Parameters
    ----------
    theta : array_like
        An array with shape 1 (isotropic) or n (anisotropic) giving the
        autocorrelation parameter(s).

    dx : array_like
        An array with shape (n_eval, n_features) giving the componentwise
        distances between locations x and x' at which the correlation model
        should be evaluated.

    Returns
    -------
    r : array_like
        An array with shape (n_eval, ) containing the values of the
        autocorrelation model.
    """

    theta = np.asarray(theta, dtype=np.float)
    d = np.asarray(d, dtype=np.float)

    if d.ndim > 1:
        n_features = d.shape[1]
    else:
        n_features = 1

    if theta.size == 1:
        return np.exp(-theta[0] * np.sum(d ** 2, axis=1))
    elif theta.size != n_features:
        raise ValueError("Length of theta must be 1 or %s" % n_features)
    else:
        return np.exp(-np.sum(theta.reshape(1, n_features) * d ** 2, axis=1))

顺便说一句,看起来你正在做一些非常有趣的事情。

对于未来的用户,在 sklearn 0.19.1(可能更早)中,您可以使用组合内核。

我认为您可以通过以下方式创建所需的内核

kernel = ConstantKernel(1.0) * RBF(np.ones(nrOfFeatures))

ConstantKernel 将是您的 theta0。如果您为 RBF 内核提供单个浮点数,这将是您的 theta1