我想在GPy中执行共区域回归,但我使用伯努利似然,然后将其估计为高斯,我使用拉普拉斯推理。下面的代码显示了我通常如何使用这种设置(使用我的自定义PjkRbf
内核(运行单个输出GP:
likelihood = GPy.likelihoods.Bernoulli()
laplace_inf = GPy.inference.latent_function_inference.Laplace()
kernel = GPy.kern.PjkRbf(X.shape[1])
m = GPy.core.GP(X, Y, kernel=kernel, likelihood=likelihood, inference_method=laplace_inf)
现在我正在尝试运行相同的设置,但作为多输出。这是我一直没能做到的。
我已经尝试将GPCoregionalizedRegression
类与ICM内核一起使用,如下代码所示:
likelihood1 = GPy.likelihoods.Bernoulli()
likelihood2 = GPy.likelihoods.Bernoulli()
laplace_inf = GPy.inference.latent_function_inference.Laplace()
K = GPy.kern.PjkRbf(X.shape[1])
icm = GPy.util.multioutput.ICM(input_dim=2,num_outputs=2,kernel=K)
m = GPy.models.GPCoregionalizedRegression([X,X],[Y1,Y2],
kernel=icm,
likelihoods_list=[likelihood1, likelihood2])
运行此代码会抛出一个带有长堆栈跟踪的AssertionError,但最后一节显示了以下内容。可能性不能断言为高斯。
~Anaconda3libsite-packagesGPylikelihoodsmixed_noise.py in gaussian_variance(self, Y_metadata)
22
23 def gaussian_variance(self, Y_metadata):
---> 24 assert all([isinstance(l, Gaussian) for l in self.likelihoods_list])
25 ind = Y_metadata['output_index'].flatten()
26 variance = np.zeros(ind.size)
AssertionError:
这是因为我无法将拉普拉斯推理传递到GPCoregionalizedRegression
模型。
有人能就我如何解决这个问题提供建议吗?或者,如果有不同的模型我可以用伯努利似然和拉普拉斯推理方法来执行多输出回归?
问题不在于您不能将拉普拉斯推理传递给GPCoregionalizedRegression
,而在于您的GPy.likelihoods.Bernoulli
可能性列表不受支持。
在文档中,它显示
大多数似然类直接继承自GPy.likelihoods.likelity,尽管GPy.likeihoods.mixed_noise.MixedNoise由GPy.likerihoods.multioutput_plikelity使用。
由于设置了多输出问题,因此潜在的可能性是GPy.likelihoods.mixed_noise.MixedNoise
对象,它在GPy中仅支持GPy.likelihoods.Gaussian
对象的列表。
在源代码中进行比较
class MixedNoise(Likelihood):
def __init__(self, likelihoods_list, name='mixed_noise'):
#NOTE at the moment this likelihood only works for using a list of gaussians
super(Likelihood, self).__init__(name=name)
因此,GPylikelihoodsmixed_noise.py
中的assert
语句将likelihood_list
项检查为Gaussian
失败,如您发布的堆栈竞赛所示。
截至目前,这项工作仍未实施。我认为GPy
的开发被认为比其继任者GPflow
的优先级更低。在那里(根据本例中使用的代码(,在我看来,对相应函数中的似然类型没有限制(即使本例再次仅使用高斯似然(