我正在学习如何使用tensorflow,在实现自定义损失函数时遇到了问题。具体来说,我正在尝试计算所有变量对之间的平均相互信息(这种想法是确定一类的哪些预测与另一类紧密相关)。
例如,如果我有一个数组
# In simple case, 2 entries of data showing predictions for non-exclusive
# properties A, B, C, and D in that order.
data = np.array([[0.99, 0.05, 0.85, 0.2], [0.97, 0.57, 0.88, 0.1]])
我想返回一个张量,该张量显示A和B,A和C,A和D,B和A等之间的相互信息。其中A是每个行向量的第一个元素,B是第二个等等。我也可以只获取每个变量的平均成对互信息(例如,MI(A,B),MI(A,C)和MI(A,D)的平均值)
我这样做的方法是,计算每对变量的行之间的熵,然后减去每个变量的熵。
作为起点,我查看了用于计算两个变量的协方差的现有代码:
def tf_cov(x):
mean_x = tf.reduce_mean(x, axis=0, keepdims=True)
mx = tf.matmul(tf.transpose(mean_x), mean_x)
vx = tf.matmul(tf.transpose(x), x)/tf.cast(tf.shape(x)[0], tf.float32)
cov_xx = vx - mx
return cov_xx
这是如何获取成对统计信息的一个很好的示例,但它并不能为我提供想要的指标。
我也能够计算单个变量的熵:
def tf_entropy(prob_a):
# Calculates the entropy along each column
col_entropy = tf.reduce_sum(prob_a * tf.log(prob_a), axis=0)
return col_entropy
有人知道计算配对熵的好方法吗?我想它看起来很像matmul,但是我将对熵进行计算,而不是对每个元素的乘积求和。当然,如果您知道现有的tensorflow函数已经可以执行我想要的操作,那就太好了。我一直在阅读各种与熵相关的函数,但是它们似乎并不是我想要的。