我已经在这个函数上呆了一段时间了,我的数学不太好,所以我不理解这背后的数学,如果有任何帮助,我将不胜感激。
函数应该返回标题中所说的概率分布的熵。如果它可以在不导入除计数器之外的任何模块的情况下完成,那就太好了。
下面是我到目前为止尝试过的内容,但似乎没有返回正确的答案。该函数采用由直方图制成的概率分布列表。因此,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
提前谢谢,如果我不清楚,请告诉我。
您的代码有几个问题。我不想给出一个完整的解决方案,因为这似乎是家庭作业,但我会提供一些提示:
prob
对于输入来说是一个糟糕的名称。在上下文中,prob
是值的列表,而不是概率。Counter
的全部目的是将这些值的出现情况制成表格,以便计算这些值出现的概率counts = Counter()
毫无意义。请注意,prob
不会出现在该行中。如果要将prob
的计数制成表格,则需要使用prob
作为Counter
的输入。如果你这样做了,你可以跳过你把计数制成表格的循环。Counter
的全部目的是收集这些计数ent = p * math.log(p, 2)
只是在每次循环中重写ent
,丢弃以前的值。您应该使用扩充赋值+=
而不是简单赋值=
,将ent
视为一个运行总数return ent
的缩进级别错误。您将在循环的第一次传递结束时返回。你不应该等到循环结束吗