Shannon的熵在一个包含零的数组上

时间:2018-04-23 04:44:41

标签: python pandas entropy

我使用以下代码在表示概率分布的数组上返回Shannon的熵。

A = np.random.randint(10, size=10)

pA = A / A.sum()
Shannon2 = -np.sum(pA*np.log2(pA))

如果数组不包含任何零,则此方法可以正常工作。

示例:

Input: [2 3 3 3 2 1 5 3 3 4]
Output: 3.2240472715

但是,如果数组确实包含零,则Shannon熵会产生纳米

示例:

Input:[7 6 6 8 8 2 8 3 0 7]
Output: nan

我得到两个RuntimeWarnings:

1)运行时警告:在log2

中遇到零除

2)RuntimeWarning:在乘法中遇到无效值

有没有办法改变代码以包含零?我不确定是否完全移除它们会影响结果。具体而言,如果由于分布频率较高而导致变化较大。

2 个答案:

答案 0 :(得分:2)

我认为您希望使用nansum将nans计为零:

A = np.random.randint(10, size=10)
pA = A / A.sum()
Shannon2 = -np.nansum(pA*np.log2(pA))

答案 1 :(得分:0)

最简单和最常用的方法是忽略零概率并计算剩余值的香农熵。

  

尝试以下方法:

import numpy as np
A = np.array([1.0, 2.0, 0.0, 5.0, 0.0, 9.0])
A = np.array(filter(lambda x: x!= 0, A))
pA = A / A.sum()
Shannon2 = -np.sum(pA * np.log2(pA))