Uma vez eu precisei escrever uma função que calcula a entropia de bloco de uma determinada série de símbolos para um determinado tamanho de bloco e fiquei surpreso com o quão curto o resultado foi. Portanto, estou desafiando você a codificar essa função. Não estou lhe dizendo o que fiz por enquanto (e em que idioma), mas falarei daqui a uma semana, se ninguém tiver as mesmas ou melhores idéias primeiro.
Definição da entropia do bloco:
Dada uma sequência de símbolos A = A_1,…, A_n e um tamanho de bloco m:
- Um bloco de tamanho m é um segmento de m elementos consecutivos da sequência de símbolos, ou seja, A_i,…, A_ (i + m-1) para qualquer i apropriado.
- Se x é uma sequência de símbolos de tamanho m, N (x) indica o número de blocos de A que são idênticos a x.
- p (x) é a probabilidade de um bloco de A ser idêntico a uma sequência de símbolos x de tamanho m, ou seja, p (x) = N (x) / (n − m + 1)
- Finalmente, a entropia de bloco para o tamanho do bloco m de A é a média do log (p (x)) sobre todos os blocos x do tamanho m em A ou (o que é equivalente) a soma de -p (x) · log (p (x)) em cada x de tamanho m ocorrendo em A. (Você pode escolher qualquer logaritmo razoável que desejar.)
Restrições e esclarecimentos:
- Sua função deve usar a sequência de símbolos A e o tamanho do bloco m como argumento.
- Você pode assumir que os símbolos são representados como números inteiros baseados em zero ou em outro formato conveniente.
- Seu programa deve ser capaz de adotar qualquer argumento razoável em teoria e, na realidade, ser capaz de calcular o caso de exemplo (veja abaixo) em um computador padrão.
- Funções e bibliotecas integradas são permitidas, desde que não executem grandes partes do procedimento em uma chamada, ou seja, extraindo todos os blocos de tamanho m de A, contando o número de ocorrências de um determinado bloco x ou calculando as entropias a partir de uma sequência de valores p - você mesmo deve fazer essas coisas.
Teste:
[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]
As primeiras entropias de bloco desta sequência são (para o 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)))
.