如何在python中编写返回概率分布熵的函数



我已经在这个函数上呆了一段时间了,我的数学不太好,所以我不理解这背后的数学,如果有任何帮助,我将不胜感激。

函数应该返回标题中所说的概率分布的熵。如果它可以在不导入除计数器之外的任何模块的情况下完成,那就太好了。

下面是我到目前为止尝试过的内容,但似乎没有返回正确的答案。该函数采用由直方图制成的概率分布列表。因此,Probe I是范围256中的列表。

def CalcEntropy(prob):
ent = 0
if len(prob) <= 1:
return 0
counts = Counter()
for n in prob:
counts[n] += 1
probs = [float(c) / len(prob) for c in counts.values()]
for p in probs:
if p > 0.:
ent = p * math.log(p, 2)
return ent * -1

提前谢谢,如果我不清楚,请告诉我。

您的代码有几个问题。我不想给出一个完整的解决方案,因为这似乎是家庭作业,但我会提供一些提示:

  1. prob对于输入来说是一个糟糕的名称。在上下文中,prob的列表,而不是概率。Counter的全部目的是将这些值的出现情况制成表格,以便计算这些值出现的概率
  2. counts = Counter()毫无意义。请注意,prob不会出现在该行中。如果要将prob的计数制成表格,则需要使用prob作为Counter的输入。如果你这样做了,你可以跳过你把计数制成表格的循环。Counter的全部目的是收集这些计数
  3. ent = p * math.log(p, 2)只是在每次循环中重写ent,丢弃以前的值。您应该使用扩充赋值+=而不是简单赋值=,将ent视为一个运行总数
  4. return ent的缩进级别错误。您将在循环的第一次传递结束时返回。你不应该等到循环结束吗

最新更新