簡體   English   中英

高斯過程scikit-learn - 異常

[英]Gaussian Process scikit-learn - Exception

我想使用高斯過程來解決回歸任務。 我的數據如下:每個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.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。[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. 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. 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. 1 14. 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。 ]]

-------------------------------------------------- -------------------------()中的異常回溯(最近一次調用最后)()11 gp = gaussian_process.GaussianProcess(theta0 = 1e-2,thetaL) = 1e-4,thetaU = 1e-1)12 ---> 13 gp.fit(x _,y__)

/us/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

例外:多個輸入要素不能具有相同的目標值。

我發現了一些與scikit-learn問題相關的主題 ,但我的版本是最新的。

這是已知問題 ,但實際上還沒有得到解決。

這是發生的,因為如果你有相同的點,你的矩陣是不可逆的(單數)。(意味着你不能計算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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM