Je voudrais générer un processus Monte Carlo pour remplir une urne avec N boules de couleurs I, C [i]. Chaque couleur C [i] a un nombre minimum et maximum de boules qui doivent être placées dans l'urne.
Par exemple, j'essaie de mettre 100 balles dans l'urne et je peux la remplir de quatre couleurs:
- Rouge - Minimum 0, maximum 100 # NB, le maximum réel ne peut pas être atteint.
- Bleu - Minimum 50, maximum 100
- Jaune - Minimum 0, maximum 50
- Vert - Minimum 25, maximum 75
Comment puis-je générer un N échantillons garantissant une distribution uniforme entre les résultats possibles?
J'ai vu des solutions à ce problème où les boules n'ont pas de minimum ou maximum, ou alternativement, ont les mêmes minima et maxima implicites. Voir par exemple, cette discussion sur un sujet légèrement différent:
Générer des poids uniformément répartis qui correspondent à l'unité?
Mais j'ai des problèmes pour généraliser cette solution.
Réponses:
Soit le nombre de boules de couleur . Soit également et le nombre minimal et maximal de boules de couleur , respectivement. Nous voulons échantillonner uniformément au hasard sous réserve des contraintes suivantes:ni Ci mi Mi Ci (n1,…,nI)
Tout d'abord, vous pouvez supprimer les contraintes de limite inférieure (ie ) en choisissant initialement boules de couleur . Cela modifie les deux contraintes comme suit:mi≤ni mi Ci
Soit la distribution uniforme qui nous intéresse. Nous pouvons utiliser la règle de chaîne et la programmation dynamique pour échantillonner efficacement à partir deTout d'abord, nous utilisons la règle de chaîne pour écrire comme suit: où est la distribution marginale de . Notez queP(n1,…,nI∣B,b1:I) P P
Ce qui suit est une implémentation Matlab de l'idée. La complexité de l'algorithme est où . Le code utilise des générés aléatoirement à chaque exécution. Par conséquent, certains des cas de test générés peuvent ne pas avoir de solution valide, auquel cas le code imprime un message d'avertissement.O(I×B×K) K=maxIi=1bi mi
où la fonction print_constraints est
et la fonction dpfunc effectue le calcul de programmation dynamique comme suit:
et enfin, la fonction discreteample (p, 1) tire un échantillon aléatoire de la distribution discrète . Vous pouvez trouver une implémentation de cette fonction ici .p
la source
Considérons une généralisation de ce problème. Il y a pots de peinture de couleurs distinctes et boules. Puis- tenir jusqu'à balles. Vous souhaitez générer des configurations de billes dans les canettes ayant au moins billes en can pour chaque , chaque configuration avec une probabilité égale.m=4 m=4 n(0)=100 i a(0)i=(100,100,50,75) bi=(0,50,0,25) i i
De telles configurations sont en correspondance biunivoque avec les configurations obtenues après avoir boules de la boîte , limitant les balles restantes à au plus par boîte. Je vais donc simplement les générer et vous laisser les ajuster ensuite (en remettant les boules dans le can pour chaque ).bi i n=n(0)−∑ibi=100−(0+50+0+25)=25 ai=a(0)i−bi=(100,50,50,50) bi i i
Pour compter ces configurations, corrigez tous les indices sauf deux, disons et . Supposons qu'il y ait déjà balles dans la boîte pour chaque différent de et . Cela laisse des boules . À condition que se trouvent les autres boules, celles-ci sont réparties uniformément dans les boîtes et . Les configurations possibles sont en nombre (voir les commentaires), allant de la mise en place d'autant de balles dans le cani j sk k k i j si+sj n−(si+sj) i j 1+min(ai+aj−si−sj,si+sj) i autant que possible tout en plaçant le plus de balles possible dans la boîte .j
Si vous le souhaitez, vous pouvez compter le nombre total de configurations en appliquant cet argument de manière récursive aux boîtes restantes . Cependant, pour obtenir des échantillons, nous n'avons même pas besoin de connaître ce nombre. Tout ce que nous devons faire est de visiter à plusieurs reprises toutes les paires possibles non ordonnées de boîtes et de modifier de manière aléatoire (et uniforme) la distribution des boules à l'intérieur de ces deux boîtes. Il s'agit d'une chaîne de Markov avec une distribution de probabilité limite uniforme sur tous les états possibles (comme cela est facilement montré en utilisant des méthodes standard). Par conséquent , il suffit de commencer dans unem−2 {i,j} , exécutez la chaîne suffisamment longtemps pour atteindre la distribution limite, puis suivez les états visités par cette procédure. Comme d'habitude, pour éviter une corrélation sérielle, cette séquence d'états doit être "amincie" en les sautant (ou revisitée au hasard). L'amincissement d'un facteur d'environ la moitié du nombre de boîtes a tendance à bien fonctionner, car après cela, de nombreuses étapes en moyenne, chaque boîte a été affectée, produisant une configuration véritablement nouvelle.
Cet algorithme coûte effort pour générer chaque configuration aléatoire en moyenne. Bien qu'il existe d'autres algorithmes , celui-ci présente l'avantage de ne pas avoir à effectuer au préalable les calculs combinatoires.O(m) O(m)
Par exemple, travaillons manuellement sur une situation plus petite. Soit et , par exemple. Il existe 15 configurations valides, qui peuvent être écrites sous forme de chaînes de nombres d'occupation. Par exemple, place deux balles dans la deuxième boîte et une balle dans la quatrième boîte. En émulant l'argument, considérons l'occupation totale des deux premières boîtes. Lorsque c'est balles, aucune balle n'est laissée pour les deux dernières boîtes. Cela donne aux Étatsa=(4,3,2,1) n=3 s1+s2=3
0201
oùs1+s2=2
**
représente tous les numéros d'occupation possibles pour les deux dernières boîtes: à savoir00
. Lorsque , les états sontoù maintenant3×2=6 s1+s2=1
**
peut être soit10
ou01
. Cela donne états supplémentaires. Lorsque , les états sontoù maintenant2×2=4 s1+s2=0 2 1 4+6+4+1=15
**
peut être20
,11
mais pas02
(en raison de la limite d'une balle dans la dernière boîte). Cela donne états supplémentaires. Enfin, lorsque , toutes les boules sont dans les deux dernières boîtes, qui doivent être pleines jusqu'à leurs limites de et . Les états également probables sont doncEn utilisant le code ci-dessous, une séquence de ces configurations a été générée et réduite à un tiers, créant configurations des états. Leurs fréquences étaient les suivantes:10,009 3337 15
A tests d'uniformité donne une valeur de , ( degrés de liberté): ce qui est beau accord avec l'hypothèse que cette procédure produit également des états probables.χ2 χ2 11.2 p=0.67 14
Ce
R
code est configuré pour gérer la situation dans la question. Changera
etn
travailler avec d'autres situations. DéfiniN
pour être suffisamment grand pour générer le nombre de réalisations dont vous avez besoin après l'amincissement .Ce code triche un peu en parcourant systématiquement toutes les paires . Si vous voulez être stricte sur l' exécution de la chaîne de Markov, générer , et au hasard, comme indiqué dans le code commenté.(i,j)
i
j
ij
la source
g
g