Una vez necesitaba escribir una función que calcule la entropía de bloques de una serie de símbolos dada para un tamaño de bloque dado y me sorprendió lo corto que fue el resultado. Por lo tanto, te desafío a codegolf tal función. No te estoy diciendo lo que hice por ahora (y en qué idioma), pero lo haré en una semana más o menos, si a nadie se le ocurrieron las mismas o mejores ideas primero.
Definición de la entropía de bloque:
Dada una secuencia de símbolos A = A_1, ..., A_n y un tamaño de bloque m:
- Un bloque de tamaño m es un segmento de m elementos consecutivos de la secuencia de símbolos, es decir, A_i, ..., A_ (i + m − 1) para cualquier i apropiado.
- Si x es una secuencia de símbolos de tamaño m, N (x) indica el número de bloques de A que son idénticos a x.
- p (x) es la probabilidad de que un bloque de A sea idéntico a una secuencia de símbolos x de tamaño m, es decir, p (x) = N (x) / (n − m + 1)
- Finalmente, la entropía de bloque para el tamaño de bloque m de A es el promedio de −log (p (x)) sobre todos los bloques x de tamaño m en A o (que es equivalente) la suma de −p (x) · log (p (x)) sobre cada x de tamaño m que ocurre en A. (Puede elegir cualquier logaritmo razonable que desee).
Restricciones y aclaraciones:
- Su función debe tomar la secuencia de símbolos A, así como el tamaño de bloque m como argumento.
- Puede suponer que los símbolos se representan como enteros basados en cero o en otro formato conveniente.
- Su programa debería ser capaz de tomar cualquier argumento razonable en teoría y en realidad debería ser capaz de calcular el caso de ejemplo (ver más abajo) en una computadora estándar.
- Las funciones y bibliotecas incorporadas están permitidas, siempre que no realicen grandes porciones del procedimiento en una llamada, es decir, extraigan todos los bloques de tamaño m de A, contando el número de ocurrencias de un bloque dado x o calculando las entropías a partir de una secuencia de valores p: tienes que hacer esas cosas tú mismo.
Prueba:
[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]
Las primeras entropías de bloque de esta secuencia son (para el logaritmo natural):
- 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))).