Problème lié à la simulation semi-informatique ici.
J'ai une distribution où
P (x) =
pour certaines constantes b et n, et x est un entier tel que .
Maintenant, je dois échantillonner à partir de cette distribution. Il a un CDF inversible, il est donc possible de le faire directement en théorie. Le problème est que les nombres impliqués sont GRANDS. En fait, ils sont tellement volumineux qu'ils débordent tous les deux de formats conventionnels et prennent au moins quelques minutes (à un moment donné, j'ai abandonné ...) pour calculer en utilisant des formats de précision arbitraires. Fondamentalement, le CDF inverse implique toujours un terme de , pour . Malgré cela, les numéros de sortie seront toujours compris entre , il semble donc qu'il devrait y avoir un moyen de le faire.
Ce que je recherche, c'est un moyen approximatif d'échantillonnage de cette distribution qui soit calculable. Existe-t-il d'autres méthodes d'échantillonnage? Que sont-ils?
la source
Réponses:
Le CDF est facilement inversible. Une formule pour l'inversion conduit à ce qui doit être l'une des solutions les plus simples et les plus rapides possibles.
Commençons par observer que la probabilité du résultat , , est proportionnelle à . Ainsi, si nous générons une valeur uniforme comprise entre et = , il suffit de trouver le plus grand pour lequelk 0 ≤ k ≤ n e- b k q 0 qmax=∑nk = 0e- b k ( 1 -e- b ( n + 1 )) / ( 1 -e- b) k
L'algèbre simple donne la solution
Voici uneb n
R
implémentation construite comme tous les autres générateurs de nombres aléatoires: son premier argument spécifie le nombre de valeurs iid à générer et le reste des arguments nomme les paramètres ( as et as ):b
n.max
À titre d'exemple de son utilisation, générons un million de variations aléatoires selon cette distribution:
( seconde était nécessaire.)0,10
( été ajouté à chaque valeur afin de créer un meilleur histogramme: la procédure de a une idiosyncrasie (= bug) dans laquelle la première barre est trop haute lorsque le point d'extrémité gauche est réglé à zéro.) La courbe rouge est la distribution de référence que cette simulation tente de reproduire. Évaluons la qualité de l'ajustement avec un test du chi carré:1
R
hist
La valeur de p est de : un bel ajustement.0,84
la source
Vous avez affaire à une distribution géométrique tronquée avec . Il existe différentes manières d'aborder ce problème.p = 1 -e- b
Je conseillerais différentes options dans différentes situations; certaines options impliqueraient de simuler à partir d'une géométrie et de se régénérer lorsqu'elle est en dehors de la plage, en prenant la partie entière d'une exponentielle tronquée appropriée ( comme ici ), ou en utilisant l'une quelconque de plusieurs techniques rapides adaptées à des distributions discrètes sur une plage finie. Étant donné que est grand, la prise de parole d'une exponentielle tronquée est susceptible d'être relativement rapide, mais son choix dépend également de .n b
Voici une question connexe sur math.SE
Avant d'essayer des suggestions spécifiques, quelle est une plage typique de valeurs pour ?b
la source
Notons tout d'abord que qui, si était continu, serait lié à une distribution exponentielle. Ensuite, ce que vous pouvez faire est de simuler à partir d'une distribution exponentielle tronquée et de prendre la (partie entière) des observations.P(x)∝e−bx x
floor()
Le cdf d'une exponentielle tronquée est
Ensuite, si nous faisons , nous obtenons que . Si est grand, alors qui suggère d'approximer .F(x;n,b)=u x=−1blog[1−u(1−e−bn)] bn e−bn≈0 x≈−1blog[1−u]
la source
rweirdp
est modifié pour passern
àn+1
. (Comme indiqué ici, il ne renverra jamais une valeur égale àn
: c'est l'effet de l'approximation.) Une analyse un peu plus rigoureuse est donnée dans ma réponse. Bien que j'obtienne une formule d'apparence différente, elle est équivalente à celle (plus simple!) Donnée ici, une fois la modificationn
->n+1
effectuée.Un moyen d'échantillonner à partir de la distribution cible est dep(k)∝exp{−bk}
exécuter une expérience Metropolis-Hastings pour déterminer le support (intéressant) de la distribution, c'est-à-dire dans quel sous-ensemble de il se concentre;{0,1,…,n}
Utilisez le support ainsi déterminé, disons, pour calculer les probabilités exactes comme pour éviter les débordements.{k0,…,k1} p(k)∝exp{−bk+bk0}
Mise à jour: En y réfléchissant davantage, puisque diminue en k, le support effectif de la distribution commencera toujours à . Si est assez grand, ce support se terminera très rapidement, auquel cas importe peu car les grandes valeurs de ne seront jamais visitées. Si est très petit, le pdf est presque plat, ce qui signifie que l'on peut utiliser une distribution uniforme sur comme proposition d'acceptation-rejet. Et utilisez les journaux dans l'étape d'acceptation pour éviter les débordements.p(⋅) k0=0 b n k b {0,1,…,n}
la source