问题在于模型本身。内在共区域化模型 (ICM) 的设置使得所有输出都由共享的潜在“潜在”高斯过程确定。因此,调用模型只能为您提供一组对所有输出都很重要的输入维度get_most_significant_input_dimension()
。GPy.models.GPCoregionalizationRegression
解决方案是使用GPy.util.multioutput.LCM
模型内核,它被定义为 ICM 内核与单个(潜在)GP 内核列表的总和。它的工作原理如下
import GPy
# Your data
# x = ...
# y = ...
# # ICM case
# kernel = GPy.util.multioutput.ICM(input_dim=x.shape[1],
# num_outputs=y.shape[1],
# kernel=GPy.kern.RatQuad(input_dim=x.shape[1], ARD=True))
# LCM case
k_list = [GPy.kern.RatQuad(input_dim=x.shape[1], ARD=True) for _ in range(y.shape[1])]
kernel = GPy.util.multioutput.LCM(input_dim=x.shape[1], num_outputs=y.shape[1],
W_rank=rank, kernels_list=k_list)
需要对数据进行整形(这对于 ICM 模型也是必要的,因此与此问题的范围无关,请参阅此处了解详细信息)
# Reshaping data to fit GPCoregionalizedRegression
xx = reshape_for_coregionalized_regression(x)
yy = reshape_for_coregionalized_reshaping(y)
m = GPy.models.GPCoregionalizedRegression(xx, yy, kernel=kernel)
m.optimize()
在收敛优化之后,可以调用get_most_significant_input_dimension()
单个潜在 GP(此处为 output 0
)。
sig_inputs_0 = m.sum.ICM0.get_most_significant_input_dimensions()
或遍历所有内核
sig_inputs = []
for part in self.gpy_model.kern.parts:
sig_inputs.append(part.get_most_significant_input_dimensions())