GPy.GPCoregionalizedRegression 最重要的输入维度?

Most significant input dimensions for GPy.GPCoregionalizedRegression?

我已经使用 GPy 包的 GPy.models.GPCoregionalizedRegression 模型成功训练了多输出高斯过程模型。该模型有约 25 个输入和 6 个输出。

底层内核是一个 GPy.util.multioutput.ICM 内核,由一个 RationalQuadratic 内核 GPy.kern.RatQuadGPy.kern.Coregionalize 内核组成。

我现在对每个单独输出的特征重要性感兴趣。 RatQuad内核提供了一个ARD=True(Automatic Relevance Determination)关键字,它允许获取其输出对于单个输出模型的特征重要性(GPy模型的get_most_significant_input_dimension()方法也利用了这一点) .

但是,在 GPy.models.GPCoregionalizedRegression 模型上调用 get_most_significant_input_dimension() 方法给出了一个索引列表,我认为这些索引是 all 最重要的输入输出。

如何 calculate/obtain 模型的 每个个体 输出的长度尺度值或最重要的特征?

问题出在模型本身。内部共区域化模型 (ICM) 的设置使得所有输出均由共享的底层“潜在”高斯过程确定。因此,在 GPy.models.GPCoregionalizationRegression 模型上调用 get_most_significant_input_dimension() 只能为您提供一组对所有输出都很重要的输入维度。

解决方案是使用 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 模型也是必要的,因此与本问题的范围无关,详情请参阅 here

# 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()

收敛优化后,可以在单个潜在 GP 上调用 get_most_significant_input_dimension()(此处输出 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())