我想你是誤解什麼第一個參數y
,在entropy()
代表。正如?entropy
中提到的那樣,它給出了一個計數向量。這些數字共同給出了這個「離散的信息源」上的消息所組成的每個符號的相對頻率。看看這個簡單的例子,看看只有兩個符號的二進制信息源(1/0,開/關,A/B,你有什麼)。在這種情況下,以下所有的將給予熵對於其中兩個符號的相對頻率是相同的源極(即一半的碼元是A
S和一半B
S):
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
由於這些都是指相同的基本分佈,其中概率在可用符號中最大限度地展開,它們各自給出兩態信息源(log(2) = 0.6931472)
)的最高可能熵。
當你這樣做,而不是entropy(runif(2))
,你提供從均勻分佈中隨機選擇的兩個符號的相對概率。除非這兩個隨機選擇的數字完全相等,否則您告訴entropy()
您有一個信息源,其中包含兩個用於不同頻率的符號。因此,您總是會得到低於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))
綜上所述,通過將y=
說法1
秒的長字符串,如entropy(rep(1, 1024))
,你所描述是離散的信息源均勻分佈的模擬。從長遠來看,或者在一個非常長的消息中,它的1024個字母中的每一個預計會以相同的頻率出現,並且你不能得到比這更統一的信息!
我認爲這可能是因爲實施。如果使用「MM」方法,除了重複值的熵取決於這些值之外,其行爲與預期相同,但不應該如此。 「ML」方法正確處理了這一點。 編輯:交叉驗證可能是一個更好的地方反正。直到你提出這個建議,我才知道它。 –
如果是實現,則嘗試查看'getAnywhere(「entropy.empirical」)''''getAnywhere(「entropy.MillerMadow」)'和'getAnywhere(「entropy.plugin」)'。 – Laterow
謝謝。我查看了源代碼,但我不確定爲什麼它的行爲如此。總之,它取得數據,將其與freqs函數一起分類,然後將日誌函數應用於它。 –