Como gerar amostras do tipo Zipf, usando linguagem de script

1

Existe alguma função de linguagem de script (como em python ou bash ) que as amostras de um distribuição do tipo zipf , para o expoente 0<a<=1 .

PS: Estou ciente da existência de um função numpy que pode gerar amostras zipf, mas é apenas para a >1 .

    
por Richard 20.03.2012 / 16:20

2 respostas

2

Com base nas equações básicas, que tal:

#!/usr/bin/python
import sys
k = float(sys.argv[1])
s = float(sys.argv[2])
N = int(sys.argv[3])
def zipf(k, s, N):
    return (1/k**s) / sum(1/n**s for n in range(1, N+1))
print zipf(k, s, N)

Usa apenas rotinas básicas incorporadas no idioma. Poderia ser convertido em praticamente qualquer outro idioma, por exemplo, perl , ruby . Aqui está uma versão em awk :

#!/bin/awk -f
BEGIN {
    for (n=1; n<=N; n++) {
        den=den+1/n^s;
    }
    print (1/(k^s))/den;
}

O script awk não requer arquivo de entrada, mas exige atribuições de variáveis na linha de comando:

$ /tmp/zipf.awk -vk=10 -vs=4 -vN=10
9.24183e-05
    
por 20.03.2012 / 17:08
0

Não seria uma distribuição expovariada do Python, com o valor correto de lambda, work?

    
por 20.03.2012 / 16:32