Génération précise de variations à partir d'une distribution de loi de puissance discrète

8

Quelles sont les meilleures méthodes pour générer avec précision des nombres entiers aléatoires répartis selon une loi de puissance? La probabilité d'obtenir ( ) doit être égale à et la méthode devrait bien fonctionner pour tout .kk=1,2,pk=kγ/ζ(γ)γ>1

Je peux voir deux approches naïves:

  1. Calculez jusqu'à un grand sorte que soit "assez proche" de 1, puis générez des entiers en fonction de ces probabilités. Cela ne fonctionnera tout simplement pas si est proche de 1 car devrait être énorme.pkkmaxk=1kmaxγkmax

  2. Dessinez des nombres réels à partir d'une distribution de loi de puissance continue (un problème plus facile que je sais résoudre) et arrondissez-les en entiers d'une manière ou d'une autre. Il est possible de calculer analytiquement la probabilité précise d'obtenir chaque entier avec la méthode ci-dessus. Je pourrais utiliser le rejet pour les corriger en (qui peut également être calculé à condition que je puisse évaluer la fonction ). (Ce serait un peu poilu car je devrais arrondir de manière à obtenir des entiers avec une probabilité plus élevée que pour supérieur à une petite valeur et gérer moins que cela séparément.)pkζpkkk

Existe-t-il une meilleure méthode qui soit également précise (non approximative)?

Szabolcs
la source
2
Je ne recherche pas de logiciels prêts à l'emploi. Je cherche des méthodes.
Szabolcs
Avez-vous trouvé les méthodes?
syko

Réponses:

6

Je pense que (une version légèrement modifiée de) la méthode 2 est assez simple, en fait

Utilisation de la définition de la fonction de distribution de Pareto donnée dans Wikipedia

FX(x)={1(xmx)αxxm,0x<xm,

si vous prenez et alors le rapport de à est maximisé à , ce qui signifie que vous pouvez simplement mettre à l'échelle le rapport à et utiliser un échantillonnage de rejet direct. Il semble être relativement efficace.xm=12α=γpxqx=FX(x+12)FX(x12)x=1x=1

Pour être plus explicite: si vous générez à partir d'un Pareto avec et et arrondissez à l'entier le plus proche (plutôt que tronqué), alors il semble possible d'utiliser l'échantillonnage de rejet avec - chaque valeur générée de partir de ce processus est acceptée avec probabilité .xm=12α=γM=p1/q1xpxMqx

entrez la description de l'image ici

( ici a été légèrement arrondi car je suis paresseux; en réalité, l'ajustement pour ce cas serait un tout petit peu différent, mais pas assez pour avoir l'air différent dans l'intrigue - en fait, la petite image lui donne l'air un peu trop petit quand c'est en fait une fraction trop grande)M

Un réglage plus soigneux de et ( pour certains entre 0 et 1 disons) augmenterait probablement encore l'efficacité, mais cette approche fonctionne assez bien dans les cas avec lesquels j'ai joué.xmαα=γaa

Si vous pouvez donner une idée de la plage typique de valeurs de je peux y regarder de plus près l'efficacité.γ


La méthode 1 peut également être adaptée pour être exacte, en exécutant presque toujours la méthode 1, puis en appliquant une autre méthode pour traiter la queue. Cela peut être fait de manière très rapide.

Par exemple, si vous prenez un vecteur entier de longueur 256, et remplissez les premières , valeurs avec , les prochaines valeurs avec et ainsi de suite jusqu'à - ce sera presque utiliser tout le tableau. Les quelques cellules restantes indiquent alors de passer à une deuxième méthode qui combine le traitement de la queue droite et également les minuscules bits de probabilité «restants» de la partie gauche.256p11256p22256pi<1

Le reste gauche pourrait alors être fait par un certain nombre d'approches (même avec, disons `` quadrature de l'histogramme '' s'il est automatisé, mais il ne doit pas être aussi efficace que cela), et la queue droite peut alors être faite en utilisant quelque chose comme l'approche d'acceptation-rejet ci-dessus.

L'algorithme de base consiste à générer un entier de 1 à 256 (ce qui ne nécessite que 8 bits de la rng; si l'efficacité est primordiale, les opérations sur les bits peuvent prendre celles-ci `` en haut '', laissant le reste du nombre uniforme (il vaut mieux être gauche comme valeur entière non normalisée à ce point) pouvant être utilisée pour traiter le reste gauche et la queue droite si nécessaire.

Mis en œuvre avec soin, ce genre de chose peut être très rapide. Vous pouvez utiliser des valeurs différentes de que 256 (par exemple pourrait être une possibilité), mais tout est théoriquement le même. Si vous prenez une très grande table, cependant, il peut ne pas y avoir suffisamment de bits dans l'uniforme pour qu'elle soit adaptée à la génération de la queue et vous avez besoin d'une deuxième valeur uniforme là-bas (mais elle devient très rarement nécessaire, donc ce n'est pas beaucoup de un problème)2k216

Dans le même exemple zeta (2) que ci-dessus, vous auriez 212 1, 26 2, 7 3, 3 4, un 5et les valeurs de 250 à 256 traiteraient du reste. Plus de 97% du temps, vous générez l'une des valeurs du tableau (1-5).

Glen_b -Reinstate Monica
la source
J'ai apporté quelques ajouts à ma réponse, et j'ai l'intention d'en faire plus, pour donner plus de détails.
Glen_b -Reinstate Monica
Merci --- Je ne m'attendais pas à des ajouts. Si vous le modifiez davantage, pouvez-vous me cingler s'il vous plaît? Je ne remarquerais peut-être pas le contraire car je ne fréquente pas ce site et j'ai déjà accepté la réponse comme "2. est la voie à suivre".
Szabolcs
4

Pour autant que je sache, l'état de l'art sur les lois de puissance est le document de Clauset, Shalizi et Newman qui traite de votre problème dans l'annexe D.Notez en particulier (où est un tirage d'une loi de puissance continue), ils disent:y

D'autres approches approximatives pour générer des nombres entiers, telles que l'arrondi (tronquer) la valeur de y, donnent des résultats sensiblement moins bons et ne devraient pas être utilisées.

Comme alternative à la réponse acceptée, Clauset et al. La méthode pour obtenir des tirages précis à partir de la distribution de loi de puissance discrète consiste à dessiner un aléatoire uniforme , puis faire où est le cdf complémentaire de la loi de puissance discrète. Vous avez besoin de la fonction zeta pour calculer mais elle doit seulement être calculée jusqu'à une certaine précision, il est donc possible de générer des tirages qui ont la distribution de loi de puissance discrète de cette manière. Vous devez utiliser la méthode de la bissection pour résoudre l'équation .r[0,1)x=P1(1r)P(x)=a=xP(X=a)P(x)P(x)=1r

Parce que le calcul exact est cher, une méthode approximative est également donnée, qui consiste à définir qui n'est pas tout à fait la même chose que les valeurs arrondies de la loi de puissance continue. L'erreur de cette approximation est donnée dans l'équation (D.7) de Clauset et al. et dépend de .

x=12(1r)1/(1γ)+12
γ
Flet
la source