如何在PyTorch(可微估计器)中计算互信息

问题描述 投票:0回答:3

我正在用pytorch训练一个模型,我需要计算两个张量之间的依赖程度(假设它们是两个张量,每个张量都包含非常接近零或一的值,例如 v1 = [0.999, 0.998, 0.001, 0.98 ] 和 v2 = [0.97, 0.01, 0.997, 0.999]) 作为我的损失函数的一部分。我正在尝试计算互信息,但我在 PyTorch 中找不到任何互信息估计实现。哪里有提供这样的东西吗?

pytorch entropy mutual-information
3个回答
1
投票

互信息是针对分布定义的,而不是针对单个点定义的。因此,我将假设 v1 和 v2 是来自分布 p 的样本来编写下一部分。我还认为你有来自 p 的 n 个样本,n>1。

您需要一种方法来估计样本中的互信息。有很多方法可以做到这一点。最简单的方法之一是使用非参数估计器,例如 NPEET (https://github.com/gregversteeg/NPEET)。它与 numpy 一起使用(您可以为此从 torch 转换为 numpy)。还有更多涉及的参数模型,您可以在 pytorch 中找到实现(请参阅https://arxiv.org/abs/1905.06922)。

如果您只有两个向量并想要计算相似性度量,则点积相似性比互信息更合适,因为没有分布。


0
投票

官方 Pytorch 代码中没有提供,但这里有一个 Pytorch 实现,它使用 核密度估计 进行直方图近似。请注意,此方法是完全可微的。

或者,如果您出于某种原因想要更多控制,也可以使用 Kornia 中的可微直方图函数自行计算 MI 指标。


0
投票

Torchmetrics 有 MutualInfoScore

他们文档中的示例:

>>> import torch
>>> from torchmetrics.clustering import MutualInfoScore
>>> preds = torch.tensor([2, 1, 0, 1, 0])
>>> target = torch.tensor([0, 2, 1, 1, 0])
>>> mi_score = MutualInfoScore()
>>> mi_score(preds, target)
tensor(0.5004)

功能性:

>>> from torchmetrics.functional.clustering import mutual_info_score
>>> target = torch.tensor([0, 3, 2, 2, 1])
>>> preds = torch.tensor([1, 3, 2, 0, 1])
>>> mutual_info_score(preds, target)
tensor(1.0549)
© www.soinside.com 2019 - 2024. All rights reserved.