2016-07-07 10 views
5

ウィキペディアによれば、一様分布は「最大エントロピー確率分布」である。したがって、長さkの2つのシーケンス(1つは均一に分布し、もう1つは繰り返し値を持つ)があれば、均一に分布したシーケンスのエントロピーは繰り返し値のシーケンスよりも高くなると予想される。しかし、これはRで次のコードを実行するときに観察されるものではない:一様分布のエントロピーがRの繰り返し値よりも低いのはなぜですか?

require(entropy) 
entropy(runif(1024), method="ML", unit="log2") 
entropy(rep(1,1024), method="ML", unit="log2") 

第エントロピーの正確に10ビット(= 10 1024ベース2のログを生成しつつ、第1の出力は、エントロピーの9.7ビットの周りに生成します)。一様分布に10ビット以上のエントロピーがないのはなぜですか?

+1

実装のためかもしれないと思いました。 "MM"メソッドが使用されている場合、反復された値のエントロピーがそれらの値に依存することを除いて、動作は期待通りです。 "ML"メソッドはこれを正しく処理します。 編集:クロスバリデーションはとにかく良い場所かもしれません。あなたがそれを提案するまで私はそれを知りませんでした。 –

+0

実装の場合は、 'getAnywhere(" entropy.empirical ")'、 'getAnywhere(" entropy.MillerMadow ")'と 'getAnywhere(" entropy.plugin ")'を見てみてください。 – Laterow

+0

ありがとうございます。私はソースコードを見てきましたが、なぜそれが動作するのかわかりません。要約すると、データを受け取り、それをfreqs関数で保存し、ログ関数を適用します。 –

答えて

3

の最初の引数であるyが誤解していると思います。 ?entropyで述べたように、それはカウントのベクトルを与えます。これらのカウントは、この「個別の情報源」上のメッセージが構成されているシンボルのそれぞれの相対頻度をまとめたものです。

2つのシンボル(1/0、オン/オフ、A/B、あなたのもの)を持つバイナリ情報ソースの例を見てみましょう。この場合、以下のすべてが(すなわち、半分のシンボルはA Sであり、半分がB Sである)は、2つのシンボルの相対頻度が同一であるソースのエントロピーを与える:

entropy(c(0.5, 0.5)) 
# [1] 0.6931472 
entropy(c(1,1)) 
# [1] 0.6931472 
entropy(c(1000,1000)) 
# [1] 0.6931472 
entropy(c(0.0004, 0.0004)) 
# [1] 0.6931472 
entropy(rep(1,2)) 
# [1] 0.6931472 

ためそれらはすべて、利用可能なシンボルの中で確率が最大限に広がっている同一の基礎分布を参照し、2状態情報源(log(2) = 0.6931472))に対して可能な限り高いエントロピーを与える。

代わりにentropy(runif(2))を実行すると、一様分布からランダムに選択された2つのシンボルに相対的な確率が与えられます。 2つのランダムに選択された数字が全く同じでない限り、entropy()には、異なる周波数で使用される2つの記号を持つ情報源があることを伝えています。結果として、常にlog(2)より低い計算されたエントロピーが得られます。

set.seed(4) 
(x <- runif(2)) 
# [1] 0.585800305 0.008945796 
freqs.empirical(x) ## Helper function called by `entropy()` via `entropy.empirical()` 
# [1] 0.98495863 0.01504137 

## Low entropy, as you should expect 
entropy(x) 
# [1] 0.07805556 

## Essentially the same thing; you can interpret this as the expected entropy 
## of a source from which a message with 984 '0's and 15 '1's has been observed 
entropy(c(984, 15)) 
要するに

は、entropy(rep(1, 1024))のように、y=引数に1秒の長い文字列を渡すことで、あなたは離散である情報源を記述している:ここで私が何を意味するか説明する簡単な例を示します。一様分布の類似体。長い間、または非常に長いメッセージの中で、1024文字のそれぞれが同じ頻度で出現すると予想され、それ以上のユニフォームを得ることはできません!

+0

助けてくれてありがとう。私がしたいことは配列のエントロピーを測定することです。配列の各要素には、要素がメモリ内でアクセスされた回数(セキュリティ研究用)に対応する数値が含まれています。エントロピーを正しく測定するには、最初にその配列にfreqs関数を適用する必要がありますか? –

+2

@AlphaBravo申し訳ありませんが、私はあなたを助けたり、特定のアプリケーションにエントロピー計算を適用する方法について有用な助言を与えることはできません。 'freqs.empirical()'はそれに渡されたデータを正規化するので(周波数の合計が '1 'になる)、生のカウントを渡したのか、すでに正規化したデータを渡しても違いはありません。 –