利用GPy多输出共区域化预测

2024-10-01 17:38:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我最近一直面临一个问题,我认为多输出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)

我正在使用的实现用于从 Introduction to Multiple Output Gaussian Processes获得的多个输出 我根据示例准备数据,将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_元数据参数上指定输入索引来预测单个输出。 由于我有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




Tags: inpyselfoutputlinekerneluserspredict
1条回答
网友
1楼 · 发布于 2024-10-01 17:38:47

问题

您已经用维度的X(-1,4)和维度的Y(-1,1)定义了内核,但是您给它的是维度(1,1)的X_pred(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天后这会有所帮助

相关问题 更多 >

    热门问题