香农熵算法返回负值
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
这里显然有问题。我不太了解它背后的数学原理,所以我从网上找到了算法,但我真的很想让它发挥作用。
顺便说一句,地图是我写的。我无法提供代码(用于生产),但是:
- occ = 单个值出现的次数
- entry_count = 地图中值的数量。当出现次数增加时它不会增加,当添加新值时它会增加
据我所知,基本上它就像 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。
注意:项目是 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
这里显然有问题。我不太了解它背后的数学原理,所以我从网上找到了算法,但我真的很想让它发挥作用。
顺便说一句,地图是我写的。我无法提供代码(用于生产),但是:
- occ = 单个值出现的次数
- entry_count = 地图中值的数量。当出现次数增加时它不会增加,当添加新值时它会增加
据我所知,基本上它就像 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。