GPy.GPCoregionalizedRegression 最重要的输入维度?
Most significant input dimensions for GPy.GPCoregionalizedRegression?
我已经使用 GPy
包的 GPy.models.GPCoregionalizedRegression
模型成功训练了多输出高斯过程模型。该模型有约 25 个输入和 6 个输出。
底层内核是一个 GPy.util.multioutput.ICM
内核,由一个 RationalQuadratic 内核 GPy.kern.RatQuad
和 GPy.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())
我已经使用 GPy
包的 GPy.models.GPCoregionalizedRegression
模型成功训练了多输出高斯过程模型。该模型有约 25 个输入和 6 个输出。
底层内核是一个 GPy.util.multioutput.ICM
内核,由一个 RationalQuadratic 内核 GPy.kern.RatQuad
和 GPy.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())