【问题标题】:Shannon's Entropy on an array containing zero's包含零的数组上的香农熵
【发布时间】:2018-04-23 04:44:41
【问题描述】:

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

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

但是,如果数组确实包含零,香农熵会产生 nan

例子:

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

我确实收到了两个 RuntimeWarnings:

1) RuntimeWarning: log2中遇到除以零

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

有没有办法更改代码以包含零?我只是不确定完全删除它们是否会影响结果。具体来说,如果分布频率越高,变化越大。

【问题讨论】:

  • 在计算的后面部分删除零并不等于忽略零。零的影响来自pA = A / A.sum()。由于存在零,A.sum() 的结果更小。

标签: python pandas entropy


【解决方案1】:

我认为您想使用nansum 将 nan 计数为零:

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

【讨论】:

【解决方案2】:

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

尝试以下方法:

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))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-02
    • 2014-03-31
    • 2013-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-07
    • 2012-10-31
    相关资源
    最近更新 更多