高斯过程 scikit-learn - 异常

Posted

技术标签:

【中文标题】高斯过程 scikit-learn - 异常【英文标题】:Gaussian Process scikit-learn - Exception 【发布时间】:2016-04-15 21:21:33 【问题描述】:

我想使用高斯过程来解决回归任务。我的数据如下:每个X向量的长度为37,每个Y向量的长度为8。

我在Python 中使用sklearnpackage,但尝试使用高斯过程会导致Exception

from sklearn import gaussian_process

print "x :", x__
print "y :", y__

gp = gaussian_process.GaussianProcess(theta0=1e-2, thetaL=1e-4, thetaU=1e-1)
gp.fit(x__, y__) 

x : [[ 136. 137. 137. 132. 130. 130. 132. 133. 134. 135. 135. 134. 134. 1139. 1019. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 70. 24. 55. 0. 9. 0. 0.] [ 136. 137. 137. 132. 130. 130. 132. 133. 134. 135. 135. 134. 134. 1139. 1019. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 70. 24. 55. 0. 9. 0. 0.] [ 82. 76. 80. 103. 135. 155. 159. 156. 145. 138. 130. 122. 122. 689. 569. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] [ 156. 145. 138. 130. 122. 118. 113. 111. 105. 101. 98. 95. 95. 759. 639. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] [ 112. 111. 111. 114. 114. 113. 114. 114. 112. 111. 109. 109. 109. 1109. 989. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] [ 133. 130. 125. 124. 124. 123. 103. 87. 96. 121. 122. 123. 123. 399. 279. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] [ 104. 109. 111. 106. 91. 86. 117. 123. 123. 120. 121. 115. 115. 549. 429. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] [ 144. 138. 126. 122. 119. 118. 116. 114. 107. 105. 106. 119. 119. 479. 359. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]]

y : [[ 7. 9. 13. 30. 34. 37. 36. 41. ] [ 7. 9. 13. 30. 34. 37. 36. 41. ] [ -4. -9。 -17。 -21。 -27。 -28。 -28。 -20。 ] [ -1。 -1。 -4。 -5。 20. 28. 31. 23. ] [ -1. -2。 -3。 -1。 -4。 -7。 8. 58. ] [ -1. -2。 -14.33333333 -14。 -13.66666667 -32。 -26.66666667 -1。 ] [ 1. 3.33333333 0. -0.66666667 3. 6. 22. 54. ] [ -2. -8。 -11。 -17。 -17。 -16。 -16。 -23。 ]]

----------------------------------- ---------------------------- 异常回溯(最近调用 最后)在() 11 gp = gaussian_process.GaussianProcess(theta0=1e-2, thetaL=1e-4, thetaU=1e-1) 12 ---> 13 gp.fit(x__, y__)

/usr/local/lib/python2.7/site-packages/sklearn/gaussian_process/gaussian_process.pyc 适合(自我,X,y) 300 if (np.min(np.sum(D, axis=1)) == 0。 301 和 self.corr != correlation.pure_nugget): --> 302 raise Exception("多个输入特征不能相同" 303“目标值。”) 304

例外:多个输入特征不能具有相同的目标值。

我找到了some topics related to a scikit-learn issue,但我的版本是最新的。

【问题讨论】:

根据问题中的建议,您是否尝试在gaussian_process.py 中注释掉line 307 感谢@erip,它确实解决了-暂时-问题! 【参考方案1】:

已知issue,但实际上仍未解决。

这是发生的,因为如果你有相同的点,你的矩阵是不可逆的(单数)。(意味着你不能计算 A^-1 - 这是 GP 解决方案的一部分)。

为了解决它,只需在您的示例中添加一些小的高斯噪声或使用其他 GP 库。

您总是可以尝试实现它,实际上并不难。 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)

【讨论】:

谢谢!我一直在尝试使用 GPy,但我失败了。有了这个技巧,它现在可以工作了。 附注 - 这似乎是解决库中问题的好建议。如果还没有完成,我建议建议这样做。 +1 用于数学建议,而不是我建议的 kludge。 :) 我遇到了完全相同的问题,但我不确定如何在我的情况下使用这个非常好的技巧。我有以下 3 行: gp = GaussianProcess(theta0=0.3, nugget=2.4) gp.fit(xtrain, ytrain) y_pred, sigma = gp.predict(xtest, eval_MSE=True) 那么,谁是谁?如何使用 Farseer 的建议进行“拟合”?所以我计算“exponential_kernel”、“协方差”和“sigma”并调用预测,但拟合/训练是如何完成的?谢谢 看到您解释繁重的运行时间部分并给出命令会很有帮助。

以上是关于高斯过程 scikit-learn - 异常的主要内容,如果未能解决你的问题,请参考以下文章

如何为 scikit-learn 的高斯过程回归指定先验?

如何正确使用 scikit-learn 的高斯过程进行 2D 输入、1D 输出回归?

使用scikit-learn的高斯过程回归时如何使用点的经纬度?

如何在 Scikit-learn 中使用“狄利克雷过程高斯混合模型”? (n_components?)

如何使用 scikit-learn 进行高斯/多项式回归?

高斯混合模型:Spark MLlib 和 scikit-learn 之间的区别