python returns nan 计算互信息

Calculating mutual information in python returns nan

我使用 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]))为负无穷大,整个表达式乘以零和returns NaN .

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

出于各种理论和实践原因(例如,参见竞争分布估计: 为什么 Good-Turing 好),您可能会考虑 从不 使用零概率和对数损失度量。

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

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