我发现了一个从头开始实现高斯过程的例子:http://krasserm.github.io/2018/03/19/gaussian-processes/
其中,各向同性平方指数核在numpy中实现。其实现看起来像这样:
实现代码如下:
def kernel(X1, X2, l=1.0, sigma_f=1.0): sqdist = np.sum(X1**2, 1).reshape(-1, 1) + np.sum(X2**2, 1) - 2 * np.dot(X1, X2.T) return sigma_f**2 * np.exp(-0.5 / l**2 * sqdist)
这与Nando de Freitas的实现一致:https://www.cs.ubc.ca/~nando/540-2013/lectures/gp.py
然而,我不太确定这个实现是如何与提供的公式相匹配的,特别是在sqdist部分。我认为它是错误的,但它确实有效(并与scipy的cdist使用平方欧几里得距离的结果相同)。为什么我认为它是错误的?如果你展开两个矩阵的乘法,你会得到
这等于一个标量或对于向量x_i的一个nxn矩阵,这取决于你是否定义x_i为列向量。然而,该实现返回的是一个包含平方值的nx1向量。
我希望有人能对此提供一些见解。
回答:
我发现了:这个实现是正确的。我只是没有意识到(在我看来)有时在机器学习环境中使用的模糊符号。所要实现的是一个距离矩阵,每个矩阵A的行向量需要与矩阵B的行向量进行比较,以推断协方差矩阵,而不是(如我所猜测的)两个矩阵/向量之间的直接距离。