
Existe alguma função de linguagem de script (como em python
ou bash
) que faça amostras de umdistribuição tipo zipf, para expoente 0<a<=1
.
PS: Estou ciente da existência deuma função numpyque pode gerar amostras zipf, mas é apenas para arquivos a >1
.
Responder1
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 integradas na linguagem. Pode ser convertido para 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 awk
script 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
Responder2
Não seria um Pythondistribuição expovariada, com o valor correto de lambda, funciona?