【问题标题】:Shannon's Entropy Algorithm Returning negative values香农熵算法返回负值
【发布时间】: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] 中,因此它们的对数为零或负对数。

标签: c++ c entropy


【解决方案1】:

x * log(x) 中的x 应该是x 的项目的概率。这可以计算为项目出现的次数除以项目出现的总次数。但它被计算为map-&gt;entry[i].occ / map-&gt;entry_count;,它似乎是项目出现的次数除以项目的数量。这使它超出了应有的水平。

例如,如果 3 个事件/项目/事物 A、B 和 C 分别发生 10、13 和 17 次,则 x 值应为 10/40、13/40 和 17/ 40,但问题中的源代码似乎会使用 10/3、13/3 和 17/3。

【讨论】:

  • 我现在正在跟踪输入的值的总数,代码变成了map-&gt;entry[i].occ / map-&gt;total_entries,在提供值15 15 15 25 的情况下,这将等同于3/4 和1/4,但现在该值始终为零(不过,我可能误解了你所说的)
  • 实际上,我想我知道问题所在。我加倍太晚了,我会检查是否早点施法
猜你喜欢
  • 2021-12-02
  • 2014-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-31
  • 2013-05-14
相关资源
最近更新 更多