एन्ट्रापी की गणना करना


13

इनपुट

एक मैट्रिक्स Mको पूर्णांक के दो अंतरिक्ष अलग लाइनों के रूप में दर्शाया गया है। प्रत्येक पंक्ति पूर्णांकों का एक ही नंबर प्रति पंक्ति पूर्णांकों की संख्या हो अधिक से अधिक 20 होगा और प्रत्येक पूर्णांक या तो हो जाएगा -1 या 1. Mइसलिए हो जाएगा 2द्वारा nजहां nदो पंक्तियों में से प्रत्येक पर पूर्णांकों की संख्या है।

आपका कोड एक पूर्ण कार्यक्रम होना चाहिए। और इनपुट को मानक में या फ़ाइल से स्वीकार करें (यह आपकी पसंद है)। आप फ़ाइल से या बस एक पैरामीटर के रूप में मानक से इनपुट स्वीकार कर सकते हैं। हालांकि, यदि आप बाद में करते हैं, तो कृपया एक स्पष्ट उदाहरण दें कि आपके कोड को कैसे काम करना चाहिए और याद रखना चाहिए कि यह एक पूर्ण कार्यक्रम होना चाहिए और Mइनपुट में मैट्रिक्स का प्रतिनिधित्व कैसे किया जाएगा। दूसरे शब्दों में, आपको कुछ पार्स करने की संभावना है।

उत्पादन

द्विआधारी शैनन एन्ट्रापी के वितरण की M*xजहां के तत्वों xसमान रूप से और स्वतंत्र रूप से {-1,1} से चुना जाता है। xएक nआयामी स्तंभ वेक्टर है।

असतत संभाव्यता वितरण की एन्ट्रॉपी है

- sum p_i log_2(p_i)

इस मामले में, वें p_iकी संभावना iअद्वितीय है M*x

उदाहरण और सहायक संकेत

काम किए गए उदाहरण के रूप में, मैट्रिक्स को Mहोने दें

-1 1
-1 -1

अब सभी 2^2अलग-अलग संभावित वैक्टरों को देखें x। प्रत्येक के लिए हम M*xएक सरणी (2-घटक वैक्टर के 4-तत्व सरणी) में सभी परिणामों की गणना करते हैं और डालते हैं। हालांकि 4 में से प्रत्येक वैक्टर के लिए इसके होने की संभावना है 1/2^2 = 1/4, हम केवल प्रत्येक अद्वितीय परिणामी वेक्टर के M*xहोने की संख्या में रुचि रखते हैं , और इसलिए हम उसी अद्वितीय वैक्टर के लिए अग्रणी कॉन्फ़िगरेशन की व्यक्तिगत संभावनाओं को जोड़ते हैं। दूसरे शब्दों में, संभव अद्वितीय M*xवैक्टर वितरण के परिणामों का वर्णन करते हैं जिनकी हम जांच कर रहे हैं, और हमें इन परिणामों में से प्रत्येक की संभावना (जो कि, निर्माण द्वारा, हमेशा एक पूर्णांक के कई 1/2^2, या 1/2^nसामान्य रूप से) निर्धारित करना होगा। एन्ट्रापी की गणना करें।

सामान्य तौर पर nमामला है, पर निर्भर करता है Mके संभावित परिणामों M*xसे "सभी विभिन्न" कर सकते हैं रेंज (इस मामले हमारे पास में nके मूल्यों iमें p_i, और प्रत्येक p_iके बराबर है 1/2^n), (इस मामले में नहीं है एक भी संभव "एक ही सभी के लिए" परिणाम, और p_1 = 1)।

विशेष रूप से, उपरोक्त 2x2मैट्रिक्स के लिए Mहम इसे चार संभव कॉन्फ़िगरेशन ( [+-1; +-1]) के साथ गुणा करके पा सकते हैं , कि प्रत्येक परिणामी वेक्टर अलग है। तो इस मामले में चार परिणाम हैं, और परिणामस्वरूप p_1 = p_2 = p_3 = p_4 = 1/2^2 = 1/4। याद है कि log_2(1/4) = -2हमारे पास है:

- sum p_i log_2(p_i) = -(4*(-2)/4) = 2

तो इस मैट्रिक्स के लिए अंतिम आउटपुट 2 है।

परीक्षण के मामलों

इनपुट:

-1 -1 
-1 -1

आउटपुट:

1.5

इनपुट:

-1 -1 -1 -1
-1 -1 -1 -1

आउटपुट:

2.03063906223

इनपुट:

-1  -1  -1  1
1  -1  -1  -1

आउटपुट:

3

