2016-07-07 2 views
5

विकिपीडिया के मुताबिक, समान वितरण "अधिकतम एन्ट्रॉपी संभाव्यता वितरण" है। इस प्रकार, यदि मेरे पास दो अनुक्रम होते हैं (एक समान रूप से वितरित और दोहराए गए मानों के साथ एक), लंबाई लंबाई दोनों, तो मैं समान रूप से वितरित अनुक्रम की एंट्रॉपी बार-बार मानों के अनुक्रम से अधिक होने की अपेक्षा करता हूं। बहरहाल, यह क्या नहीं मनाया जाता है तब होता है जब आर में निम्न कोड चल:आर में दोहराए गए मानों से कम समान वितरण की एन्ट्रॉपी क्यों है?

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

पहले उत्पादन एन्ट्रापी की चारों ओर 9.7 बिट्स पैदा करता है, जबकि दूसरा एन्ट्रापी की ठीक 10 बिट्स का उत्पादन (लॉग 1024 = 10 के आधार 2)। समान वितरण में एंट्रॉपी के 10 बिट से अधिक क्यों नहीं हैं?

+1

मैंने सोचा कि यह कार्यान्वयन के कारण हो सकता है। यदि "एमएम" विधि का उपयोग किया जाता है, तो व्यवहार अपेक्षा की जाती है सिवाय इसके कि दोहराए गए मानों की एन्ट्रॉपी उन मानों पर निर्भर करती है, यह नहीं होना चाहिए। "एमएल" विधि सही ढंग से इसे संभालती है। संपादित करें: मान्य क्रॉस वैसे भी एक बेहतर जगह हो सकता है। मुझे तब तक पता नहीं था जब तक कि आपने इसका सुझाव नहीं दिया। –

+0

यदि यह कार्यान्वयन है, तो 'getAnywhere ("entropy.empirical")', 'getAnywhere ("entropy.MillerMadow")' और 'getAnywhere (" entropy.plugin ")' को देखने का प्रयास करें। – Laterow

+0

धन्यवाद। मैंने सोर्स कोड को देखा है लेकिन मुझे यकीन नहीं है कि यह क्यों व्यवहार करता है। संक्षेप में, यह डेटा लेता है, इसे freqs फ़ंक्शन के साथ डिब्बे करता है, और उसके बाद लॉग फ़ंक्शन लागू करता है। –

उत्तर

3

मुझे लगता है कि आप में पहले तर्क, y का गलतफहमी समझ रहे हैं। जैसा कि ?entropy में बताया गया है, यह गणना का एक वेक्टर देता है। वे एक साथ गिना जाता है जो प्रत्येक प्रतीक के सापेक्ष आवृत्तियों को देते हैं, जिनसे इस "सूचना के अलग स्रोत" पर संदेश बनाये गये हैं।

यह देखने के लिए कि यह कैसे खेलता है, एक साधारण उदाहरण देखें, केवल दो प्रतीकों (1/0, चालू/बंद, ए/बी, आपके पास क्या है) के साथ एक द्विआधारी सूचना स्रोत है। इस मामले में, निम्न में से सभी एक स्रोत है, जिसमें दो प्रतीकों के सापेक्ष आवृत्तियों ही कर रहे हैं के लिए एन्ट्रापी दे देंगे (यानी आधा प्रतीकों A रों हैं और आधे B रों हैं):

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 अक्षरों में से प्रत्येक बराबर आवृत्ति के साथ होने की उम्मीद है, और आप इससे अधिक समान नहीं हो सकते हैं!

+0

सहायता के लिए धन्यवाद। मैं क्या करना चाहता हूं एक सरणी के एन्ट्रॉपी को मापना है। सरणी में प्रत्येक तत्व में एक संख्या होती है जो कि स्मृति में तत्व को एक्सेस करने की संख्या के अनुरूप होती है (यह सुरक्षा अनुसंधान के लिए है)।एंट्रॉपी को सही तरीके से मापने के लिए, क्या मुझे पहले उस सरणी पर freqs फ़ंक्शन को लागू करने की आवश्यकता होगी? –

+2

@AlphaBravo क्षमा करें, मैं आपकी मदद करने में सक्षम नहीं हूं या आपको अपने विशेष आवेदन में एन्ट्रॉपी कंप्यूटेशंस को लागू करने के बारे में कोई उपयोगी सलाह नहीं दे पाऊंगा। चूंकि 'freqs.empirical() 'इसे सौंपे गए किसी भी डेटा को सामान्य करता है (ताकि उनकी आवृत्तियों को' 1' तक मिल जाए), हालांकि, इससे कोई फर्क नहीं पड़ता कि आप इसे कच्चे मायने रखता है या पहले से ही सामान्यीकृत डेटा। –

संबंधित मुद्दे