是否可以在Tensorflow中实现规范化的互信息?我想知道我是否可以做到这一点,是否能够与众不同。假设我有两个不同张量的预测P和标记Y。有没有一种简单的方法来使用标准化的互信息?
我想做类似的事情:
https://course.ccs.neu.edu/cs6140sp15/7_locality_cluster/Assignment-6/NMI.pdf
答案 0 :(得分:0)
假设您的聚类方法给出了概率预测/隶属度函数p(c|x)
,例如p(c=1|x)
是第一个聚类中x
的概率。假设y是x
的地面真理类标签。
可以通过以下线程估算熵H(Y):https://stats.stackexchange.com/questions/338719/calculating-clusters-entropy-python
所有涉及积分的项都可以通过采样来估计,即训练样本的平均值。总体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
中的数字溢出。
如果发现任何错误,请发表评论。