Calcul de l'entropie


13

Contribution

Une matrice Mreprésentée par deux lignes d'entiers séparées par des espaces. Chaque ligne aura le même nombre d'entiers et chaque entier sera soit -1 soit 1. Le nombre d'entiers par ligne sera au maximum de 20. Msera donc 2par nnest le nombre d'entiers sur chacune des deux lignes.

Votre code doit être un programme complet. et acceptez l'entrée soit en standard dans ou à partir d'un fichier (c'est votre choix). Vous pouvez accepter l'entrée de la norme dans, d'un fichier ou simplement comme paramètre. Cependant, si vous faites ce dernier, veuillez donner un exemple explicite du fonctionnement de votre code et n'oubliez pas qu'il doit s'agir d'un programme complet et de la manière dont la matrice Msera représentée dans l'entrée. En d'autres termes, vous devrez probablement effectuer une analyse.

Production

L' entropie binaire de Shannon de la distribution de l' M*xendroit où les éléments de xsont uniformément et indépendamment choisis parmi {-1,1}. xest un nvecteur de colonne à plusieurs dimensions.

L'entropie d'une distribution de probabilité discrète est

- sum p_i log_2(p_i)

Dans ce cas, p_i est la probabilité du ie unique possible M*x.

Exemple et conseils utiles

Comme exemple, laissez la matrice Mêtre

-1 1
-1 -1

Regardez maintenant tous les 2^2différents vecteurs possibles x. Pour chacun, nous calculons M*xet mettons tous les résultats dans un tableau (un tableau à 4 éléments de vecteurs à 2 composants). Bien que pour chacun des 4 vecteurs, la probabilité qu'il se produise est 1/2^2 = 1/4, nous ne sommes intéressés que par le nombre de fois que chaque vecteur résultant uniqueM*x se produit, et donc nous résumons les probabilités individuelles des configurations conduisant aux mêmes vecteurs uniques. En d'autres termes, les M*xvecteurs uniques possibles décrivent les résultats de la distribution que nous étudions, et nous devons déterminer la probabilité de chacun de ces résultats (qui, par construction, sera toujours un multiple entier de 1/2^2, ou 1/2^nen général) pour calculer l'entropie.

Dans le ncas général , en fonction Mdes résultats possibles de M*xpeut varier de «tous différents» (dans ce cas, nous avons des nvaleurs de iin p_i, et chacun p_iest égal à 1/2^n), à «tout de même» (dans ce cas, il existe un seul résultat, et p_1 = 1).

Plus précisément, pour la 2x2matrice ci-dessus , Mnous pouvons trouver en la multipliant par les quatre configurations possibles ( [+-1; +-1]), que chaque vecteur résultant est différent. Donc, dans ce cas, il y a quatre résultats, et par conséquent p_1 = p_2 = p_3 = p_4 = 1/2^2 = 1/4. Rappelant que log_2(1/4) = -2nous avons:

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

La sortie finale de cette matrice est donc 2.

Cas de test

Contribution:

-1 -1 
-1 -1

Production:

1.5

Contribution:

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

Production:

2.03063906223

Contribution:

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

Production:

3

7
1. Quelles sont les dimensions de x? 2. Afin de rendre la question autonome, comment Mxdéfinit-on l' entropie binaire de Shannon ?
Peter Taylor

4
@ Le commentaire de Peter explique exactement les votes négatifs. J'ai survolé l'article sur l'entropie, et je ne peux pas immédiatement savoir quoi mettre en œuvre. Vous devez spécifier exactement quelle est la formule / algorithme pour calculer l'entropie de Shannon.
Lynn

5
Les questions devraient être autonomes, de toute façon; il est peu probable que Wikipédia se déconnecte soudainement, mais il serait idéal de ne pas avoir à cliquer sur une autre page pour pouvoir comprendre la spécification complète du défi.
Poignée de porte

2
Par défaut, les fonctions sont une alternative valide aux programmes. Vous êtes autorisé à outrepasser cela, mais cela rendra certaines langues très tristes car il faut beaucoup de passe-partout pour prendre le fichier ou l'entrée stdin. Plus largement, je déconseille d'avoir un format d'entrée aussi restrictif sur un défi mathématique. Autoriser le type de liste naturelle de la langue rendrait les gens plus heureux de participer.
2015

3
@dorothy note que ce n'est pas que "log_2 (0) est 0 pour plus de commodité", mais plutôt "lim_ {p-> 0} p * log (p) == 0". Donc "log_2 (0)" est toujours -inf.
Andras Deak

Réponses:


3

Mathematica, 48 68 octets

Modifier: un prétraitement est ajouté pour accepter la chaîne comme paramètre.

Avec l'aide de Tupleset Entropy, l'implémentation est à la fois concise et lisible.

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

Tuples[{-1,1},n]donne tous les n-tuples possibles {-1,1}et Entropy[2,list]donne l'entropie des informations de base-2.

L'une des choses intéressantes est que Mathematica retournera en fait une expression précise:

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

Un résultat approximatif peut être obtenu avec un ajout .supplémentaire ( Entropy[2., ...).


Mathematica est ridicule :) Cependant, votre réponse ne correspond pas tout à fait à la spécification. L'entrée est séparée par des espaces donc une analyse sera nécessaire. Voir la dernière mise à jour.
dorothy

3

Perl, 160 159 141 octets

inclut +1 pour la -pmise à jour depuis 141 octets

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

L'entrée est attendue sur STDIN2 lignes constituées de 1ou séparés par des espaces -1.
Courir commeperl -p 140.pl < inputfile .

Il ne gagnera aucun prix, mais je pensais partager mes efforts.
Expliqué:

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

LES DONNÉES

  • mise à jour 159: enregistrez 1 en éliminant ()en utilisant **au lieu de <<.
  • mise à jour 141: économisez 18 en utilisant $.et -p.

1
Je vous remercie! Nous n'avons pas assez de réponses Perl sur PPCG IMHO
Dorothy

@dorothy C'est parce que les golfeurs de code détestent Perl, pour la plupart.
Addison Crump

@FlagAsSpam Mais, mais .. perl est incompréhensible, succinct et borderline fou. Comment pourrait-il être plus adapté au code-golf?
dorothy

@dorothy ¯ \ _ (ツ) _ / ¯ Nous l'évitons comme la peste. Je ne sais pas vraiment pourquoi.
Addison Crump

2

Pyth, 37 octets

K^_B1lhJrR7.z_s*LldcRlKhMrSmms*VdkJK8

Suite de tests

C'est un peu plus compliqué lorsque vous devez implémenter manuellement la multiplication matricielle.

Explication:

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.

Hou la la! :) Cela ressemble à beaucoup de travail. Maintenant, où sont les cjam .....?
dorothy

1

MATLAB, 196 194 187 187 184 126 154 octets

(Les 28 octets supplémentaires de 126 à 154 sont dus à l'analyse des entrées: maintenant le code accepte l'entrée comme deux lignes de nombres séparés par des espaces.)

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

Version non golfée:

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

Je pourrais supprimer 6 octets si un "ans = ... " type de sortie était autorisé, je n'en suis jamais sûr.

Je suis désolé de dire que ma solution originale et sûrement pleine d'esprit était bien trop dépouillée par rapport à ma solution actuelle. C'est aussi la première fois que j'utilise accumarray. Une application à six paramètres d'entrée doit encore attendre, cependant :)

Sorties (suivantes 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

Sorties avec la valeur par défaut 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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.