Cómo generar muestras similares a Zipf mediante el uso de lenguaje de secuencias de comandos

Cómo generar muestras similares a Zipf mediante el uso de lenguaje de secuencias de comandos

¿Existe alguna función de lenguaje de secuencias de comandos (como en pythono bash) que muestree undistribución tipo zipf, para exponente 0<a<=1.

PD: Soy consciente de la existencia deuna función numerosaeso puede generar muestras zipf, pero es solo para a >1.

Respuesta1

Basado en las ecuaciones básicas, ¿qué 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)

Utiliza sólo rutinas básicas integradas en el lenguaje. Podría convertirse a casi cualquier otro idioma, por ejemplo perl, ruby. Aquí tenéis una versión en awk:

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

El awkscript no requiere ningún archivo de entrada, pero sí requiere asignaciones de variables en la línea de comando:

$ /tmp/zipf.awk -vk=10 -vs=4 -vN=10
9.24183e-05

Respuesta2

¿No sería una pitón?distribución expovariada, con el valor correcto de lambda, ¿funciona?

información relacionada