python - 如何在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
提前谢谢,如果我不清楚,请告诉我。
解决方案
您的代码有几个问题。我不想给出一个完整的解决方案,因为这似乎是家庭作业,但我会提供一些提示:
prob
输入的名称很糟糕。在上下文中,prob
是一个值列表,而不是概率。的全部要点Counter
是将这些值的出现制成表格,以便您可以计算这些值出现的概率。counts = Counter()
没有意义。请注意,prob
不会出现在该行中。如果您想将 的计数制成表格prob
,则需要将其prob
用作 的输入Counter
。如果这样做,您可以跳过将计数制成表格的循环。的全部意义Counter
在于收集这些计数。ent = p * math.log(p, 2)
只需ent
在每次循环中重写,丢弃以前的值。您应该将其ent
视为运行总计,使用扩充分配+=
,而不是简单分配 ,=
。return ent
有错误的缩进级别。您将在第一次循环结束时返回。你不应该等到循环结束吗?
推荐阅读
- java - 我自己的 Android 应用程序导致我的手机崩溃
- javascript - 单击提交按钮打开打印预览
- python - pandas_datareader.DataReader 只返回一个日期的数据
- accessibility - 默认情况下如何激活 MathJax 可访问性?
- java - jparepository 未在服务中自动装配
- python - 如何使用 keras 进行多标签多类分类
- c++ - QTableWidget 信号上的无限循环 (cellChanged)
- asp.net-core - Automapper 映射的属性名称错误,或者我做错了什么
- ios - SwiftUI 打开带有数据或仅引用 Firestore 文档的视图
- r - 使用 R(和 dplyr)创建包含因子信息的多个汇总表