78

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

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

  • 256 個の整数 (すべてゼロ) の配列を作成します。
  • ファイルをトラバースし、そのバイトごとに
    、配列内の対応する位置をインクリメントします。
  • 最後に: 配列の「平均」値を計算します。
  • カウンタをゼロで初期化し
    、配列のエントリごとに、
    「平均」に対するエントリの差をカウンタに追加します。

さて、今私は立ち往生しています。すべての結果が 0.0 と 1.0 の間にあるようにカウンターの結果を「投影」する方法は? しかし、私は確信しています、とにかくその考えは矛盾しています...

誰かがより良くて簡単な解決策を持っていることを願っていますか?

注:ファイルの内容を推測するには、すべてが必要です:(
プレーンテキスト、マークアップ、圧縮またはバイナリなど)

4

12 に答える 12

51
  • 最後に: 配列の「平均」値を計算します。
  • カウンタをゼロで初期化し、配列のエントリごとに、「平均」に対するエントリの差をカウンタに追加します。

いくつかの変更により、シャノンのエントロピーを取得できます。

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

(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 が述べたように、エントロピーを0 の範囲で調整するには、エントロピーを 8 で割る必要があります。. 1 (または、対数の底 256 を使用することもできます)。

于 2009-06-13T11:05:41.047 に答える
34

より簡単な解決策: ファイルを gzip します。ファイル サイズの比率を使用します: (gzip のサイズ)/(オリジナルのサイズ) をランダム性 (つまりエントロピー) の尺度として使用します。

この方法では、エントロピーの正確な絶対値は得られませんが (gzip は「理想的な」コンプレッサーではないため)、異なるソースのエントロピーを比較する必要がある場合には十分です。

于 2009-06-13T10:38:46.913 に答える
33

バイトのコレクションの情報エントロピーを計算するには、tydok の回答と同様のことを行う必要があります。(tydokの答えはビットのコレクションで機能します。)

次の変数は、すでに存在すると想定されています。

  • byte_countsファイル内の各値のバイト数の 256 要素リストです。たとえば、byte_counts[2]は値 を持つバイト数です2

  • totalファイルの合計バイト数です。

次のコードを 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)

注意すべき重要な点がいくつかあります。

  • のチェックcount == 0は単なる最適化ではありません。If count == 0、 then p == 0、および log( p ) は未定義 (「負の無限大」) になり、エラーが発生します。

  • への256呼び出しのmath.logは、可能な離散値の数を表します。8 ビットで構成されるバイトには、256 の可能な値があります。

結果の値は、0 (ファイル内のすべての単一バイトが同じ) から 1 (バイトは、バイトのすべての可能な値の間で均等に分割されます) の間になります。


対数ベース 256 の使用に関する説明

このアルゴリズムは、通常、底が 2 の対数を使用して適用されるのは事実です。これにより、結果の答えがビット単位で得られます。このような場合、任意のファイルに対して最大 8 ビットのエントロピーがあります。自分で試してみてください: すべてまたはbyte_countsのリストを作成して、入力のエントロピーを最大化してください。ファイルのバイトが均等に分散されている場合、8 ビットのエントロピーがあることがわかります。12100

他の対数底を使用することができます。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の間の値を与えています
于 2009-06-13T13:14:32.720 に答える
10

ファイルのエントロピーなどというものはありません。情報理論では、エントロピーは確率変数の関数であり、固定データ セットの関数ではありません (技術的には、固定データ セットにはエントロピーがありますが、そのエントロピーは 0 になります。データをランダムな分布と見なすことができます。確率 1 で可能な結果は 1 つだけです)。

エントロピーを計算するには、ファイルをモデル化する確率変数が必要です。エントロピーは、その確率変数の分布のエントロピーになります。このエントロピーは、その確率変数に含まれる情報のビット数に等しくなります。

于 2009-06-13T20:47:43.707 に答える
5

情報理論エントロピーを使用する場合は、バイトで使用しない方がよいことに注意してください。たとえば、データが float で構成されている場合、代わりに確率分布をそれらの float に当てはめ、その分布のエントロピーを計算する必要があります。

または、ファイルの内容が Unicode 文字の場合は、それらを使用する必要があります。

于 2009-06-13T11:33:43.710 に答える
2

Re:ファイルの内容を推測するには、すべてが必要です: (プレーンテキスト、マークアップ、圧縮またはバイナリなど...)

他の人が指摘したように(または混乱/気を散らされた)、実際にはメトリックエントロピー(エントロピーをメッセージの長さで割ったもの)について話していると思います。詳細については、エントロピー (情報理論) - Wikipediaを参照してください。

エントロピー異常のデータのスキャンにリンクしているジッターのコメントは、根本的な目標に非常に関連しています。それは最終的にlibdisorder (バイトエントロピーを測定するための C ライブラリ) にリンクします。このアプローチは、ファイルのさまざまな部分でメトリック エントロピーがどのように変化するかを示しているため、作業するためのより多くの情報を提供するように思われます。たとえば、4 MB の jpg 画像 (y 軸) からの 256 連続バイトのブロックのエントロピーが異なるオフセット (x 軸) でどのように変化するかを示すこのグラフを参照してください。最初と最後ではエントロピーは途中で低くなりますが、ほとんどのファイルで 1 バイトあたり約 7 ビットです。

ここに画像の説明を入力 ソース: https://github.com/cyphunk/entropy_examples . [このグラフやその他のグラフは、新しいhttp://nonwhiteheterosexualmalelicense.orgライセンスを介して利用できることに注意してください.... ]

さらに興味深いのは、FAT でフォーマットされたディスクのバイト エントロピーを分析する |の分析と同様のグラフです。GL.IB.LY

ファイル全体および/またはファイルの最初と最後のブロックのメトリック エントロピーの最大、最小、モード、標準偏差などの統計は、署名として非常に役立つ場合があります。

この本も関連していると思われます:電子メールとデータ セキュリティのためのファイル マスカレードの検出と認識 - Springer

于 2016-02-11T20:05:19.817 に答える
-2

追加情報がなければ、ファイルのエントロピーは (定義により) そのサイズ * 8 ビットに等しくなります。次の場合、テキスト ファイルのエントロピーはおよそサイズ * 6.6 ビットです。

  • 各キャラクターの確率は同じ
  • バイトで 95 の印刷可能な文字があります。
  • ログ (95)/ログ (2) = 6.6

英語のテキスト ファイルのエントロピーは、1 文字あたり約 0.6 ~ 1.3 ビットと推定されます (ここで説明されているように)。

一般に、特定のファイルのエントロピーについて話すことはできません。エントロピーは一連のファイルのプロパティです。

エントロピー (または正確にはバイトあたりのエントロピー) が必要な場合、最善の方法は、gzip、bz2、rar、またはその他の強力な圧縮を使用して圧縮し、圧縮サイズを非圧縮サイズで割ることです。これは、エントロピーの優れた推定値になります。

Nick Dandoulakis が提案したようにバイトごとにエントロピーを計算すると、すべてのバイトが独立していると仮定されるため、非常に貧弱な見積もりが得られます。たとえば、テキスト ファイルでは、通常、単語は 2 文字よりも長いため、文字の後に空白や句読点を配置するよりも、文字の後に小文字を配置する可能性の方がはるかに高くなります。したがって、次の文字が z 範囲内にある確率は、前の文字の値と相関しています。実際のデータには Nick の大まかな見積もりを使用しないでください。代わりに gzip 圧縮率を使用してください。

于 2013-12-31T13:02:26.677 に答える