Tính toán entropy


13

Đầu vào

Một ma trận được Mbiểu diễn dưới dạng hai dòng số nguyên cách nhau. Mỗi dòng sẽ có cùng số nguyên và mỗi số nguyên sẽ là một trong hai hoặc -1 1. Số lượng các số nguyên trên mỗi dòng sẽ có mặt tại hầu hết 20. Mdo đó sẽ 2do nnơi nlà số nguyên trên mỗi hai dòng.

Mã của bạn phải là một chương trình hoàn chỉnh. và chấp nhận đầu vào theo tiêu chuẩn trong hoặc từ một tệp (đó là lựa chọn của bạn). Bạn có thể chấp nhận đầu vào từ tiêu chuẩn trong, từ một tệp hoặc đơn giản là một tham số. Tuy nhiên, nếu bạn thực hiện sau, vui lòng cho một ví dụ rõ ràng về cách mã của bạn sẽ hoạt động và nhớ rằng đó phải là một chương trình hoàn chỉnh và cách ma trận Msẽ được thể hiện trong đầu vào. Nói cách khác, bạn có khả năng phải thực hiện một số phân tích cú pháp.

Đầu ra

Các Shannon entropy nhị phân của sự phân bố của M*xnơi các phần tử của xđược lựa chọn thống nhất và độc lập từ {-1,1}. xlà một nvectơ cột hai chiều.

Entropy của phân phối xác suất rời rạc là

- sum p_i log_2(p_i)

Trong trường hợp này, p_ilà xác suất của ithứ duy nhất có thể M*x.

Ví dụ và gợi ý hữu ích

Như một ví dụ làm việc, chúng ta hãy ma trận Mđược

-1 1
-1 -1

Bây giờ nhìn vào tất cả 2^2các vectơ có thể khác nhau x. Đối với mỗi một, chúng tôi tính toán M*xvà đặt tất cả các kết quả trong một mảng (một mảng 4 phần tử của các vectơ 2 thành phần). Mặc dù đối với mỗi trong số 4 vectơ xác suất xảy ra là 1/2^2 = 1/4, chúng tôi chỉ quan tâm đến số lần mỗi vectơ kết quả duy nhấtM*x xảy ra, và vì vậy chúng tôi tổng hợp các xác suất riêng lẻ của các cấu hình dẫn đến cùng một vectơ duy nhất. Nói cách khác, các M*xvectơ duy nhất có thể mô tả kết quả của phân phối mà chúng tôi đang nghiên cứu và chúng tôi phải xác định xác suất của mỗi kết quả này (sẽ được xây dựng, luôn luôn là bội số nguyên 1/2^2hoặc 1/2^nnói chung) tính toán entropy.

Trong ntrường hợp chung , tùy thuộc vào Mkết quả M*xcó thể có của phạm vi có thể từ "tất cả khác nhau" (trong trường hợp này, chúng tôi có ncác giá trị itrong p_ivà mỗi giá trị p_ibằng 1/2^n), cho "tất cả giống nhau" (trong trường hợp này có một khả năng duy nhất kết quả, và p_1 = 1).

Cụ thể, đối với 2x2ma trận trên, Mchúng ta có thể tìm thấy bằng cách nhân nó với bốn cấu hình có thể ( [+-1; +-1]), rằng mỗi vectơ kết quả là khác nhau. Vì vậy, trong trường hợp này, có bốn kết quả, và do đó p_1 = p_2 = p_3 = p_4 = 1/2^2 = 1/4. Nhắc lại rằng log_2(1/4) = -2chúng ta có:

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

Vì vậy, đầu ra cuối cùng cho ma trận này là 2.

Các trường hợp thử nghiệm

Đầu vào:

-1 -1 
-1 -1

Đầu ra:

1.5

Đầu vào:

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

Đầu ra:

2.03063906223

Đầu vào:

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

Đầu ra:

3

7
1. kích thước của là xgì? 2. Trong lợi ích của việc làm cho câu hỏi trở nên khép kín, entropy nhị phân của Shannon Mxđược định nghĩa như thế nào?
Peter Taylor

4
Nhận xét của @ Peter giải thích chính xác các downvote. Tôi đọc lướt bài viết về entropy và ngay lập tức tôi không thể tìm ra những gì cần thực hiện. Bạn nên xác định chính xác công thức / thuật toán là gì để tính toán entropy của Shannon.
Lynn

