の最初の引数である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文字のそれぞれが同じ頻度で出現すると予想され、それ以上のユニフォームを得ることはできません!
実装のためかもしれないと思いました。 "MM"メソッドが使用されている場合、反復された値のエントロピーがそれらの値に依存することを除いて、動作は期待通りです。 "ML"メソッドはこれを正しく処理します。 編集:クロスバリデーションはとにかく良い場所かもしれません。あなたがそれを提案するまで私はそれを知りませんでした。 –
実装の場合は、 'getAnywhere(" entropy.empirical ")'、 'getAnywhere(" entropy.MillerMadow ")'と 'getAnywhere(" entropy.plugin ")'を見てみてください。 – Laterow
ありがとうございます。私はソースコードを見てきましたが、なぜそれが動作するのかわかりません。要約すると、データを受け取り、それをfreqs関数で保存し、ログ関数を適用します。 –