1. ホーム
  2. algorithm

ファイルのエントロピーの計算方法は?

2023-10-05 16:12:44

質問

ファイルのエントロピーを計算する方法を教えてください。 (あるいは単にバイトの束としましょう)

思いついたのですが、数学的に正しいかどうかわかりません。

私の考えは次のようなものです。

  • 256個の整数(すべて0)の配列を作成します。
  • ファイルをトラバースして、その各バイトについて。

    配列の対応する位置をインクリメントします。
  • 最後に 配列の平均値を計算します。
  • カウンタをゼロで初期化する。

    とし、配列の各エントリに対して

    そのエントリの差分 をカウンタに追加します。

さて、今私は行き詰っています。すべての結果が 0.0 と 1.0 の間になるような方法でカウンターの結果を投影するにはどうすればよいでしょうか。 どのようにすれば、すべての結果が 0.0 と 1.0 の間になるのでしょうか? しかし、私は確信しています。 というのは矛盾していますね...。

もっとシンプルで良い解決策があるといいのですが。

注意: 私はファイルのコンテンツについて仮定するために、全体が必要です。


(プレーンテキスト、マークアップ、圧縮またはバイナリ、...)

どのように解決するのですか?

<ブロッククオート
  • 最後に 配列のquot;平均値"を計算します。
  • カウンタをゼロで初期化する。 そして、配列の各エントリについて。 エントリの平均値との差をカウンタに追加します。

とともに いくつかの を変更すると、シャノンのエントロピーを得ることができます。

平均をエントロピーに改名。

(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を使うこともできます)。