【发布时间】:2020-06-28 00:43:16
【问题描述】:
注意:项目是 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.. 一些东西
当我的地图出现 3 次值为 15 和 1 次出现值为 25 时,返回的熵为 0.000
这里显然有问题。我不太了解它背后的数学原理,所以我从互联网上获取了算法,但我真的很想让它发挥作用。
顺便说一句,地图是我写的。我无法提供代码(用于生产),但是:
- occ = 单个值的出现次数
- entry_count = 映射中值的数量。当出现次数增加时它不会增加,当添加新值时它会增加
据我所知,它基本上就像 C++ 地图一样工作
【问题讨论】:
-
OT:
log和log2返回double,如果你想使用float切换到logf和log2f -
感谢您的信息,我没有看原型。现在用双精度替换浮点数
-
entr从 0 开始,你只能从中减去正值,所以它总是负数或 0。 -
@dbush:熵的公式基本上是正确的。求和中的
x应该在 [0, 1] 中,因此它们的对数为零或负对数。