在python中计算互信息会返回nan

时间:2016-01-16 20:37:54

标签: python pandas nan information-theory

我使用pandasnumpy

在python中实现了mutual information公式
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

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

1 个答案:

答案 0 :(得分:3)

出于各种理论和实践原因(例如,请参阅Competitive Distribution Estimation: Why is Good-Turing Good),您可能会认为从不使用零丢失度量的概率。

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

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