엔트로피 계산


13

입력

M두 개의 공백으로 구분 된 정수 행으로 표시되는 행렬 입니다. 수는 최대 20 것이다 라인 당 정수의 숫자 각 라인은 정수의 동일한 수를 가지는 각 정수이어야 -1 또는 1 M따라서 것이다 2의해 n여기서 n두 줄의 각각의 정수 개수이다.

코드는 완전한 프로그램이어야합니다. 표준으로 또는 파일에서 입력을 받아들입니다 (선택). 표준 입력, 파일 또는 단순히 매개 변수로 입력을 승인 할 수 있습니다. 그러나 후자를 사용하는 경우 코드가 어떻게 작동 해야하는지에 대한 명확한 예를 제공하고 코드가 완전한 프로그램이어야하며 M입력에 행렬 이 표시되는 방법을 기억하십시오 . 다시 말해, 일부 구문 분석을 수행해야 할 가능성이 있습니다.

산출

이진 샤논 엔트로피 분포의 M*x요소가 어디에서 x균일 독립적 {-1,1}로부터 선택된다. xn차원의 열 벡터.

이산 확률 분포의 엔트로피는

- sum p_i log_2(p_i)

이 경우 가능한 고유 한 p_i확률입니다 .iM*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따라 "모두 다른"(이 경우 에는 in 값이 있고 각 값 은 동일 함 )에서 "모두 동일"(이 경우 단일 결과 및 ).MM*xnip_ip_i1/2^np_1 = 1

구체적으로, 위의 2x2행렬에 M대해 가능한 4 가지 구성 ( [+-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. 질문을 독립적으로 만들기 위해 이항 Shannon Shannon 엔트로피는 Mx어떻게 정의되어 있습니까?
피터 테일러

4
@Peter의 의견은 downvotes를 정확하게 설명합니다. 엔트로피에 대한 기사를 훑어 보았고 구현해야 할 것을 즉시 찾을 수 없었습니다. Shannon 엔트로피를 계산하는 공식 / 알고리즘을 정확히 지정해야합니다.
Lynn

5
어쨌든 질문은 독립적이어야한다. Wikipedia가 갑자기 오프라인이 될 가능성은 낮지 만, 도전 과제의 전체 사양을 이해하기 위해 다른 페이지를 클릭하지 않아도되는 것이 이상적입니다.
Doorknob

2
기본적으로 함수는 프로그램의 유효한 대안입니다. 이를 무시할 수는 있지만 파일이나 표준 입력을 가져 오려면 많은 상용구가 필요하기 때문에 일부 언어는 매우 슬프게됩니다. 더 광범위하게, 나는 수학적인 문제에 대해 그러한 제한적인 입력 형식을 사용하지 않는 것이 좋습니다. 언어의 자연 목록 유형을 허용하면 사람들이 더 행복하게 참여할 수 있습니다.
xnor

3
@dorothy는 "log_2 (0)은 편의상 0"이 아니라 "lim_ {p-> 0} p * log (p) == 0"이라는 점에 유의하십시오. 따라서 "log_2 (0)"은 여전히 ​​-inf입니다.
Andras Deak

답변:


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) 정보 엔트로피를 제공한다.

멋진 점 중 하나는 Mathematica 가 실제로 정확한 표현을 반환 한다는 것입니다 .

%["-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공백으로 구분 된 1또는 로 구성된 2 줄로 예상됩니다 -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의

@dorothy 코드 골퍼 가 대부분 Perl을 혐오 하기 때문 입니다.
Addison Crump

@FlagAsSpam 그러나 .. perl은 이해할 수없고 간결하며 경계가 제정신입니다. 코드 골프에 어떻게 적합 할 수 있습니까?
도로시

@dorothy ¯ \ _ (ツ) _ / ¯ 전염병처럼 피합니다. Dunno 왜, 정말.
Addison Crump

2

Pyth, 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 바이트

126에서 154 사이의 추가 28 바이트는 입력 구문 분석으로 인한 것입니다. 이제 코드는 입력을 공백으로 구분 된 두 줄로 입력합니다.

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

언 골프 버전 :

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 = ..."유형의 출력이 허용 된 경우 6 바이트를 제거 할 수 있습니다 . 확실하지 않습니다.

내 독창적이고 확실한 재치있는 솔루션이 현재 솔루션에 비해 너무 골치가 없다고 말해서 죄송합니다 . 이것은 또한 처음 사용하는 것 accumarray입니다. 그러나 6 입력 매개 변수 응용 프로그램은 여전히 ​​기다려야합니다.

출력 (다음 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.