4

我已经在 python 中使用和实现了互信息公式pandasnumpy

def mutual_info(p):
    p_x=p.sum(axis=1)
    p_y=p.sum(axis=0)
    I=0.0
    for i_y in p.index:
        for i_x in p.columns:
           I+=(p.ix[i_y,i_x]*np.log2(p.ix[i_y,i_x]/(p_x[i_y]*p[i_x]))).values[0]
    return I

但是,如果一个单元格p的概率为零,np.log2(p.ix[i_y,i_x]/(p_x[i_y]*p[i_x]))则为负无穷大,整个表达式乘以零并返回NaN

解决这个问题的正确方法是什么?

4

1 回答 1

3

出于各种理论和实践原因(例如,请参阅竞争分布估计:为什么好的图灵好),您可能会考虑永远不要使用对数损失度量的零概率。

所以,比如说,如果你有一个概率向量p,那么对于一些小的标量α > 0,你会使用α 1 + (1 - α) p(这里第一个 1 是统一向量)。不幸的是,没有选择α的一般准则,您必须在计算过程中进一步评估这一点。

对于 Kullback-Leibler 距离,您当然会将其应用于每个输入。

于 2016-01-16T20:52:36.137 回答