J'ai eu besoin d'écrire une fonction qui calcule l'entropie de blocs d'une série de symboles donnée pour une taille de bloc donnée et j'ai été surpris de la brièveté du résultat. Je vous mets donc au défi de coder une telle fonction. Je ne vous dis pas ce que j'ai fait pour l'instant (et dans quelle langue), mais je le ferai dans une semaine environ, si personne ne propose les mêmes ou meilleures idées en premier.
Définition de l'entropie du bloc:
Étant donné une séquence de symboles A = A_1,…, A_n et une taille de bloc m:
- Un bloc de taille m est un segment de m éléments consécutifs de la séquence de symboles, c'est-à-dire A_i,…, A_ (i + m − 1) pour tout i approprié.
- Si x est une séquence de symboles de taille m, N (x) désigne le nombre de blocs de A qui sont identiques à x.
- p (x) est la probabilité qu'un bloc de A soit identique à une séquence de symboles x de taille m, c'est-à-dire p (x) = N (x) / (n − m + 1)
- Enfin, l'entropie des blocs pour la taille de bloc m de A est la moyenne de −log (p (x)) sur tous les blocs x de taille m dans A ou (ce qui est équivalent) la somme de −p (x) · log (p (x)) sur chaque x de taille m se produisant dans A. (Vous pouvez choisir n'importe quel logarithme raisonnable que vous souhaitez.)
Restrictions et clarifications:
- Votre fonction doit prendre comme argument la séquence de symboles A ainsi que la taille de bloc m.
- Vous pouvez supposer que les symboles sont représentés sous forme d'entiers à base zéro ou dans un autre format pratique.
- Votre programme devrait être capable de prendre n'importe quel argument raisonnable en théorie et en réalité devrait être capable de calculer l'exemple de cas (voir ci-dessous) sur un ordinateur standard.
- Les fonctions et bibliothèques intégrées sont autorisées, tant qu'elles n'effectuent pas de grandes parties de la procédure en un seul appel, c'est-à-dire extraire tous les blocs de taille m de A, compter le nombre d'occurrences d'un bloc x donné ou calculer les entropies à partir d'une séquence de valeurs p - vous devez faire ces choses vous-même.
Tester:
[2, 3, 4, 1, 2, 3, 0, 0, 3, 2, 3, 0, 2, 2, 4, 4, 4, 1, 1, 1, 0, 4, 1,
2, 2, 4, 0, 1, 2, 3, 0, 2, 3, 2, 3, 2, 0, 1, 3, 4, 4, 0, 2, 1, 4, 3,
0, 2, 4, 1, 0, 4, 0, 0, 2, 2, 0, 2, 3, 0, 0, 4, 4, 2, 3, 1, 3, 1, 1,
3, 1, 3, 1, 0, 0, 2, 2, 4, 0, 3, 2, 2, 3, 0, 3, 3, 0, 0, 4, 4, 1, 0,
2, 3, 0, 0, 1, 4, 4, 3]
Les premières entropies de blocs de cette séquence sont (pour le logarithme naturel):
- m = 1: 1,599
- m = 2: 3,065
- m = 3: 4,067
- m = 4: 4,412
- m = 5: 4,535
- m = 6: 4,554
entropy(probabilities(blocks(A,m))).