2016-07-07 15 views
5

Theo Wikipedia, phân bố đồng đều là "phân bố xác suất entropy tối đa". Do đó, nếu tôi có hai dãy (một phân bố đồng nhất và một với giá trị lặp lại), cả hai chiều dài k, thì tôi mong đợi entropy của chuỗi phân bố đồng đều cao hơn chuỗi các giá trị lặp lại. Tuy nhiên, đây không phải là những gì được quan sát thấy khi chạy đoạn mã sau vào R:Tại sao entropy phân phối đồng đều thấp hơn giá trị lặp lại trong R?

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

Sản lượng đầu tiên sản xuất khoảng 9,7 bit của entropy, trong khi thứ hai sản xuất đúng 10 bit entropy (log cơ sở 2 1024 = 10). Tại sao phân bố đồng đều không có nhiều hơn 10 bit entropy?

+1

Tôi nghĩ có thể là do triển khai. Nếu phương thức "MM" được sử dụng, hành vi như mong đợi ngoại trừ entropy của các giá trị lặp lại phụ thuộc vào các giá trị đó, nó không nên. Phương thức "ML" xử lý chính xác điều này. Chỉnh sửa: Cross xác thực có thể là một nơi tốt hơn. Tôi không biết nếu nó cho đến khi bạn đề nghị nó. –

+0

Nếu đó là việc thực hiện, sau đó thử nhìn vào 'getAnywhere (" entropy.empirical ")', 'getAnywhere (" entropy.MillerMadow ")' và 'getAnywhere (" entropy.plugin ")'. – Laterow

+0

Cảm ơn. Tôi đã nhìn vào mã nguồn nhưng tôi không chắc chắn tại sao nó hoạt động như nó. Tóm lại, nó lấy dữ liệu, thùng nó với hàm freqs, và sau đó áp dụng hàm log cho nó. –

Trả lời

3

Tôi nghĩ bạn hiểu nhầm đối số đầu tiên, y, trong số entropy() đại diện. Như đã đề cập trong ?entropy, nó cung cấp một vectơ đếm. Những con số này cùng nhau đưa ra các tần số tương đối của từng biểu tượng mà từ đó các thông điệp về "nguồn thông tin rời rạc" này được tạo thành.

Để xem cách phát ra, hãy xem ví dụ đơn giản hơn về nguồn thông tin nhị phân chỉ với hai biểu tượng (1/0, bật/tắt, A/B, bạn có gì). Trong trường hợp này, tất cả những điều sau đây sẽ cung cấp cho các entropy cho một nguồn trong đó tần số tương đối của hai biểu tượng đều giống nhau (tức là một nửa những biểu tượng là A s và một nửa là 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 

Vì tất cả đều đề cập đến cùng một phân bố cơ bản, trong đó xác suất được lan truyền tối đa trong số các ký hiệu có sẵn, chúng cho mỗi entropy cao nhất có thể cho một nguồn thông tin hai trạng thái (log(2) = 0.6931472)).

Khi bạn thay thế entropy(runif(2)), bạn đang cung cấp xác suất tương đối cho hai biểu tượng được chọn ngẫu nhiên từ phân phối đồng đều. Trừ khi hai số được chọn ngẫu nhiên đó giống hệt nhau, bạn đang nói entropy() rằng bạn đã có nguồn thông tin với hai biểu tượng được sử dụng với các tần số khác nhau. Kết quả là, bạn sẽ luôn nhận được một entropy tính toán thấp hơn log(2). Dưới đây là một ví dụ nhanh để minh họa cho những gì tôi có nghĩa là:

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)) 

Nói tóm lại, bằng cách thông qua các y= luận một chuỗi dài của 1 s, như trong entropy(rep(1, 1024)), bạn đang mô tả một nguồn thông tin đó là một rời rạc tương tự của phân bố đồng đều. Về lâu dài hoặc trong một tin nhắn rất dài, mỗi 1024 chữ cái của nó được dự kiến ​​sẽ xảy ra với tần số bằng nhau, và bạn không thể có được bất kỳ thống nhất hơn thế!

+0

Cảm ơn sự giúp đỡ. Những gì tôi muốn làm là đo entropy của một mảng. Mỗi phần tử trong mảng chứa một số tương ứng với số lần mà phần tử được truy cập trong bộ nhớ (nó là dành cho nghiên cứu bảo mật).Để đo entropy một cách chính xác, tôi có cần phải áp dụng hàm freqs trên mảng đó trước không? –

+2

@AlphaBravo Xin lỗi, tôi sẽ không thể giúp bạn hoặc cung cấp cho bạn bất kỳ lời khuyên hữu ích nào về cách áp dụng tính toán entropy cho ứng dụng cụ thể của bạn. Vì 'freqs.empirical()' bình thường hóa bất kỳ dữ liệu nào được trao cho nó (để các tần số của chúng tổng hợp thành '1'), tuy nhiên, nó không tạo ra sự khác biệt cho dù bạn đưa số liệu thô hoặc dữ liệu đã chuẩn hóa. –

Các vấn đề liên quan