ファイルのエントロピーを計算するにはどうすればいいですか? 質問する

ファイルのエントロピーを計算するにはどうすればいいですか? 質問する

ファイルのエントロピーを計算するにはどうすればいいですか?(あるいは、単にバイトの束とだけ言っておきましょう)
アイデアはあるのですが、それが数学的に正しいかどうかはわかりません。

私の考えは次のとおりです。

  • 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 を使用することもできます)。

おすすめ記事