Использование GPy с множественным выходом Coregionalized прогнозирования - PullRequest
3 голосов
/ 28 апреля 2020

Недавно я столкнулся с проблемой, когда я считаю, что ГП с несколькими выходами может быть хорошим кандидатом. В настоящее время я применяю GP с одним выходом к моим данным, и с ростом размерности мои результаты продолжают ухудшаться. Я пробовал многократный вывод с SKlearn и смог получить лучшие результаты для более высоких измерений, однако я считаю, что GPy более полон для таких задач, и у меня был бы больший контроль над моделью. Для GP с одним выходом я настраивал ядро ​​следующим образом:

kernel = GPy.kern.RBF(input_dim=4, variance=1.0, lengthscale=1.0, ARD = True)
m = GPy.models.GPRegression(X, Y_single_output, kernel = kernel, normalizer = True) 
m.optimize_restarts(num_restarts=10)  

В приведенном выше примере X имеет размер (20,4) и Y (20,1).

Реализация, которую я использую для множественного вывода, я получил от Введение в процессы множественного вывода Гаусса Я подготавливаю данные в соответствии с примером, устанавливая X_mult_output в size (80,2) - со вторым столбцом, являющимся входными индексами, и перестановкой Y в (80,1).

kernel = GPy.kern.RBF(1,lengthscale=1, ARD = True)**GPy.kern.Coregionalize(input_dim=1,output_dim=4, rank=1)
m = GPy.models.GPRegression(X_mult_output,Y_mult_output, kernel = kernel, normalizer = True)

Хорошо, пока все работает, теперь я хочу предсказать значения. Проблема в том, что мне кажется, что я не могу предсказать значения. Из того, что я понял, вы можете просто предсказать один выход, указав входной индекс в аргументе Y_metadata. Поскольку у меня есть 4 входа, я устанавливаю массив, который я хочу предсказать, следующим образом:

x_pred = np.array([3,2,2,4])

Затем я представляю, что мне нужно отдельно сделать прогноз каждого значения из моего массива x_pred, как показано в Модель сгруппированной регрессии (векторная регрессия) :

Y_metadata1 = {'output_index': np.array([[0]])}

y1_pred = m.predict(np.array(x[0]).reshape(1,-1),Y_metadata=Y_metadata1)

Проблема заключается в том, что я получаю следующую ошибку:

IndexError: index 1 is out of bounds for axis 1 with size 1

Любое предложение о том, как чтобы преодолеть эту проблему или есть какая-то ошибка в моей реализации?

Traceback:

Traceback (most recent call last):

  File "<ipython-input-9-edb25bc29817>", line 36, in <module>
    y1_pred = m.predict(np.array(x[0]).reshape(1,-1),Y_metadata=Y_metadata1)

  File "c:\users\johndoe\desktop\modules\sheffieldml-gpy-v1.9.9-0-g92f2e87\sheffieldml-gpy-92f2e87\GPy\core\gp.py", line 335, in predict
    mean, var = self._raw_predict(Xnew, full_cov=full_cov, kern=kern)

  File "c:\users\johndoe\desktop\modules\sheffieldml-gpy-v1.9.9-0-g92f2e87\sheffieldml-gpy-92f2e87\GPy\core\gp.py", line 292, in _raw_predict
    mu, var = self.posterior._raw_predict(kern=self.kern if kern is None else kern, Xnew=Xnew, pred_var=self._predictive_variable, full_cov=full_cov)

  File "c:\users\johndoe\desktop\modules\sheffieldml-gpy-v1.9.9-0-g92f2e87\sheffieldml-gpy-92f2e87\GPy\inference\latent_function_inference\posterior.py", line 276, in _raw_predict
    Kx = kern.K(pred_var, Xnew)

  File "c:\users\johndoe\desktop\modules\sheffieldml-gpy-v1.9.9-0-g92f2e87\sheffieldml-gpy-92f2e87\GPy\kern\src\kernel_slice_operations.py", line 109, in wrap
    with _Slice_wrap(self, X, X2) as s:

  File "c:\users\johndoe\desktop\modules\sheffieldml-gpy-v1.9.9-0-g92f2e87\sheffieldml-gpy-92f2e87\GPy\kern\src\kernel_slice_operations.py", line 65, in __init__
    self.X2 = self.k._slice_X(X2) if X2 is not None else X2

  File "<decorator-gen-140>", line 2, in _slice_X

  File "C:\Users\johndoe\AppData\Roaming\Python\Python37\site-packages\paramz\caching.py", line 283, in g
    return cacher(*args, **kw)

  File "C:\Users\johndoe\AppData\Roaming\Python\Python37\site-packages\paramz\caching.py", line 172, in __call__
    return self.operation(*args, **kw)

  File "c:\users\johndoe\desktop\modules\sheffieldml-gpy-v1.9.9-0-g92f2e87\sheffieldml-gpy-92f2e87\GPy\kern\src\kern.py", line 117, in _slice_X
    return X[:, self._all_dims_active]

IndexError: index 1 is out of bounds for axis 1 with size 1



1 Ответ

0 голосов
/ 06 мая 2020

задача

вы определили ядро ​​с X измерения (-1, 4) и Y измерения (-1, 1), но вы даете ему X_pred измерения (1, 1) ( первый элемент x_pred преобразуется в (1, 1))

решение

дает x_pred модели для прогнозирования (вход с измерением (-1, 4))

Y_metadata1 = {'output_index': np.array([[0]])}
y1_pred = m.predict(np.array(x_pred).reshape(1,-1), Y_metadata=Y_metadata1)

DIY

перед выполнением ваших кодов попробуйте запустить их отдельно и легко отладить, тогда вы можете сделать свой код маленьким и чистым. В примере ниже приведен отладочный код вашей проблемы

Y_metadata1 = {'output_index': np.array([[0]])}
a = np.array(x_pred[0]).reshape(1,-1)
print(a.shape)
y1_pred = m.predict(a,Y_metadata=Y_metadata1)

вывод (1,1) и ошибка, которая делает очевидным, что ошибка связана с измерением ввода.

Ошибки чтения также помогают , ваша ошибка говорит, что в kern.K(pred_var, Xnew) есть проблема, поэтому ошибка, вероятно, от ядра, тогда она говорит от X[:, self._all_dims_active], так что ошибка, вероятно, от измерений X. затем, немного поэкспериментировав с размером x, вы поймете идею.

, надеюсь, через 7 дней это поможет!

...