Eu gostaria de gerar um processo de Monte Carlo para encher uma urna com N bolas de cores I, C [i]. Cada cor C [i] possui um número mínimo e máximo de bolas que devem ser colocadas na urna.
Por exemplo, estou tentando colocar 100 bolas na urna e posso preenchê-la com quatro cores:
- Vermelho - Mínimo 0, Máximo 100 # NB, o máximo real não pode ser realizado.
- Azul - Mínimo 50, Máximo 100
- Amarelo - Mínimo 0, Máximo 50
- Verde - mínimo 25, máximo 75
Como posso gerar uma amostra N que garante distribuição uniforme entre os possíveis resultados?
Vi soluções para esse problema em que as bolas não têm mínimo ou máximo ou, alternativamente, têm os mesmos mínimos e máximos implícitos. Veja, por exemplo, esta discussão sobre um assunto um pouco diferente:
Gerar pesos uniformemente distribuídos que somam a unidade?
Mas estou tendo problemas para generalizar esta solução.
Respostas:
Deixe denotar o número de bolas da cor . Além disso, e denotam o número mínimo e máximo de bolas da cor , respectivamente. Queremos amostrar uniformemente aleatoriamente, sujeito às seguintes restrições:C i m i M i C i ( n 1 , … , n I )ni Ci mi Mi Ci (n1,…,nI)
Primeiro, você pode remover as restrições do limite inferior (por exemplo, ) escolhendo bolas de cor inicialmente. Isso modifica as duas restrições da seguinte maneira:m i C imi≤ni mi Ci
Deixe denotar a distribuição uniforme em que estamos interessados. Podemos usar regras de cadeia e programação dinâmica para obter amostras de eficiência. Primeiro, usamos a regra da cadeia para escrever seguinte maneira: onde é a distribuição marginal de . Observe queP P P ( n 1 , … , n I ∣ B , b 1 : I )P(n1,…,nI∣B,b1:I) P P P(
A seguir, é apresentada uma implementação da idéia no Matlab. A complexidade do algoritmo é onde . O código usa s gerados aleatoriamente em cada execução. Como resultado, alguns dos casos de teste gerados podem não ter uma solução válida. Nesse caso, o código imprime uma mensagem de aviso.O(I×B×K) m iK=maxIi=1bi mi
onde a função print_constraints é
e a função dpfunc executa o cálculo da programação dinâmica da seguinte maneira:
e, finalmente, a função de amostra discreta (p, 1) extrai uma amostra aleatória da distribuição discreta . Você pode encontrar uma implementação dessa função aqui .p
fonte
Vamos considerar uma generalização desse problema. Existem latas de tinta de cores distintas e bolas. Pode pode conter até bolas. Você deseja gerar configurações de bolas nas latas com pelo menos bolas em can para cada , cada configuração com igual probabilidade.m = 4 n ( 0 ) = 100 i a ( 0 ) i = ( 100 , 100 , 50 , 75 ) b i = ( 0 , 50 , 0 , 25 ) i im=4 m=4 n(0)=100 i a(0)i=(100,100,50,75) bi=(0,50,0,25) i i
Essas configurações estão em correspondência individual com as configurações obtidas após a remoção de bolas do can , limitando bolas restantes para no máximo por lata. Portanto, apenas e deixarei ajustá-los depois (colocando bolas volta no can para cada ). i N = N ( 0 ) - Σ i b i = 100 - ( 0 + 50 + 0 + 25 ) = 25 um i = um ( 0 ) i - b i = ( 100 , 50 , 50 , 50 )bi i n=n(0)−∑ibi=100−(0+50+0+25)=25 ai=a(0)i−bi=(100,50,50,50) i ibi i i
Para contar essas configurações, corrija todos os índices, com exceção de dois, digamos e . Suponhamos que existem bolas já no pode para cada diferindo e . Isso deixa bolas. Condicional em que o outro bolas são, estes são distribuídos uniformemente dentro de latas e . As configurações possíveis são em número (ver as observações), variando de colocar o maior número de bolas pode emj s k k k i j s i + s j n - ( s i + s j ) i ji j sk k k i j si+sj n−(si+sj) i j 1+min(ai+aj−si−sj,si+sj) i quanto possível durante todo o tempo de colocar o maior número de bolas em lata quanto possível.j
Se desejar, você pode contar o número total de configurações aplicando esse argumento recursivamente às latas restantes . No entanto, para obter amostras , nem precisamos saber essa contagem. Tudo o que precisamos fazer é visitar repetidamente todos os possíveis pares não ordenados de latas e alterar aleatoriamente (e uniformemente) a distribuição de bolas nessas duas latas. Esta é uma cadeia de Markov com uma distribuição de probabilidade limitadora que é uniforme em todos os estados possíveis (como é facilmente mostrado usando métodos padrão). Portanto, basta iniciar em qualquerm−2 {i,j} estado, execute a cadeia por tempo suficiente para alcançar a distribuição limitadora e depois acompanhe os estados visitados por este procedimento. Como de costume, para evitar correlação serial, essa sequência de estados deve ser "reduzida", pulando-os (ou revisitados aleatoriamente). O desbaste por um fator de cerca da metade do número de latas tende a funcionar bem, porque depois disso muitas etapas, em média, cada lata pode ser afetada, produzindo uma configuração genuinamente nova.
Esse algoritmo custa esforço para gerar cada configuração aleatória em média. Embora existam outros algoritmos , este possui a vantagem de não precisar fazer os cálculos combinatórios antecipadamente.O(m) O(m)
Como exemplo, vamos resolver uma situação menor manualmente. Deixe que e , por exemplo. Existem 15 configurações válidas, que podem ser escritas como cadeias de números de ocupação. Por exemplo, coloca duas bolas na segunda lata e uma bola na quarta lata. Emulando o argumento, vamos considerar a ocupação total das duas primeiras latas. Quando são bolas, nenhuma bola é deixada para as duas últimas latas. Isso dá aos estadosa=(4,3,2,1) n=3 s1+s2=3
0201
ondes1+s2=2
**
representa todos os números de ocupação possíveis para as duas últimas latas: a saber00
,. Quando , os estados sãoonde agora3×2=6 s1+s2=1
**
pode ser um10
ou outro01
. Isso dá mais estados. Quando , os estados sãoonde agora2×2=4 s1+s2=0 2 1 4+6+4+1=15
**
pode estar20
,11
mas não02
(devido ao limite de uma bola na última lata). Isso dá mais estados. Finalmente, quando , todas as bolas estão nas duas últimas latas, que devem estar cheias até o limite de e . Os estados igualmente prováveis são, portanto,Usando o código abaixo, uma sequência de dessas configurações foi gerada e reduzida a cada terceira, criando configurações dos estados. Suas frequências eram as seguintes:10,009 3337 15
A teste de uniformidade dá uma valor de , ( graus de liberdade): o que é belo acordo com a hipótese de que este procedimento produz estados igualmente prováveis.χ 2 11,2χ2 χ2 11.2 p=0.67 14
Este
R
código está configurado para lidar com a situação na pergunta. Mudea
en
trabalhe com outras situações. DefinaN
como grande o suficiente para gerar o número de realizações necessárias após o desbaste .Esse código engana um pouco, alternando sistematicamente todos os pares . Se você quiser ser rigoroso sobre o funcionamento da cadeia de Markov, gerar , e de forma aleatória, tal como consta no código comentado.(i,j)
i
j
ij
fonte
g
g