¿Cuáles son los mejores métodos para generar con precisión enteros aleatorios distribuidos de acuerdo con una ley de potencia? La probabilidad de obtener ( ) debería ser igual a y el método debería funcionar bien para cualquier .
Puedo ver dos enfoques ingenuos:
Calcule hasta un gran para que esté "lo suficientemente cerca" de 1, luego genere números enteros de acuerdo con estas probabilidades. Esto simplemente no funcionará si está cerca de 1 ya que necesitaría ser enorme.
Dibuje números reales de una distribución continua de la ley de potencia (un problema más fácil que sé cómo resolver) y redondee a los enteros de alguna manera. Es posible calcular analíticamente la probabilidad precisa de obtener cada número entero con el método anterior. Podría usar el rechazo para corregirlos en (que también se puede calcular siempre que pueda evaluar la ). (Esto sería un poco complicado ya que tendría que redondear de manera que obtenga enteros con mayor probabilidad que para mayor que algún valor pequeño, y manejar menos que eso por separado).
¿Existe un método mejor que también sea preciso (no aproximado)?
fuente
Respuestas:
Creo que (una versión ligeramente modificada de) el método 2 es bastante sencillo, en realidad
Usando la definición de la función de distribución de Pareto dada en Wikipedia
si toma y entonces la relación de a se maximiza en , lo que significa que puede escalar según la relación en y usar un muestreo de rechazo directo. Parece ser razonablemente eficiente.xm=12 α=γ px qx=FX(x+12)−FX(x−12) x=1 x=1
Para ser más explícito: si genera a partir de un Pareto con y y redondea al entero más cercano (en lugar de truncar), entonces parece posible utilizar el muestreo de rechazo con : cada valor generado de de ese proceso se acepta con probabilidad .xm=12 α=γ M=p1/q1 x pxMqx
( aquí fue ligeramente redondeado ya que soy flojo; en realidad, el ajuste para este caso sería un poco diferente, pero no lo suficiente como para verse diferente en la trama; de hecho, la imagen pequeña hace que parezca un poco demasiado pequeño cuando en realidad es una fracción demasiado grande)M
Un ajuste más cuidadoso de y ( para entre 0 y 1) probablemente aumentaría aún más la eficiencia, pero este enfoque funciona razonablemente bien en los casos con los que he jugado.xm α α=γ−a a
Si puede dar una idea del rango típico de valores de , puedo echar un vistazo más de cerca a la eficiencia allí.γ
El método 1 se puede adaptar para ser exacto, también, realizando el método 1 casi siempre, y luego aplicando otro método para lidiar con la cola. Esto se puede hacer de maneras muy rápidas.
Por ejemplo, si toma un vector entero de longitud 256 y llena los primeros valores de con , los siguientes valores de con y así sucesivamente hasta , eso será casi usa toda la matriz. Las pocas celdas restantes indican luego pasar a un segundo método que combina el manejo de la cola derecha y también los pequeños bits de probabilidad 'sobrantes' de la parte izquierda.⌊256p1⌋ ⌊256p2⌋ 256pi<1
1
2
El remanente izquierdo se puede hacer mediante una serie de enfoques (incluso con, digamos 'cuadrar el histograma' si está automatizado, pero no tiene que ser tan eficiente como eso), y la cola derecha se puede hacer usando algo como el enfoque de aceptar-rechazar anterior.
El algoritmo básico consiste en generar un número entero de 1 a 256 (que requiere solo 8 bits del rng; si la eficiencia es primordial, las operaciones de bits pueden sacarlos de la parte superior, dejando el resto del número uniforme (lo mejor sería dejado como un valor entero no normalizado hasta este punto) que puede usarse para tratar el remanente izquierdo y la cola derecha si es necesario.
Cuidadosamente implementado, este tipo de cosas puede ser muy rápido. Puede usar diferentes valores de que 256 (por ejemplo, podría ser una posibilidad), pero no todo es igual. Sin embargo, si toma una tabla muy grande, puede que no queden suficientes bits en el uniforme para que sea adecuada para generar la cola y necesita un segundo valor uniforme allí (pero rara vez se necesita, por lo que no es demasiado un problema)2k 216
En el mismo ejemplo de zeta (2) que el anterior, tendría 212
1
's, 262
' s, 73
's, 34
' s, uno5
y los valores de 250-256 tratarían con el remanente. Más del 97% del tiempo genera uno de los valores de la tabla (1-5).fuente
Hasta donde yo sé, el estado del arte en leyes de poder es el documento de Clauset, Shalizi y Newman que discute su problema en el Apéndice D. Note en particular (donde es un dibujo de una ley de poder continua) dicen:y
Como alternativa a la respuesta aceptada, Clauset et al. El método para obtener dibujos precisos de la distribución de la ley de potencia discreta es dibujar un aleatorio uniforme y luego hacer donde es el cdf complementario de la ley de potencia discreta. Necesita la función zeta para calcular pero solo debe calcularse con cierta precisión, por lo que es posible generar sorteos que tengan la distribución discreta de la ley de potencia de esta manera. Necesitas usar el método de bisección para resolver la ecuación .r∈[0,1) x=P−1(1−r) P(x)=∑∞a=xP(X=a) P(x) P(x)=1−r
Debido a que el cálculo exacto es costoso, también se proporciona un método aproximado, que es definir que no es lo mismo que solo redondear valores de la ley de potencia continua. El error de esta aproximación se da en la ecuación (D.7) de Clauset et al. y depende de .
fuente