首页 文章

高斯过程scikit-learn - 异常

提问于
浏览
6

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

我正在使用 Python 中的 sklearn 包,但尝试使用高斯进程会导致 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.] [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. 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 in fit(self,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 回答

  • 6

    它已知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) .

相关问题