algorithm - 如何计算文件的熵?

标签 algorithm file-io entropy

如何计算文件的熵? (或者我们只说一堆字节)
我有一个想法,但我不确定它在数学上是否正确。

我的想法是:

  • 创建一个包含 256 个整数(全为零)的数组。
  • 遍历文件及其每个字节,
    递增数组中的相应位置。
  • 最后:计算数组的“平均”值。
  • 用零初始化一个计数器,
    对于数组的每个条目:
    添加条目的差异 到柜台“平均”。

好吧,现在我卡住了。如何以这种方式“转换”计数器结果 所有结果都在 0.0 和 1.0 之间?但我敢肯定, 无论如何,这个想法是不一致的......

我希望有人有更好更简单的解决方案?

注意:我需要整个过程来对文件内容做出假设:
(纯文本、标记、压缩或某些二进制文件,...)

最佳答案

  • At the end: Calculate the "average" value for the array.
  • Initialize a counter with zero, and for each of the array's entries: add the entry's difference to "average" to the counter.

通过一些修改,您可以获得香农熵:

将“平均”重命名为“熵”

(float) entropy = 0
for i in the array[256]:Counts do 
  (float)p = Counts[i] / filesize
  if (p > 0) entropy = entropy - p*lg(p) // lgN is the logarithm with base 2

编辑: 正如 Wesley 提到的,我们必须将熵除以 8 才能在 0 范围内调整它。 . 1(或者,我们可以使用以 256 为底的对数)。

关于algorithm - 如何计算文件的熵?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/990477/

相关文章:

python - 从任何地方打开(文件)

fork - J语言熵公式

python - n-gram 马尔可夫链转换表

寻找共现矩阵的算法

java - 我如何找出 java.io.File.mkdir() 返回 false 的原因

c# - 添加或小时总和,如 13 :30+00:00:20=13:30:20 but how?

matlab - 在 MATLAB 中使用 textscan() 时忽略“字符

Matlab-直方图熵的比较

algorithm - 设计一种有效的算法,在少于 8 次比较的情况下对 5 个不同的键进行排序

algorithm - 如何按数值对数字进行排名?