相互信息的Tensorflow成对自定义损失

时间:2018-10-23 17:56:43

标签: python tensorflow entropy loss-function

我正在学习如何使用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函数已经可以执行我想要的操作,那就太好了。我一直在阅读各种与熵相关的函数,但是它们似乎并不是我想要的。

1 个答案:

答案 0 :(得分:0)

如果要计算X和Y之间的相互信息,则取决于您可以做出的基本假设。如果您有非常高的维度数据和复杂的分布,建议使用非参数合并。还有一些我正在使用的更复杂的方法。 参见hereherehere

前两个的缩放比例并不太好,最后一个涉及一些超参数调整,可以使您的数值完全消失(或者我做错了),但是缩放比例相对较好。