Tensorflow中的标准化互信息

时间:2018-10-11 19:45:17

标签: tensorflow cluster-analysis

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

我想做类似的事情:

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

1 个答案:

答案 0 :(得分:0)

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

归一化的互信息是enter image description here

可以通过以下线程估算熵H(Y):https://stats.stackexchange.com/questions/338719/calculating-clusters-entropy-python

根据定义,熵H(C)为enter image description here,其中enter image description here

条件共有信息enter image description here,其中enter image description hereenter image description here

所有涉及积分的项都可以通过采样来估计,即训练样本的平均值。总体NMI是可区分的。

我没有误解你的问题。我假设您使用的神经网络模型会输出logit,因为您未提供任何信息。然后,您需要对logit进行标准化以获取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中的数字溢出。

如果发现任何错误,请发表评论。