Antecedentes
Digamos que temos um alfabeto de A,B, C, D
, em seguida, examinamos alguns dados e encontramos uma "palavra" que é DDDDDDDDCDDDDDD
a chance de encontrar essa aleatória me parece baixa, enquanto a descoberta BABDCABCDACDBACD
parece menos aleatória.
Pergunta
Como devo verificar se as strings que encontro não são aleatórias?
Eu tentei algumas coisas em R, por exemplo, codificando as letras numericamente e comparando-as com permutações. Mas a codificação antecipada é bastante complicada, provavelmente existe uma abordagem mais direta para isso.
text-mining
randomness
CodeNoob
fonte
fonte
Respostas:
Por que isso seria? Se a proporção geral de letras A ... D é igual a 0,25 para cada letra e cada letra é independente da outra, as duas palavras são exatamente igualmente prováveis. Se a distribuição das letras for diferente, é claro que as probabilidades de gerar as duas palavras podem ser diferentes.
Você pode tentar encontrar palavras de "baixa complexidade", por exemplo, palavras com uma proporção especialmente alta de uma letra (você pode usar as informações de Shannon conforme sugerido na outra resposta e, na análise de sequência biológica, existem muitas outras abordagens), mas existem não é um teste para "aleatoriedade", pois sem outras suposições ou conhecimento sobre o que você está realmente analisando, o termo "aleatoriedade" não faz sentido.
fonte
Você pode tentar as informações de Shannon: onde, , é a contagem de algumas letras na palavra en.H=−∑i=0nPilog2(Pi) Pi=cin ci c n=|word|
Para a primeira palavra, você tem . Na segunda palavra, você tem .H=0.35 H=2
Se a entropia for alta, você pode pensar nela como mais aleatória do que outra palavra com menor entropia.
fonte
bababbaabb
eaaaabbbbbb
. A noção, reconhecidamente muito vaga, de "aleatoriedade" usada pelo OP provavelmente consideraria a primeira como "mais aleatória" que a segunda.Outras respostas aqui se concentraram na ocorrência geral de letras diferentes na sequência, que pode ser um aspecto da "aleatoriedade" esperada. No entanto, outro aspecto de interesse é a aparente aleatoriedade na ordem das letras na sequência. No mínimo, eu pensaria que a "aleatoriedade" implica a permutabilidade do vetor de letras, que pode ser testada usando um "teste de execução". O teste de execuções conta o número de "execuções" na sequência e compara o número total de execuções com sua distribuição nula sob a hipótese nula de permutabilidade, para um vetor com as mesmas letras. A definição exata do que constitui uma "execução" depende do teste específico (consulte, por exemplo, uma resposta semelhante aqui), mas neste caso, com categorias nominais, a definição natural é contar qualquer sequência consecutiva que consiste em apenas uma letra como uma "execução" única.
Por exemplo, sua sequência† n=16 r=16
BABD-CABC-DACD-BACD
parece prima facie não aleatória para mim (nenhuma letra aparece consigo mesma, o que provavelmente é incomum para uma sequência por tanto tempo). Para testar isso formalmente, podemos executar um teste de execução para troca. Nesta sequência, temos letras (quatro de cada letra) e existem execuções, cada uma consistindo em uma única instância de uma letra. O número observado de execuções pode ser comparado à sua distribuição nula sob a hipótese de permutabilidade. Podemos fazer isso via simulação, que gera uma distribuição nula simulada e um valor p para o teste. O resultado para esta sequência de caracteres é mostrado no gráfico abaixo.Para esta sequência, o valor de p para o teste de execuções (sob a hipótese nula de ) é . Isso é significativo no nível de significância de 10%, mas não no nível de significância de 5%. Há alguma evidência para sugerir uma série não permutável (isto é, ordem não aleatória), mas a evidência não é particularmente forte. Com uma sequência mais longa observada, o teste de execução teria maior poder para distinguir uma sequência trocável de uma sequência não trocável. (Como você pode ver, meu julgamento inicial prima facie de que essa sequência não é aleatória pode estar errada - o valor de p não é tão baixo quanto eu esperava.)p=0.0537
Por fim, é importante observar que esse teste apenas analisa a aleatoriedade da ordem das letras na sequência - toma o número de letras de cada tipo como uma entrada fixa. Este teste detectará não aleatoriedade no sentido de não permutabilidade das letras na sequência, mas não testará "aleatoriedade" no sentido de probabilidades gerais de letras diferentes. Se o último também fizer parte do significado especificado de "aleatoriedade", esse teste de execução poderá ser aumentado com outro teste que analise as contagens gerais das letras e o compare com uma distribuição nula hipotética.
Código R: O gráfico e o valor p acima foram gerados usando o seguinte
R
código:fonte
Supondo que a sequência de letras seja longa o suficiente, você pode aplicar testes de aleatoriedade nos dados.
Um conjunto desses testes é chamado de testes obstinados :
Eles envolvem um conjunto de testes, talvez arbitrário, como:
Uma boa sequência de dados aleatórios deve passar nesses testes.
No entanto, passar nesses testes não é suficiente para provar que os números realmente não codificam um sinal real. Eles podem ser a saída de uma rotina de criptografia de alta qualidade.
fonte