7
1. के आयाम क्या हैं x? 2. प्रश्न को स्व-निहित बनाने के हितों में, द्विआधारी शैनन को कैसे Mxपरिभाषित किया गया है?
पीटर टेलर

4
@ पीटर की टिप्पणी ने डाउनवोट्स की सही व्याख्या की है। मैंने एंट्रॉपी पर लेख को स्किम किया, और मुझे तुरंत पता नहीं चला कि क्या लागू करना है। आपको वास्तव में यह बताना चाहिए कि शैनन एन्ट्रापी की गणना करने के लिए सूत्र / एल्गोरिदम क्या है।
लिन

5
वैसे भी प्रश्न स्व-निहित होने चाहिए; यह संभावना नहीं है कि विकिपीडिया अचानक ऑफ़लाइन हो जाएगा, लेकिन चुनौती के पूर्ण विनिर्देश को समझने में सक्षम होने के लिए किसी अन्य पृष्ठ पर क्लिक न करना आदर्श होगा।
दरवाज़े

2
डिफ़ॉल्ट रूप से, फ़ंक्शंस कार्यक्रमों के लिए एक वैध विकल्प हैं। आपको इसे खत्म करने की अनुमति है, लेकिन यह कुछ भाषाओं को बहुत दुखी कर देगा क्योंकि फ़ाइल या स्टड इनपुट लेने में बहुत सारे बॉयलरप्लेट लगते हैं। मोटे तौर पर, मैं एक गणितीय चुनौती पर इस तरह के प्रतिबंधात्मक इनपुट प्रारूप के खिलाफ सलाह देता हूं। भाषा की प्राकृतिक सूची प्रकार की अनुमति देने से लोगों को भाग लेने में खुशी होगी।
xnor

3
@ डोरोथी ध्यान दें कि यह "log_2 (0) सुविधा के लिए 0" नहीं है, बल्कि "lim_ {p-> 0} p * log (p) == 0" है। तो "log_2 (0)" अभी भी -inf है।
एंड्रास डीक

जवाबों:


3

मैथेमेटिका, 48 68 बाइट्स

संपादित करें: स्ट्रिंग के रूप में पैरामीटर को स्वीकार करने के लिए प्रीप्रोसेस जोड़ा जाता है।

की मदद से Tuplesऔर Entropy, कार्यान्वयन संक्षिप्त और पठनीय दोनों है।

