Una volta avevo bisogno di scrivere una funzione che calcola l'entropia di blocco di una determinata serie di simboli per una data dimensione di blocco e sono rimasto sorpreso dalla breve durata del risultato. Quindi ti sfido a codegolf tale funzione. Non ti sto dicendo quello che ho fatto per ora (e in quale lingua), ma lo farò tra una settimana o giù di lì, se nessuno ha avuto prima le stesse idee o le idee migliori.
Definizione dell'entropia a blocchi:
Data una sequenza di simboli A = A_1,…, A_n e una dimensione del blocco m:
- Un blocco di dimensioni m è un segmento di m elementi consecutivi della sequenza di simboli, ovvero A_i,…, A_ (i + m − 1) per ogni i appropriato.
- Se x è una sequenza di simboli di dimensione m, N (x) indica il numero di blocchi di A che sono identici a x.
- p (x) è la probabilità che un blocco da A sia identico a una sequenza di simboli x di dimensione m, ovvero p (x) = N (x) / (n − m + 1)
- Infine, l'entropia del blocco per la dimensione del blocco m di A è la media di −log (p (x)) su tutti i blocchi x della dimensione m in A o (che è equivalente) la somma di −p (x) · log (p (x)) su ogni x di dimensione m presente in A. (Puoi scegliere qualsiasi logaritmo ragionevole che desideri.)
Limitazioni e chiarimenti:
- La tua funzione dovrebbe prendere come argomento la sequenza di simboli A e la dimensione del blocco m.
- Si può presumere che i simboli siano rappresentati come numeri interi a base zero o in un altro formato conveniente.
- Il tuo programma dovrebbe essere in grado di accettare qualsiasi argomento ragionevole in teoria e in realtà dovrebbe essere in grado di calcolare il caso di esempio (vedi sotto) su un computer standard.
- Le funzioni e le librerie integrate sono consentite, purché non eseguano grandi parti della procedura in una chiamata, vale a dire, estraendo tutti i blocchi di dimensione m da A, contando il numero di occorrenze di un dato blocco x o calcolando le entropie da una sequenza di valori p: devi fare queste cose da solo.
Test:
[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]
Le prime entropie a blocchi di questa sequenza sono (per il logaritmo naturale):
- 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))).