5
Các câu hỏi nên được khép kín, dù sao; Wikipedia không chắc sẽ đột ngột ngoại tuyến, nhưng thật lý tưởng khi không phải nhấp qua trang khác để có thể hiểu được thông số kỹ thuật đầy đủ của thử thách.
Doorknob

2
Theo mặc định, các chức năng là một lựa chọn thay thế hợp lệ cho các chương trình. Bạn được phép ghi đè lên điều đó, nhưng nó sẽ làm cho một số ngôn ngữ rất buồn vì phải mất nhiều bản soạn sẵn để lấy tệp hoặc đầu vào stdin. Rộng hơn, tôi khuyên bạn không nên có một định dạng đầu vào hạn chế như vậy đối với một thách thức toán học. Cho phép loại danh sách tự nhiên của ngôn ngữ sẽ khiến mọi người vui vẻ hơn khi tham gia.
xnor

3
@dorothy lưu ý rằng không phải "log_2 (0) là 0 để thuận tiện", mà là "lim_ {p-> 0} p * log (p) == 0". Vì vậy, "log_2 (0)" vẫn còn -inf.
Andras Deak

Câu trả lời:


3

Toán học, 48 68 byte

Chỉnh sửa: Tiền xử lý được thêm vào để chấp nhận chuỗi làm tham số.

Với sự giúp đỡ của TuplesEntropy, việc thực hiện vừa ngắn gọn vừa dễ đọc.

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

nơi Tuples[{-1,1},n]cung cấp tất cả các dữ liệu có thể ntừ {-1,1}Entropy[2,list]cung cấp entropy thông tin cơ sở-2.

Một trong những điều thú vị là Mathicala thực sự sẽ trả lại một biểu thức chính xác:

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

Kết quả gần đúng có thể đạt được với một bổ .sung ( Entropy[2., ...).


Mathematica thật lố bịch :) Tuy nhiên câu trả lời của bạn không hoàn toàn phù hợp với thông số kỹ thuật. Đầu vào là không gian được phân tách nên sẽ cần một số phân tích cú pháp. Xem bản cập nhật mới nhất.
dorothy

3

Perl, 160 159 141 byte

bao gồm +1 cho -pkể từ khi cập nhật 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;

Đầu vào dự kiến STDINlà 2 dòng bao gồm khoảng cách 1hoặc -1.
Chạy như perl -p 140.pl < inputfile.

Nó sẽ không giành được bất kỳ giải thưởng nào, nhưng tôi nghĩ tôi muốn chia sẻ nỗ lực của mình.
Giải thích:

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

DỮ LIỆU

  • cập nhật 159: lưu 1 bằng cách loại bỏ ()bằng cách sử dụng **thay vì <<.
  • cập nhật 141: lưu 18 bằng cách sử dụng $.-p.

1
Cảm ơn bạn! Chúng tôi không có đủ câu trả lời perl trên ppcg imho
dorothy

@dorothy Đó là vì những người chơi gôn mã rất ghét Perl.
Addison Crump

@FlagAsSpam Nhưng, nhưng .. perl là không thể hiểu được, cô đọng và điên rồ. Làm thế nào nó có thể phù hợp hơn cho golf-code?
dorothy

@dorothy \ _ (ツ) _ / Chúng tôi tránh nó như bệnh dịch hạch. Tại sao, thực sự.
Addison Crump

2

Bình thường, 37 byte

K^_B1lhJrR7.z_s*LldcRlKhMrSmms*VdkJK8

Bộ kiểm tra

Điều này có phần phức tạp hơn khi bạn phải tự thực hiện phép nhân ma trận.

Giải trình:

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.

Ồ :) Điều này có vẻ như rất nhiều công việc. Bây giờ những người cjam ở đâu .....?
dorothy

1

MATLAB, 196 194 187 184 126 154 byte

(Thêm 28 byte từ 126 đến 154 là do phân tích cú pháp đầu vào: bây giờ mã chấp nhận đầu vào dưới dạng hai dòng số được phân tách bằng khoảng trắng.)

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

Phiên bản bị đánh cắp:

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

Tôi có thể loại bỏ 6 byte nếu ans = ...loại đầu ra "" được cho phép, tôi không bao giờ chắc chắn về điều này.

Tôi rất tiếc phải nói rằng giải pháp dí dỏm và chắc chắn ban đầu của tôi quá vô dụng so với giải pháp hiện tại của tôi. Đây cũng là lần đầu tiên tôi sử dụngaccumarray . Một ứng dụng sáu tham số đầu vào vẫn phải chờ, mặc dù :)

Đầu ra (sau 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

Đầu ra với mặc định 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.