Entropy[2,{-1,1}~Tuples~Length@#.#]&@Thread@ImportString[#,"Table"]&

जहां Tuples[{-1,1},n]सब संभव हैn से -tuples {-1,1}, और Entropy[2,list]आधार -2 जानकारी एन्ट्रापी देता है।

शांत चीजों में से एक यह है कि गणितज्ञ वास्तव में एक सटीक अभिव्यक्ति लौटाएगा:

%["-1 -1 \n -1 -1"]
(* 3/2 *)

अतिरिक्त परिणाम .( Entropy[2., ...) के साथ अनुमानित परिणाम प्राप्त किया जा सकता है ।


Mathematica हास्यास्पद है :) हालाँकि आपका उत्तर कल्पना के अनुकूल नहीं है। इनपुट स्पेस अलग हो गया है इसलिए कुछ पार्सिंग की आवश्यकता होगी। नवीनतम अद्यतन देखें।
डोरोथी

3

पर्ल, 160 159 141 बाइट्स

-p141 बाइट अपडेट के बाद से +1 शामिल है

@y=(@z=/\S+/g)x 2**@z;@{$.}=map{evals/.1/"+".$&*pop@y/egr}glob"{-1,+1}"x@z}{$H{$_.$2[$i++]}++for@1;$\-=$_*log($_/=1<<@z)/log 2 for values%H;

इनपुट के STDINरूप में 2 लाइनों पर अंतरिक्ष-पृथक 1या शामिल होने की उम्मीद है -1
ऐसे दोड़ोperl -p 140.pl < inputfile

यह कोई पुरस्कार नहीं जीतेगा, लेकिन मुझे लगा कि मैं अपना प्रयास साझा करूंगा।
व्याख्या की:

    @y=                             # @y is (@z) x (1<<$n)
       (@z = /\S+/g)                # construct a matrix row from non-WS
       x 2**@z;                     # repeat @z 2^$n times
    @{$.} = map {                   # $.=$INPUT_LINE_NUMBER: set @1 or @2
      eval s/.1/"+".$&*pop@y/egr    # multiply matrix row with vector
    } glob "{-1,+1}" x @z           # produce all possible vectors

}{                                  # `-p` trick: end `while(<>)`, reset `$_`

$H{ $_ . $2[$i++] }++               # count unique M*x columns
    for @1;

$\ -= $_ * log($_/=1<<@z) / log 2   # sum entropy distribution
        for values %H;

डेटा

  • अद्यतन 159: के बजाय का ()उपयोग करके समाप्त करके 1 बचाएं ।**<<
  • अद्यतन 141: का उपयोग करके 18 बचाओ $.और -p

1
धन्यवाद! हम ppcg imho पर पर्याप्त पर्ल जवाब नहीं है
डोरोथी

@dorothy यह क्योंकि कोड-गोल्फरों है घृणा पर्ल, अधिकांश भाग के लिए।
Addison Crump

@FlagAsSpam लेकिन, लेकिन .. perl समझ से बाहर है, रसीला और सीमावर्ती पागल है। यह कोड-गोल्फ के लिए अधिक उपयुक्त कैसे हो सकता है ?
डोरोथी

@ डोरोथी (\ _ (or) _ / it हम प्लेग की तरह इससे बचते हैं। डननो क्यों, सच में।
Addison Crump

2

पायथ, 37 बाइट्स

K^_B1lhJrR7.z_s*LldcRlKhMrSmms*VdkJK8

परीक्षण सूट

यह कुछ हद तक पेचीदा है जब आपको मैट्रिक्स गुणन को मैन्युअल रूप से लागू करना होगा।

स्पष्टीकरण:

K^_B1lhJrR7.z_s*LldcRlKhMrSmms*VdkJK8
       JrR7.z                            Parse input into matrix, assign to J.
  _B1                                    [1, -1]
K^   lhJ                                 All +-1 vectors of length n, assign to K.
                           m       K     Map over K
                            m     J      Map over the rows of J
                             s*Vdk       Sum of vector product of vector and row.
                          S              Sort
                         r          8    Run length encode.
                       hM                Take just occurrence counts.
                   cRlK                  Divide by len(K) to get probabilities.
               *Lld                      Multiply each probabiliity by its log.
              s                          Sum.
             _                           Negate. Print implicitly.

वाह! :) यह बहुत काम की लगती है। अब कहाँ हैं सीजेएम लोग .....?
डोरोथी

1

MATLAB, 196 194 187 184 126 154 बाइट्स

(अतिरिक्त 28 बाइट्स 126 से 154 तक इनपुट पार्सिंग के कारण होते हैं: अब कोड इनपुट को व्हॉट्सएप-अलग-अलग संख्याओं की दो पंक्तियों के रूप में स्वीकार करता है।)

f=@()str2num(input('','s'));M=[f();f()];n=size(M,2);x=(dec2bin(0:n^2-1,n)-48.5)*2*M';[~,~,c]=unique(x,'rows');p=accumarray(c,1)/2^n;disp(-sum(p.*log2(p)))

Ungolfed संस्करण:

f=@()str2num(input('','s'));        % shorthand for "read a line as vector"
M=[f();f()];                        % read matrix
n=size(M,2);                        % get lenght of vectors

x=(dec2bin(0:n^2-1,n)-48.5)*2*M';   % generate every configuration
                                    %    using binary encoding
[~,~,c]=unique(x,'rows');           % get unique rows of (Mx)^T
p=accumarray(c,1)/2^n;              % count multiplicities and normalize
disp(-sum(p.*log2(p)))              % use definition of entropy

मैं 6 बाइट के साथ दूर कर सकता है अगर "ans = ... " प्रकार के आउटपुट की अनुमति थी, तो मुझे इस बारे में निश्चित नहीं है।

मुझे यह कहने के लिए खेद है कि मेरा मूल और निश्चित रूप से मजाकिया समाधान मेरे वर्तमान समाधान की तुलना में बहुत अधिक असंयमित था। यह भी पहली बार है जब मैं उपयोग कर रहा हूंaccumarray । एक छह-इनपुट-पैरामीटर एप्लिकेशन को अभी भी इंतजार करना पड़ता है, हालांकि :)

आउटपुट (निम्नलिखित format long):

[-1 1
-1 -1]
     2

[-1 -1
-1 -1]
   1.500000000000000

[-1 -1 -1 -1
-1 -1 -1 -1]
   2.030639062229566

[-1  -1  -1  1
1  -1  -1  -1]
     3

डिफ़ॉल्ट के साथ आउटपुट format short g:

[-1 1
-1 -1]
     2

[-1 -1
-1 -1]
          1.5

[-1 -1 -1 -1
-1 -1 -1 -1]
       2.0306

[-1  -1  -1  1
1  -1  -1  -1]
     3
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.