Entropinin hesaplanması


13

Giriş

Bir matris M, boşlukla ayrılmış iki tamsayı çizgisi olarak temsil edilir. Olması en fazla 20 olacaktır satıra sayının sayısını Her satır tam sayılar aynı sayıda ve her tam sayı ya olacak -1 ya da 1 M, bu nedenle olacak 2ile nburada niki hattın her biri üzerinde tamsayılar sayısıdır.

Kodunuz eksiksiz bir program olmalıdır. ve girdiyi standart olarak bir dosya içinde veya bir dosyadan kabul edebilirsiniz (bu sizin seçiminizdir). Standart girişten, dosyadan veya basitçe parametre olarak girişi kabul edebilirsiniz. Ancak, ikincisini yaparsanız, lütfen kodunuzun nasıl çalışması gerektiğine ilişkin açık bir örnek verin ve bunun tam bir program olması gerektiğini ve matrisin Mgirişte nasıl temsil edileceğini unutmayın. Başka bir deyişle, biraz ayrıştırma yapmanız gerekebilir.

Çıktı

İkili Shannon entropi dağılımı M*xelemanları burada xeşit ve bağımsız bir şekilde, {-1,1} arasından seçilir. xBir olan nboyutlu sütun vektördür.

Kesikli olasılık dağılımının entropisi

- sum p_i log_2(p_i)

Bu durumda, mümkün p_iolan en ieşsiz inci olasılığıdır M*x.

Örnek ve faydalı ipuçları

Bir işlenmiş bir örnek olarak, matris izin Molmak

-1 1
-1 -1

Şimdi 2^2olası tüm farklı vektörlere bakın x. Her biri M*xiçin tüm sonuçları bir diziye (2 bileşenli vektörlerden oluşan 4 elemanlı bir dizi) hesaplayıp koyarız. 4 vektörün her biri için meydana gelme olasılığı olmasına rağmen 1/2^2 = 1/4, sadece her bir benzersiz sonuç vektörünün kaç kez meydana M*xgeldiği ile ilgileniyoruz ve bu nedenle aynı benzersiz vektörlere yol açan konfigürasyonların bireysel olasılıklarını özetliyoruz. Başka bir deyişle, olası benzersiz M*xvektörler araştırdığımız dağılımın sonuçlarını açıklar ve bu sonuçların her birinin (inşaat yoluyla her zaman tamsayı katları 1/2^2veya 1/2^ngenel olarak olacak) olasılığını belirlememiz gerekir . entropiyi hesaplar.

Genel ndurumda, Molası sonuçlarına bağlı olarak M*x"hepsi farklı" dan (bu durumda biz in ndeğerlerine sahibiz ve her biri eşittir ), "hepsi aynı" ya (bu durumda tek bir olası sonuç ve ).ip_ip_i1/2^np_1 = 1

Özellikle, yukarıdaki 2x2matris için Mbunu dört olası konfigürasyonla ( [+-1; +-1]) çarparak bulabiliriz , sonuçta ortaya çıkan her vektör farklıdır. Yani bu durumda dört sonuç vardır ve sonuç olarak p_1 = p_2 = p_3 = p_4 = 1/2^2 = 1/4. Sahip log_2(1/4) = -2olduğumuzu hatırlatarak :

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

Yani bu matris için nihai çıktı 2'dir.

Test senaryoları

Giriş:

-1 -1 
-1 -1

Çıktı:

1.5

Giriş:

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

Çıktı:

2.03063906223

Giriş:

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

Çıktı:

3

7
1. boyutları nelerdir x? 2. Sorunun bağımsız olmasını sağlamak için ikili Shannon entropisi nasıl Mxtanımlanır?
Peter Taylor

4
@ Peter'ın yorumu downvotes tam olarak açıklıyor. Entropi ile ilgili makaleyi gözden geçirdim ve ne yapacağımı hemen bulamıyorum. Shannon entropisini hesaplamak için formül / algoritmanın tam olarak ne olduğunu belirtmelisiniz.
Lynn

5
Her neyse, sorular bağımsız olmalıdır; Wikipedia'nın aniden çevrimdışı olması olası değildir, ancak zorluğun tüm özelliklerini anlamak için başka bir sayfayı tıklamak zorunda kalmamak ideal olacaktır.
Kapı tokmağı

