香农熵算法返回负值

Shannon's Entropy Algorithm Returning negative values

注意:项目是 C 语言,而不是 C++

float entr = 0;
for(int i = 0; i < map->entry_count; ++i)
{
    float x = (float)map->entry[i].occ / map->entry_count;
    if(x > 0)
    {
        entr -= x * log(x) / log(2);
    }
}
return entr;

当我的地图出现 3 次值为 15 时,返回的熵为 -4.214.. something

当我的地图出现 3 次值为 15 和一次出现值为 25 时,返回的熵为 0.000

这里显然有问题。我不太了解它背后的数学原理,所以我从网上找到了算法,但我真的很想让它发挥作用。

顺便说一句,地图是我写的。我无法提供代码(用于生产),但是:

据我所知,基本上它就像 C++ 映射一样工作

x * log(x)中的x应该是x的概率。这可以计算为项目出现的次数除以项目的总出现次数。但是计算出来的是map->entry[i].occ / map->entry_count;,好像是item出现的次数除以item的个数。这使它比应有的更大。

例如,如果 3 events/items/things A、B 和 C 分别出现 10、13 和 17 次,则 x 值应为 10/40、13/40 , 和 17/40,但问题中的源代码似乎使用 10/3、13/3 和 17/3。