Tensorflow 中的标准化互信息
Normalized Mutual Information in Tensorflow
是否可以在Tensorflow中实现归一化互信息?我想知道我是否可以做到这一点,以及我是否能够区分它。假设我在两个不同的张量中有预测 P 和标签 Y。有没有简单的方法来使用归一化互信息?
我想做类似的事情:
https://course.ccs.neu.edu/cs6140sp15/7_locality_cluster/Assignment-6/NMI.pdf
假设您的聚类方法给出概率 predictions/membership 函数 p(c|x)
,例如,p(c=1|x)
是第一个聚类中 x
的概率。假设 y 是 x
.
的基本事实 class 标签
标准化互信息为。
熵 H(Y) 可以按照这个线程进行估计:https://stats.stackexchange.com/questions/338719/calculating-clusters-entropy-python
根据定义,熵H(C)为, where .
条件互信息 where , and .
所有涉及积分的项都可以使用采样进行估计,即训练样本的平均值。整体 NMI 是可微分的。
我没有误解你的问题。我假设你使用了一个输出 logits 的神经网络模型,因为你没有提供任何信息。然后你需要规范化 logits 以获得 p(c|x)
.
可能有其他方法可以估计 NMI,但是如果您对所使用的任何模型的输出进行离散化,则无法区分它们。
TensorFlow 代码
假设我们有标签矩阵 p_y_on_x
和聚类预测 p_c_on_x
。它们的每一行对应一个观察x
;每列对应于每个 class 和集群中 x
的概率(因此每行总和为 1)。进一步假设 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中实现归一化互信息?我想知道我是否可以做到这一点,以及我是否能够区分它。假设我在两个不同的张量中有预测 P 和标签 Y。有没有简单的方法来使用归一化互信息?
我想做类似的事情:
https://course.ccs.neu.edu/cs6140sp15/7_locality_cluster/Assignment-6/NMI.pdf
假设您的聚类方法给出概率 predictions/membership 函数 p(c|x)
,例如,p(c=1|x)
是第一个聚类中 x
的概率。假设 y 是 x
.
标准化互信息为
熵 H(Y) 可以按照这个线程进行估计:https://stats.stackexchange.com/questions/338719/calculating-clusters-entropy-python
根据定义,熵H(C)为
条件互信息
所有涉及积分的项都可以使用采样进行估计,即训练样本的平均值。整体 NMI 是可微分的。
我没有误解你的问题。我假设你使用了一个输出 logits 的神经网络模型,因为你没有提供任何信息。然后你需要规范化 logits 以获得 p(c|x)
.
可能有其他方法可以估计 NMI,但是如果您对所使用的任何模型的输出进行离散化,则无法区分它们。
TensorFlow 代码
假设我们有标签矩阵 p_y_on_x
和聚类预测 p_c_on_x
。它们的每一行对应一个观察x
;每列对应于每个 class 和集群中 x
的概率(因此每行总和为 1)。进一步假设 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
.
如有错误欢迎评论