我们都知道issue https://github.com/scikit-learn/scikit-learn/issues/4916并且实际上还没有得到解决。
它确实发生了,因为如果你有相同的点,你的矩阵就不是可逆的(奇异的)。(这意味着你无法计算 A^-1 - 这是 GP 解决方案的一部分)。
为了解决这个问题,只需在示例中添加一些小的高斯噪声或使用其他GP https://github.com/SheffieldML/GPy图书馆。
你可以尝试去实现它,其实并不难。 GP中最重要的是你的核函数,例如高斯核:
exponential_kernel = lambda x, y, params: params[0] * \
np.exp( -0.5 * params[1] * np.sum((x - y)**2) )
现在,我们需要构建协方差矩阵,如下所示:
covariance = lambda kernel, x, y, params: \
np.array([[kernel(xi, yi, params) for xi in x] for yi in y])
所以,当你想预测新点时x
计算其协方差:
sigma1 = covariance(exponential_kernel, x, x, theta)
并应用以下:
def predict(x, data, kernel, params, sigma, t):
k = [kernel(x, y, params) for y in data]
Sinv = np.linalg.inv(sigma)
y_pred = np.dot(k, Sinv).dot(t)
sigma_new = kernel(x, x, params) - np.dot(k, Sinv).dot(k)
return y_pred, sigma_new
这是非常幼稚的实现,对于高维度的数据,运行时间会很高。这里最难计算的是Sinv = np.linalg.inv(sigma)
这需要O(N^3)
.