高斯过程scikit-learn - 异常

时间:2016-01-11 14:17:55

标签: python scikit-learn regression gaussian forecasting

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

我使用sklearn中的Python包但尝试使用高斯过程会导致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。        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。        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.] [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.] [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.] [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.] [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.] [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.]]

     

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。 ]

     

----------------------------------------------- ---------------------------- Exception Traceback(最近的电话   最后)in()        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提高异常("多输入功能不能相同"       303"目标值。")       304

     

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

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

1 个答案:

答案 0 :(得分:7)

众所周知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)