Me gustaría generar un proceso de Monte Carlo para llenar una urna con N bolas de colores I, C [i]. Cada color C [i] tiene un número mínimo y máximo de bolas que deben colocarse en la urna.
Por ejemplo, estoy tratando de poner 100 bolas en la urna y puedo llenarla con cuatro colores:
- Rojo - Mínimo 0, Máximo 100 # NB, no se puede alcanzar el máximo real.
- Azul: mínimo 50, máximo 100
- Amarillo: mínimo 0, máximo 50
- Verde: mínimo 25, máximo 75
¿Cómo puedo generar N muestras que se distribuyan uniformemente entre los posibles resultados?
He visto soluciones a este problema donde las bolas no tienen mínimo o máximo, o alternativamente, tienen los mismos mínimos y máximos implícitos. Vea, por ejemplo, esta discusión sobre un tema ligeramente diferente:
¿Generar pesos distribuidos uniformemente que sumen a la unidad?
Pero tengo problemas para generalizar esta solución.
Respuestas:
Dejarni denotar la cantidad de bolas de color Ci . Además, dejami y Mi denota el número mínimo y máximo de bolas de color Ci , respectivamente. Queremos probar(n1,…,nI) uniformemente al azar sujeto a las siguientes restricciones:
En primer lugar, puede eliminar las restricciones de límite inferior (es decir,mi≤ni ) eligiendo mi bolas de color Ci inicialmente. Esto modifica las dos restricciones de la siguiente manera:
DejarP(n1,…,nI∣B,b1:I) denotan la distribución uniforme que nos interesa. Podemos usar reglas de cadena y programación dinámica para tomar muestras deP eficientemente. Primero, usamos la regla de la cadena para escribirP como sigue:
La siguiente es una implementación de Matlab de la idea. La complejidad del algoritmo esO(I×B×K) dónde K=maxIi=1bi . El código utiliza s generados aleatoriamente en cada ejecución. Como resultado, algunos de los casos de prueba generados pueden no tener una solución válida, en cuyo caso el código imprime un mensaje de advertencia.mi
donde la función print_constraints es
y la función dpfunc realiza el cálculo de programación dinámica de la siguiente manera:
y finalmente, la función muestra discreta (p, 1) extrae una muestra aleatoria de la distribución discretap . Puede encontrar una implementación de esta función aquí .
fuente
Consideremos una generalización de este problema. Existenm=4 latas de pintura de m=4 colores distintos y n(0)=100 pelotas. latai puede aguantar hasta a(0)i=(100,100,50,75) pelotas. Desea generar configuraciones de bolas en las latas que tienen al menosbi=(0,50,0,25) bolas en lata i para cada i , cada configuración con igual probabilidad.
Dichas configuraciones están en correspondencia uno a uno con las configuraciones obtenidas después de eliminarbi bolas de lata i , limitando el n=n(0)−∑ibi=100−(0+50+0+25)=25 bolas restantes a lo sumo ai=a(0)i−bi=(100,50,50,50) por lata. Por lo tanto, solo generaré estos y te dejaré ajustarlos después (poniendobi bolas de vuelta en lata i para cada i )
Para contar estas configuraciones, arregle todos menos dos de los índices, digamosi y j . Supongamos que haysk bolas ya en lata k para cada k diferente de i y j . Eso dejasi+sj pelotas. Condicional a donde el otron−(si+sj) las bolas son, estas se distribuyen uniformemente dentro de latasi y j . Las configuraciones posibles son1+min(ai+aj−si−sj,si+sj) en número (ver los comentarios), que van desde colocar tantas bolas en la lata i como sea posible a través de la colocación de tantas bolas en la lata j como sea posible.
Si lo desea, puede contar el número total de configuraciones aplicando este argumento de forma recursiva al restom−2 latas Sin embargo, para obtener muestras ni siquiera necesitamos saber este recuento. Todo lo que necesitamos hacer es visitar repetidamente todos los pares desordenados posibles{i,j} de latas y al azar (y de manera uniforme) cambian la distribución de las bolas dentro de esas dos latas. Esta es una cadena de Markov con una distribución de probabilidad limitante que es uniforme en todos los estados posibles (como se muestra fácilmente usando métodos estándar). Por lo tanto, es suficiente comenzar en cualquier estado, ejecutar la cadena el tiempo suficiente para alcanzar la distribución limitante y luego realizar un seguimiento de los estados visitados por este procedimiento. Como de costumbre, para evitar la correlación en serie, esta secuencia de estados debe "diluirse" saltando a través de ellos (o revisada al azar). El adelgazamiento por un factor de aproximadamente la mitad del número de latas tiende a funcionar bien, porque después de eso, en promedio, muchos pasos se han visto afectados, produciendo una configuración realmente nueva.
Este algoritmo cuestaO(m) esfuerzo para generar cada configuración aleatoria en promedio. Aunque otroO(m) existen algoritmos, este tiene la ventaja de no necesitar hacer cálculos combinatorios de antemano.
Como ejemplo, resolvamos una situación más pequeña manualmente. Dejara=(4,3,2,1) y n=3 , por ejemplo. Hay 15 configuraciones válidas, que pueden escribirse como cadenas de números de ocupación. Por ejemplo, s1+s2=3 bolas, no quedan bolas para las dos últimas latas. Eso le da a los estados
0201
coloca dos bolas en la segunda lata y una bola en la cuarta lata. Emulando el argumento, consideremos la ocupación total de las dos primeras latas. Cuando eso esdondes1+s2=2 , los estados son
**
representa a todos los posibles números de ocupación para las dos últimas latas: a saber,00
. Cuandodonde ahora3×2=6 más estados Cuandos1+s2=1 , los estados son
**
puede ser cualquiera10
o01
. Eso dadonde ahora2×2=4 más estados Finalmente cuandos1+s2=0 , todas las bolas están en las dos últimas latas, que deben estar llenas hasta el límite de 2 y 1 . los4+6+4+1=15 estados igualmente probables por lo tanto son
**
puede estar20
,11
pero no02
(debido al límite de una bola en la última lata). Eso daUsando el siguiente código, una secuencia de10,009 tales configuraciones fueron generadas y reducidas a cada tercio, creando 3337 configuraciones de la 15 estados. Sus frecuencias fueron las siguientes:
UNAχ2 prueba de uniformidad da un χ2 valor de 11.2 , p=0.67 (14 grados de libertad): es un hermoso acuerdo con la hipótesis de que este procedimiento produce estados igualmente probables.
Este
R
código está configurado para manejar la situación en la pregunta. Cambiara
yn
trabajar con otras situaciones. EstablezcaN
que sea lo suficientemente grande como para generar la cantidad de realizaciones que necesita después del adelgazamiento .Este código engaña un poco al recorrer sistemáticamente todos(i,j) pares. Si quieres ser estrictos sobre la ejecución de la cadena de Markov, generar
i
,j
yij
al azar, como se da en el código comentado.fuente
g
, es obviamenteg
es