使用 GPy 多输出共区域化预测
Using GPy Multiple-output coregionalized prediction
我最近遇到一个问题,我认为多输出 GP 可能是一个不错的选择。我目前正在对我的数据应用单输出 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 设置为大小 (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 数组中的每个值,如 Coregionalized Regression Model (vector-valued regression) 所示:
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 (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, 4) 的 X 和维度 (-1, 1) 的 Y 定义了核,但是您给它 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)
自己动手
在一起执行您的代码之前,请尝试 运行 它们分开并轻松调试它们,然后您可以使您的代码小而干净。
下面的例子是你的问题的调试代码
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 天后这会有所帮助!
我最近遇到一个问题,我认为多输出 GP 可能是一个不错的选择。我目前正在对我的数据应用单输出 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 设置为大小 (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 数组中的每个值,如 Coregionalized Regression Model (vector-valued regression) 所示:
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 (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, 4) 的 X 和维度 (-1, 1) 的 Y 定义了核,但是您给它 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)
自己动手
在一起执行您的代码之前,请尝试 运行 它们分开并轻松调试它们,然后您可以使您的代码小而干净。 下面的例子是你的问题的调试代码
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 天后这会有所帮助!