バイトのコレクションの情報エントロピーを計算するには、tydok の回答と同様のことを行う必要があります。(tydokの答えはビットのコレクションで機能します。)
次の変数は、すでに存在すると想定されています。
次のコードを Python で記述しますが、何が起こっているかは明らかです。
import math
entropy = 0
for count in byte_counts:
# If no bytes of this value were seen in the value, it doesn't affect
# the entropy of the file.
if count == 0:
continue
# p is the probability of seeing this byte in the file, as a floating-
# point number
p = 1.0 * count / total
entropy -= p * math.log(p, 256)
注意すべき重要な点がいくつかあります。
結果の値は、0 (ファイル内のすべての単一バイトが同じ) から 1 (バイトは、バイトのすべての可能な値の間で均等に分割されます) の間になります。
対数ベース 256 の使用に関する説明
このアルゴリズムは、通常、底が 2 の対数を使用して適用されるのは事実です。これにより、結果の答えがビット単位で得られます。このような場合、任意のファイルに対して最大 8 ビットのエントロピーがあります。自分で試してみてください: すべてまたはbyte_counts
のリストを作成して、入力のエントロピーを最大化してください。ファイルのバイトが均等に分散されている場合、8 ビットのエントロピーがあることがわかります。1
2
100
他の対数底を使用することができます。b =2を使用すると、各ビットが 2 つの値を持つことができるため、結果をビット単位で取得できます。b =10 を使用すると、結果はditsまたは 10 進数のビットになります。各 dit には 10 個の可能な値があるためです。b =256 を使用すると、各バイトが 256 個の離散値の 1 つを持つことができるため、バイト単位で結果が得られます。
興味深いことに、ログ ID を使用すると、結果のエントロピーを単位間で変換する方法を理解できます。ビット単位で得られた結果は、8 で割ることによってバイト単位に変換できます。興味深い意図的な副作用として、これはエントロピーを 0 から 1 の間の値として与えます。
要約すれば:
- さまざまな単位を使用してエントロピーを表現できます
- ほとんどの人はエントロピーをビット単位で表現します ( b =2)
- バイトのコレクションの場合、これにより最大エントロピーは 8 ビットになります。
- 質問者は 0 と 1 の間の結果を求めているため、この結果を 8 で割り、意味のある値を求めます。
- 上記のアルゴリズムはエントロピーをバイト単位で計算します ( b =256)
- これは (ビット単位のエントロピー) / 8 に相当します。
- これはすでに0と1の間の値を与えています