ファイルのエントロピーを計算するにはどうすればいいですか?(あるいは、単にバイトの束とだけ言っておきましょう)
アイデアはあるのですが、それが数学的に正しいかどうかはわかりません。
私の考えは次のとおりです。
- 256 個の整数 (すべてゼロ) の配列を作成します。
- ファイルを走査し、各バイトごとに
配列内の対応する位置を増分します。 - 最後に、配列の「平均」値を計算します。
- カウンターをゼロで初期化し、
配列の各エントリに対して、
エントリの「平均」との差をカウンターに追加します。
さて、今私は行き詰まっています。すべての結果が 0.0 から 1.0 の間になるように、カウンターの結果を「投影」するにはどうすればよいでしょうか? しかし、いずれにしてもそのアイデアは矛盾していると思います...
誰かがもっと良い、より簡単な解決策を持っているといいのですが。
注: ファイルの内容について推測するには、全体が必要です:
(プレーンテキスト、マークアップ、圧縮、またはバイナリなど)
ベストアンサー1
- 最後に、配列の「平均」値を計算します。
- カウンターをゼロで初期化し、配列の各エントリに対して、エントリの「平均」との差をカウンターに追加します。
といくつかの変更を加えると、シャノンのエントロピーが得られます。
「平均」を「エントロピー」に名前変更
(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
編集:ウェスリーが述べたように、エントロピーを8で割って調整する必要があります。0 . . 1(または、対数の底 256 を使用することもできます)。