Гауссовский процесс scikit-learn-Exception
Я хочу использовать Гауссовы процессы для решения задачи регрессии. Мои данные таковы: каждый вектор 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. 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. ]]
--------------------------------------------------------------------------- исключение Traceback (последний вызов последний) в () 11 gp = gaussian_process.GaussianProcess(theta0=1e-2, thetaL=1e-4, thetaU=1e-1) Двенадцать --- >13 gp.fit (x__, y__)
/ usr / local/lib / python2.7 / site-packages/sklearn/gaussian_process / gaussian_process.пыць в пригонке (собственной личности, X, y) 300 if (np.min(np.sum (D, axis=1)) = = 0. 301 и самостоятельно.Корр != соотношение.pure_nugget): -- >302 исключение raise ("множественный вход функции не могут иметь одинаковые" 303 " целевое значение.") 304
исключение: несколько входных объектов не могут иметь одинаковое значение.
я нашел некоторые темы, связанные с scikit-learn
вопрос, но моя версия обновлена.
1 ответов
известно вопрос и он все еще фактически не был разрешен.
это происходит, потому что если у вас есть те же точки , ваша матрица не обратима(сингулярна).(это означает, что вы не можете вычислить^-1 - который является частью решения для GP).
чтобы решить эту проблему, просто добавьте небольшой гауссовский шум в свои примеры или используйте другие GP библиотека.
вы всегда можете попытаться реализовать его, на самом деле это не так сложно. Самый важная вещь в GP-это ваша функция ядра, например Gaussian kernel:
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)
.