Menghitung entropi

13

Memasukkan

Sebuah matriks Mdirepresentasikan sebagai dua garis bilangan bulat yang dipisahkan ruang. Setiap baris akan memiliki jumlah bilangan bulat yang sama dan setiap bilangan bulat akan menjadi -1 atau 1. Jumlah bilangan bulat per baris paling banyak 20. MOleh karena itu akan 2dengan di nmana njumlah bilangan bulat pada masing-masing dari dua baris.

Kode Anda harus merupakan program yang lengkap. dan menerima input baik pada standar di atau dari file (itu adalah pilihan Anda). Anda dapat menerima input dari standar masuk, dari file atau hanya sebagai parameter. Namun, jika Anda melakukan yang terakhir tolong berikan contoh eksplisit tentang bagaimana kode Anda harus bekerja dan ingat bahwa itu harus menjadi program yang lengkap dan bagaimana matriks Makan diwakili dalam input. Dengan kata lain, Anda harus melakukan parsing.

Keluaran

The biner Shannon entropi dari distribusi M*xdi mana unsur-unsur xyang seragam dan independen dipilih dari {-1,1}. xadalah nvektor kolom -dimensi.

Entropi dari distribusi probabilitas diskrit adalah

- sum p_i log_2(p_i)

Dalam hal ini, p_iadalah probabilitas ikeunikan mungkin M*x.

Contoh dan petunjuk bermanfaat

Sebagai contoh yang dikerjakan, biarkan matriks Mmenjadi

-1 1
-1 -1

Sekarang lihat semua 2^2kemungkinan vektor yang berbeda x. Untuk masing-masing kita menghitung M*xdan menempatkan semua hasil dalam array (array 4-elemen dari vektor 2-komponen). Meskipun untuk masing-masing dari 4 vektor kemungkinan itu terjadi adalah 1/2^2 = 1/4, kami hanya tertarik pada berapa kali setiap vektor hasil yang unikM*x terjadi, dan jadi kami merangkum probabilitas individu dari konfigurasi yang mengarah ke vektor unik yang sama. Dengan kata lain, kemungkinan M*xvektor unik menggambarkan hasil distribusi yang kami selidiki, dan kami harus menentukan probabilitas masing-masing hasil ini (yang akan, dengan konstruksi, selalu menjadi kelipatan bilangan bulat dari 1/2^2, atau 1/2^nsecara umum) untuk hitung entropi.

Dalam nkasus umum , tergantung pada Mhasil yang mungkin M*xdapat berkisar dari "semua berbeda" (dalam hal ini kami memiliki nnilai idalam p_i, dan masing-masing p_isama dengan 1/2^n), hingga "semua sama" (dalam hal ini ada satu kemungkinan hasil, dan p_1 = 1).

Secara khusus, untuk 2x2matriks di atas Mkita dapat menemukan dengan mengalikannya dengan empat kemungkinan konfigurasi ( [+-1; +-1]), bahwa setiap vektor yang dihasilkan berbeda. Jadi dalam hal ini ada empat hasil, dan akibatnya p_1 = p_2 = p_3 = p_4 = 1/2^2 = 1/4. Mengingat yang log_2(1/4) = -2kita miliki:

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

Jadi hasil akhir untuk matriks ini adalah 2.

Uji kasus

Memasukkan:

-1 -1 
-1 -1

Keluaran:

1.5

Memasukkan:

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

Keluaran:

2.03063906223

Memasukkan:

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

Keluaran:

3
dorothy
sumber
7
1. Apa dimensi dari x? 2. Untuk kepentingan membuat pertanyaan itu mandiri, bagaimana Mxdefinisi biner Shannon didefinisikan?
Peter Taylor
4
Komentar @ Peter persis menjelaskan downvotes. Saya membaca sekilas artikel tentang entropi, dan saya tidak bisa segera mencari tahu apa yang harus diterapkan. Anda harus menentukan dengan tepat apa rumus / algoritma untuk menghitung entropi Shannon.
Lynn
5
Pertanyaan-pertanyaan harus lengkap, bagaimanapun; Wikipedia sepertinya tidak akan tiba-tiba offline, tetapi sebaiknya tidak perlu mengklik ke halaman lain untuk dapat memahami spesifikasi lengkap dari tantangan.
Gagang Pintu
2
Secara default, fungsi adalah alternatif yang valid untuk program. Anda diizinkan untuk mengesampingkan itu, tetapi itu akan membuat beberapa bahasa sangat sedih karena dibutuhkan banyak boilerplate untuk mengambil input file atau stdin. Secara lebih luas, saya sarankan agar tidak memiliki format input yang ketat pada tantangan matematika. Mengizinkan jenis daftar alami bahasa akan membuat orang lebih senang untuk berpartisipasi.
xnor
3
@dorothy perhatikan bahwa bukan itu "log_2 (0) adalah 0 untuk kenyamanan", melainkan "lim_ {p-> 0} p * log (p) == 0". Jadi "log_2 (0)" masih -inf.
Andras Deak

Jawaban:

3

Mathematica, 48 68 byte

Sunting: Preprocess ditambahkan untuk menerima string sebagai parameter.

Dengan bantuan Tuplesdan Entropy, implementasinya ringkas dan mudah dibaca.

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

di mana Tuples[{-1,1},n]memberikan semua kemungkinan n-tuple dari {-1,1}, dan Entropy[2,list]memberikan entropi informasi base-2.

Salah satu hal keren adalah bahwa Mathematica benar-benar akan mengembalikan ekspresi yang akurat:

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

Hasil perkiraan dapat dicapai dengan tambahan .tambahan ( Entropy[2., ...).

njpipeorgan
sumber
Mathematica itu konyol :) Namun jawaban Anda tidak cukup sesuai dengan spesifikasi. Input dipisahkan oleh ruang sehingga beberapa penguraian akan diperlukan. Lihat pembaruan terbaru.
dorothy
3

Perl, 160 159 141 byte

termasuk +1 untuk -psejak pembaruan 141 byte

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

Input diharapkan pada STDIN2 baris yang terdiri dari spasi-terpisah 1atau -1.
Jalankan sebagai perl -p 140.pl < inputfile.

Itu tidak akan memenangkan hadiah apa pun, tetapi saya pikir saya akan membagikan upaya saya.
Dijelaskan:

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

DATA

  • perbarui 159: simpan 1 dengan menghilangkan ()dengan menggunakan **alih-alih <<.
  • perbarui 141: simpan 18 dengan menggunakan $.dan -p.
Kenney
sumber
1
Terima kasih! Kami tidak memiliki cukup jawaban perl pada ppcg imho
dorothy
@dorothy Itu karena pegolf kode membenci Perl, untuk sebagian besar.
Addison Crump
@ FlagAsSpam Tapi, tapi .. perl tidak bisa dipahami, ringkas dan garis batas gila. Bagaimana itu bisa lebih cocok untuk kode-golf?
dorothy
@dorothy ¯ \ _ (ツ) _ / ¯ Kami menghindarinya seperti wabah. Tak tahu kenapa, sungguh.
Addison Crump
2

Pyth, 37 byte

K^_B1lhJrR7.z_s*LldcRlKhMrSmms*VdkJK8

Suite uji

Ini agak sulit ketika Anda harus mengimplementasikan perkalian matriks secara manual.

Penjelasan:

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.
isaacg
sumber
Wow! :) Ini seperti banyak pekerjaan. Sekarang di mana orang-orang cjam .....?
dorothy
1

MATLAB, 196 194 187 184 126 154 byte

(Ekstra 28 byte dari 126 hingga 154 disebabkan oleh penguraian input: sekarang kode menerima input sebagai dua baris angka yang dipisahkan spasi.)

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

Versi tidak disatukan:

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

Saya bisa menghapus 6 byte jika "ans = ... tipe keluaran " diizinkan, saya tidak pernah yakin tentang ini.

Saya minta maaf untuk mengatakan bahwa solusi asli dan pasti lucu saya terlalu ungolfed dibandingkan dengan solusi saya saat ini. Ini juga pertama kalinya saya menggunakan accumarray. Aplikasi enam-input-parameter masih harus menunggu, :)

Output (berikut 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

Output dengan default 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
Andras Deak
sumber