これを行う標準的な方法はありますか?
グーグル- "approximate entropy" bits -複数の学術論文を明らかにしますが、任意の長さの指定されたビット文字列のおおよそのエントロピーを定義する擬似コードのチャンクを見つけたいと思います。
(これは言うより簡単で、アプリケーションによって異なりますが、私のアプリケーションには16,320ビットの暗号化データ(暗号文)が含まれています。しかし、パズルとして暗号化されており、解読することは不可能ではありません。最初に、エントロピーですが、そのような適切な定義を簡単に見つけることができませんでした。そのため、StackOverflowにあるべき質問のように思われました!16kのランダムに見えるビットの暗号化解除をどこから始めるかについてのアイデアも歓迎します...)
この関連質問も参照してください:
コンピュータサイエンスのエントロピーの定義は何ですか?
答えは文字列の Kolmogorov Complexity だと思います。これは疑似コードのチャンクでは答えられないだけでなく、コルモゴロフの複雑さは 計算可能な関数 ではありません!
実際にできることの1つは、利用可能な最良の データ圧縮 アルゴリズムでビット文字列を圧縮することです。圧縮するほど、エントロピーは低くなります。
エントロピーは、取得した文字列のプロパティではなく、代わりに取得した文字列のプロパティです。つまり、文字列が生成されたprocessを修飾します。
単純なケースでは、[〜#〜] n [〜#〜]可能な文字列のセットから1つの文字列を取得します。各文字列は、他の文字列と同じ確率で選択されます。つまり、 1/N。この状況では、文字列は[〜#〜] n [〜#〜]のエントロピーを持つと言われています。エントロピーは多くの場合、対数スケールであるビットで表されます。「n bits」のエントロピーは2ん。
たとえば、パスワードを2つの小文字、2つの数字、2つの小文字、最後に2つの数字として生成したいとします(例:va85mw24
)。文字と数字はランダムに、均一に、そして互いに独立して選択されます。このプロセスでは、26 * 26 * 10 * 10 * 26 * 26 * 10 * 10 = 4569760000個の異なるパスワードが生成される可能性があり、これらのすべてのパスワードが選択される可能性は同じです。そのようなパスワードのエントロピーは4569760000であり、これは約32.1ビットを意味します。
シャノンのエントロピー方程式 は、標準的な計算方法です。 Pythonでの単純な実装を以下に示します Revelation コードベースから恥ずかしくない形でコピーされたため、GPLライセンス:
import math
def entropy(string):
"Calculates the Shannon entropy of a string"
# get probability of chars in string
prob = [ float(string.count(c)) / len(string) for c in dict.fromkeys(list(string)) ]
# calculate the entropy
entropy = - sum([ p * math.log(p) / math.log(2.0) for p in prob ])
return entropy
def entropy_ideal(length):
"Calculates the ideal Shannon entropy of a string with given length"
prob = 1.0 / length
return -1.0 * length * prob * math.log(prob) / math.log(2.0)
この実装は、入力ビットストリームがバイトとして最もよく表されると想定していることに注意してください。これは、問題のドメインの場合とそうでない場合があります。あなたが本当に望んでいるのは、ビットストリームを数値の文字列に変換したものです。これらの数値が何であるかをどのように決定するかはドメイン固有です。数値が本当に1と0の場合、ビットストリームを1と0の配列に変換します。ただし、選択した変換方法は、得られる結果に影響します。
単一の答えはありません。エントロピーは常にいくつかのモデルに関連しています。エントロピーが制限されたパスワードについて誰かが話すとき、それらは「インテリジェントな攻撃者が予測する能力に関連する」ことを意味し、それは常に上限です。
問題は、モデルを見つけるためにエントロピーを測定しようとしていることです。それは不可能です。エントロピー測定からわかることは、モデルがどれほど優れているかです。
そうは言っても、試すことができるかなり一般的なモデルがいくつかあります。それらは圧縮アルゴリズムと呼ばれます。 gzipがデータを適切に圧縮できる場合、データを適切に予測できるモデルが少なくとも1つ見つかりました。また、gzipは、たとえば、単純な置換の影響をほとんど受けません。 「the」を処理するのと同じくらい簡単に、テキストで頻繁に「wkh」を処理できます。
この質問に答えるのに時間がかかってすみません。
私の最近の論文を見てください:
「BiEntropy-有限のバイナリ文字列のおおよそのエントロピー」
http://arxiv.org/abs/1305.0954
「任意の長さの有限バイナリストリングのおおよそのエントロピーを計算する単純なアルゴリズムを設計、実装、テストします。アルゴリズムは、ストリングのシャノンエントロピーと、ストリングの最後のバイナリ導関数以外のすべての加重平均を使用します。素数理論(素数のシーケンスが周期的でないことを明示的に証明する場合)、ヒューマンビジョン、暗号化、乱数生成、および定量金融の分野でアルゴリズムをテストします。
NIST Random Number Generator評価ツールキットには、「近似エントロピー」を計算する方法があります。これは簡単な説明です:
概算エントロピーテスト説明:このテストの焦点は、重複するすべてのmビットパターンの頻度です。このテストの目的は、2つの連続する/隣接する長さ(mとm + 1)のオーバーラップするブロックの頻度を、ランダムシーケンスの期待される結果と比較することです。
さらに詳しい説明は、このページの [〜#〜] pdf [〜#〜] から入手できます。
http://csrc.nist.gov/groups/ST/toolkit/rng/documentation_software.html
ここにPythonの実装があります(Wikiページにも追加しました):
import numpy as np
def ApEn(U, m, r):
def _maxdist(x_i, x_j):
return max([abs(ua - va) for ua, va in Zip(x_i, x_j)])
def _phi(m):
x = [[U[j] for j in range(i, i + m - 1 + 1)] for i in range(N - m + 1)]
C = [len([1 for x_j in x if _maxdist(x_i, x_j) <= r]) / (N - m + 1.0) for x_i in x]
return -(N - m + 1.0)**(-1) * sum(np.log(C))
N = len(U)
return _phi(m) - _phi(m + 1)
例:
>>> U = np.array([85, 80, 89] * 17)
>>> ApEn(U, 2, 3)
-1.0996541105257052e-05
上記の例は Wikipediaで提供されている例 と一致しています。
この式でワードのシャノンエントロピーを使用する: http://imgur.com/a/DpcIH
O(n)それを計算するアルゴリズムです:
import math
from collections import Counter
def entropy(s):
l = float(len(s))
return -sum(map(lambda a: (a/l)*math.log2(a/l), Counter(s).values()))