【问题标题】:Normalized Mutual Information in TensorflowTensorflow 中的归一化互信息
【发布时间】:2019-03-16 23:50:24
【问题描述】:

这可以在 Tensorflow 中实现标准化互信息吗?我想知道我是否可以做到这一点,以及我是否能够区分它。假设我在两个不同的张量中有预测 P 和标签 Y。有没有一种简单的方法来使用归一化互信息?

我想做类似的事情:

https://course.ccs.neu.edu/cs6140sp15/7_locality_cluster/Assignment-6/NMI.pdf

【问题讨论】:

  • 如果你使用模型中的连续预测,仔细地对它们进行归一化(例如,使用 softmax),以便它们解释为在每个类中的概率,那么答案是肯定的,并且可以区分它们。如果将输出离散化,则它们是不可微的。谷歌交叉熵损失,了解如何计算连续 P 和离散 Y 之间的条件熵。
  • 我认为你误解了我的问题。我想根据聚类标签和真实标签在我的图表中进行预测,而不是基于我的 logits 和真实标签。为了说明这一点:argmax(logits) = [4, 4, 3, 3, 2, 2, 1, 1] argmax(labels) = [1, 1, 2, 2, 3, 3, 4, 4]在这个例子中,交叉熵为 0,但是,聚类仍然非常好,因为我们将相同的类实例放在同一个集群中。标准化互信息给了我这个,但我不知道如何在 Tensorflow 中使用它。

标签: tensorflow cluster-analysis


【解决方案1】:

假设您的聚类方法给出概率预测/隶属函数p(c|x),例如,p(c=1|x)x 在第一个聚类中的概率。假设 y 是 x 的地面实况类标签。

归一化的互信息为

熵 H(Y) 可以通过这个帖子来估计:https://stats.stackexchange.com/questions/338719/calculating-clusters-entropy-python

根据定义,熵 H(C) 为,其中

条件互信息 where , and .

所有涉及积分的项都可以使用抽样来估计,即训练样本的平均值。整体 NMI 是可微的。

我没有误解你的问题。我假设您使用了一个输出 logits 的神经网络模型,因为您没有提供任何信息。然后你需要对 logits 进行归一化以获得p(c|x)

可能还有其他方法可以估计 NMI,但如果您将使用的任何模型的输出离散化,则无法区分它们。


TensorFlow 代码

假设我们有标签矩阵p_y_on_x 和聚类预测p_c_on_x。其中每一行对应一个观察x;每列对应于每个类和簇中x 的概率(因此每一行总和为一个)。进一步假设p(x)p(x|y) 的概率一致。

那么 NMI 可以估计如下:

p_y = tf.reduce_sum(p_y_on_x, axis=0, keepdim=True) / num_x  # 1-by-num_y
h_y = -tf.reduce_sum(p_y * tf.math.log(p_y))
p_c = tf.reduce_sum(p_c_on_x, axis=0) / num_x  # 1-by-num_c
h_c = -tf.reduce_sum(p_c * tf.math.log(p_c))
p_x_on_y = p_y_on_x / num_x / p_y  # num_x-by-num_y
p_c_on_y = tf.matmul(p_c_on_x, p_x_on_y, transpose_a=True)  # num_c-by-num_y
h_c_on_y = -tf.reduce_sum(tf.reduce_sum(p_c_on_y * tf.math.log(p_c_on_y), axis=0) * p_y)
i_y_c = h_c - h_c_on_y
nmi = 2 * i_y_c / (h_y + h_c)

在实践中,请注意概率,因为它们应该是正数,以避免tf.math.log 中的数字溢出。

如果发现有错误请评论。

【讨论】:

  • 感谢您的回复。我仍然不知道我应该使用什么 Tensorflow 代码来获得它。假设我有两个名为“labels”和“logits”的张量。计算 NMI 的代码是什么?
  • 我无法理解第 5 行中的变量标签指的是什么。
  • @Siavash 我的错。最初,我使用labelcluster,然后我认为p_y_on_xp_c_on_x 会更清楚。我已经修改了那部分并验证了当p_y_on_xp_c_on_x独立时,nmi接近于零。
  • 谢谢。当我给出与标签和预测相同的向量时,我应该得到 1,但这不会发生。你知道是什么原因吗?
  • @Siavash 我假设“相同向量”是指p_y_on_x=p_c_on_x,它不同于p(y=c|x)=1。后者意味着yc 具有完全相同的观察结果。在这种情况下,每个样本x 以概率 1 分配给一个类和同一个集群。如果您用单个 1 和其余的零初始化每个 p_y_on_x,例如[1e-6, 1e-6, 1, 1e-6](此处为小标量以避免数字问题),并分配p_c_on_x=p_y_on_x,您应该能够得到非常接近1的nmi
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-16
  • 1970-01-01
  • 1970-01-01
  • 2019-05-01
  • 2018-05-27
  • 1970-01-01
  • 2017-07-24
相关资源
最近更新 更多