エントロピーの計算


13

入力

M2つのスペースで区切られた整数の行として表される行列。各行整数の同じ数を有し、各整数のいずれかであろう-1又は線当たり整数の1数が最も20であろうが M故になり2によってn場合n2本のラインのそれぞれに整数の数です。

コードは完全なプログラムでなければなりません。標準入力またはファイルからの入力を受け入れます(これは選択です)。標準入力、ファイル、または単にパラメータとして入力を受け入れることができます。ただし、後者を行う場合は、コードがどのように機能するかを明示的に示し、完全なプログラムでなければならずM、入力でマトリックスがどのように表されるかを覚えておいてください。言い換えれば、あなたは何らかの解析をしなければならない可能性が高いです。

出力

の要素が{-1,1}から均一かつ独立して選択される分布のバイナリシャノンエントロピー。 は、次元の列ベクトルです。M*xxxn

離散確率分布のエントロピーは

- 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「すべて異なる」(この場合はinのn値がiありp_i、それぞれp_iがに等しい1/2^n)から「すべて同じ」(この場合は単一の可能性があります)結果、およびp_1 = 1)。

具体的には、上記の2x2行列の場合M、4つの可能な構成([+-1; +-1])を乗算することで、結果の各ベクトルが異なることがわかります。そのため、この場合、4つの結果があり、結果としてp_1 = p_2 = p_3 = p_4 = 1/2^2 = 1/4log_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
@Peterのコメントは、ダウン投票を正確に説明しています。エントロピーに関する記事をざっと読みましたが、何を実装すべきかすぐにはわかりません。シャノンエントロピーを計算するための式/アルゴリズムを正確に指定する必要があります。
リン

5
とにかく、質問は自己完結型でなければなりません。ウィキペディアが突然オフラインになることはまずありませんが、チャレンジの完全な仕様を理解できるようにするために、別のページをクリックする必要はありません。
ドアノブ

2
デフォルトでは、関数はプログラムの有効な代替手段です。これを無視することはできますが、ファイルや標準入力を取得するのに多くの定型文が必要になるため、一部の言語は非常に悲しくなります。より広範には、数学的な課題でこのような制限的な入力形式を使用しないことをお勧めします。言語の自然なリストタイプを許可すると、人々が参加しやすくなります。
xnor

3
@dorothyは、「log_2(0)は便宜上0である」のではなく、「lim_ {p-> 0} p * log(p)== 0」であることに注意してください。したがって、「log_2(0)」はまだ-infです。
アンドラスDeak

回答:


3

Mathematica、48 68バイト

編集:パラメーターとして文字列を受け入れるための前処理が追加されました。

助けを借りてTuplesEntropy、実装は簡潔で読みやすいの両方です。

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

は、からのTuples[{-1,1},n]可能なすべてのnタプル{-1,1}Entropy[2,list]提供し、ベース2の情報エントロピーを提供します。

すばらしいことの1つは、Mathematicaが実際に正確な式を返すことです。

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

.追加の(Entropy[2., ...)を追加すると、おおよその結果が得られます。


Mathematicaはばかげている:)しかし、あなたの答えは仕様に完全には適合していません。入力はスペースで区切られているため、解析が必要になります。最新のアップデートをご覧ください。
ドロシー

3

Perl、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に十分なperlの答えがありません。
ドロシー

@dorothyそれは、ほとんどの場合、コード愛好家が Perlを嫌うからです。
アディソンクランプ

@FlagAsSpamしかし、しかし.. perlは理解できず、簡潔で境界線が狂っています。それはどのように可能性がより多くのコードゴルフに適しましたか?
ドロシー

@dorothy¯\ _(ツ)_ /¯ペストのようにそれを避けます。どうしてダノ。
アディソンクランプ

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バイトは、入力の解析によるものです。コードは、空白で区切られた2行の入力として入力を受け入れます。)

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.