2
Varsayılan olarak, işlevler programlara geçerli bir alternatiftir. Bunu geçersiz kılabilirsiniz, ancak bazı dilleri çok üzecektir, çünkü dosya veya stdin girdisi almak için çok sayıda kazan plakası gerekir. Daha geniş bir ifadeyle, matematiksel bir meydan okumada böyle kısıtlayıcı bir giriş formatına sahip olmamayı öneriyorum. Dilin doğal liste türüne izin vermek, insanların katılmasını daha mutlu eder.
xnor

3
@dorothy bunun "log_2 (0) kolaylık olması için 0" değil, "lim_ {p-> 0} p * log (p) == 0" olduğunu unutmayın. Yani "log_2 (0)" hala -inf.
Andras Deak

Yanıtlar:


3

Mathematica, 48 68 bayt

Düzenle: Dizeyi parametre olarak kabul etmek için önişleme eklenir.

Yardımıyla Tuplesve Entropyuygulama özlü ve okunabilir hem de.

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

nerede Tuples[{-1,1},n]tüm olası verir n-tuples gelen {-1,1}ve Entropy[2,list]taban-2 bilgi entropi verir.

Harika şeylerden biri, Mathematica'nın gerçekten doğru bir ifade döndürmesi:

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

Ek bir sonuç .( Entropy[2., ...) ile yaklaşık sonuç elde edilebilir .


Mathematica saçma :) Ancak cevabınız spesifikasyona tam olarak uymuyor. Giriş boşlukla ayrılmıştır, bu nedenle bazı ayrıştırmalar gerekecektir. En son güncellemeye bakın.
Dorothy

3

Perl, 160 159 141 bayt

-p141 bayt güncellemesinden bu yana +1 içerir

@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;

Girişi beklenen STDINalan ayrılmış oluşan 2 çizgi halinde 1veya -1.
Farklı çalıştır perl -p 140.pl < inputfile.

Hiçbir ödül kazanmayacak, ama çabalarımı paylaşacağımı düşündüm.
Açıklaması:

    @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;

VERİ

  • Güncelleme 159: yerine ()kullanarak ortadan kaldırarak 1 kaydedin .**<<
  • Güncelleme 141: kullanarak 18 tasarruf $.ve -p.

1
Teşekkür ederim! Biz ppcg imho yeterli perl cevapları yok
Dorothy

Kod-golfçüler çünkü @dorothy It nefret çoğunlukla, Perl.
Addison Crump

@FlagAsSpam Ama, ama .. perl anlaşılmaz, özlü ve sınırda çılgın. Kod golfü için nasıl daha uygun olabilir ?
Dorothy

@dorothy ¯ \ _ (ツ) _ / ¯ Veba gibi kaçınırız. Neden bilmiyorum, gerçekten.
Addison Crump

2

Pyth, 37 bayt

K^_B1lhJrR7.z_s*LldcRlKhMrSmms*VdkJK8

Test odası

Matris çarpımını manuel olarak uygulamanız gerektiğinde bu biraz daha karmaşıktır.

Açıklama:

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.

Vaov! :) Bu çok iş gibi görünüyor. Şimdi cjam insanlar nerede .....?
Dorothy

1

MATLAB, 196 194 187 184 126 154 bayt

(126 ile 154 arasındaki fazladan 28 bayt girdi ayrıştırma işleminden kaynaklanmaktadır: şimdi kod girdiyi boşlukla ayrılmış iki satır olarak kabul etmektedir.)

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 sürümü:

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

" ans = ..." Çıkış türüne izin verilirse 6 bayt ile bunu başarabilirdim , bu konuda asla emin değilim.

Özgün ve kesinlikle esprili çözümümün şu anki çözümüme kıyasla çok fazla çözüldüğünü söylediğim için üzgünüm . Bu aynı zamanda ilk kez kullanıyorum accumarray. Yine de, altı girişli bir parametre uygulaması beklemek zorundadır :)

Çıkışlar (aşağıdaki 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

Varsayılan çıkışlar 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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.