首页 > 解决方案 > 如何在python中编写一个返回概率分布熵的函数

问题描述

一直停留在这个功能上,我对数学不是很好,所以我不明白这背后的数学,任何帮助将不胜感激。

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

下面是我迄今为止尝试过的,但它似乎没有返回正确的答案。该函数采用由直方图制成的概率分布列表。因此,Prob 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

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

标签: pythonmath

解决方案


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

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

推荐阅读