1

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

底层内核是GPy.util.multioutput.ICM由 RationalQuadratic 内核GPy.kern.RatQuadGPy.kern.CoregionalizeKernel 组成的内核。

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

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

如何计算/获取模型每个单独输出的长度尺度值或最重要的特征?

4

1 回答 1

0

问题在于模型本身。内在共区域化模型 (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())
于 2022-02-28T08:04:48.167 回答