Eu gostaria de gerar amostras da região azul definida aqui:
A solução ingênua é usar a amostragem por rejeição no quadrado da unidade, mas isso fornece apenas uma eficiência de (~ 21,4%).
Existe alguma maneira de provar com mais eficiência?
probability
sampling
monte-carlo
random-generation
Cam.Davidson.Pilon
fonte
fonte
Respostas:
Dois milhões de pontos por segundo serão suficientes?
A distribuição é simétrica: só precisamos calcular a distribuição para um oitavo do círculo completo e depois copiá-la em torno dos outros octantes. Nas coordenadas polares , a distribuição cumulativa do ângulo Θ para a localização aleatória ( X , Y ) no valor θ é dada pela área entre o triângulo ( 0 , 0 ) , ( 1 , 0 ) , ( 1 , tan θ ) e o arco do círculo que se estende de (( r , θ ) Θ ( X, Y) θ ( 0 , 0 ) , ( 1 , 0 ) , ( 1 , castanhoθ ) a ( cos θ , sin θ ) . É assim proporcional a( 1 , 0 ) ( cosθ , sinθ )
de onde sua densidade é
Podemos amostrar a partir dessa densidade usando, digamos, um método de rejeição (que tem eficiência ).8 / π- 2 ≈ 54,6479 %
A densidade condicional da coordenada radial é proporcional à entre e . Isso pode ser amostrado com uma fácil inversão do CDF.r d r r = 1 r = seg θR r dr r = 1 r = sθ
Se amostras independentes , a conversão de volta para coordenadas cartesianas amostra desse octante. Como as amostras são independentes, a troca aleatória de coordenadas produz uma amostra aleatória independente do primeiro quadrante, conforme desejado. (Os swaps aleatórios requerem a geração de apenas uma única variável binomial para determinar quantas das realizações a serem trocadas.)( x i , y i )( rEu, θEu) ( xEu, yEu)
Cada realização de requer, em média, uma variável uniforme (para ) mais vezes duas variáveis uniformes (para ) e uma pequena quantidade de cálculo (rápido). São variáveis por ponto (que, é claro, tem duas coordenadas). Detalhes completos estão no exemplo de código abaixo. Esse número representa 10.000 dos mais de meio milhão de pontos gerados.R 1 / ( 8 π - 2 ) Θ 4 / ( π - 4 ) ≈ 4,66( X, Y) R 1 / ( 8 π- 2 ) Θ 4 / ( π- 4 ) ≈ 4,66
Aqui está o
R
código que produziu esta simulação e cronometrou-a.fonte
Proponho a solução a seguir, que deve ser mais simples, mais eficiente e / ou computacionalmente mais barata do que outras almas de @cardinal, @whuber e @ stephan-kolassa até agora.
Envolve as seguintes etapas simples:
1) Desenhe duas amostras uniformes padrão:
2a) Aplique a seguinte transformação de cisalhamento ao ponto (os pontos no triângulo inferior direito são refletidos no triângulo superior esquerdo e estarão "des- refletido "em 2b):min{u1,u2},max{u1,u2}
2b) Troque e se .x y u1>u2
3) Rejeite a amostra se dentro do círculo de unidades (a aceitação deve ser em torno de 72%), ou seja:
A intuição por trás desse algoritmo é mostrada na figura.
As etapas 2a e 2b podem ser mescladas em uma única etapa:
2) Aplique a transformação de cisalhamento e troque
O código a seguir implementa o algoritmo acima (e o testa usando o código do @ whuber).
Alguns testes rápidos produzem os seguintes resultados.
Algoritmo /stats//a/258349 . Melhor de 3: 0,33 segundos por milhão de pontos.
Este algoritmo. Melhor de 3: 0,18 segundos por milhão de pontos.
fonte
Bem, com mais eficiência, isso pode ser feito, mas espero que você não esteja procurando mais rapidamente .
A idéia seria provar primeiro um valor , com uma densidade proporcional ao comprimento da fatia azul vertical acima de cada valor :x x
A Wolfram ajuda você a integrar isso :
Portanto, a função de distribuição cumulativa seria essa expressão, dimensionada para integrar a 1 (isto é, dividida por ).∫ 1 0 f ( y ) d yF ∫10f(y)dy
Agora, para gerar seu valor , escolha um número aleatório , distribuído uniformemente entre e . Então encontre tal que . Ou seja, precisamos inverter o CDF ( amostragem por transformação inversa ). Isso pode ser feito, mas não é fácil. Nem rápido.t 0 1 x F ( x ) = tx t 0 1 x F(x)=t
Finalmente, dado , escolha um aleatório distribuído uniformemente entre e .y √x y 11−x2−−−−−√ 1
Abaixo está o código R. Observe que estou pré-avaliando o CDF em uma grade de valores , e mesmo assim isso leva alguns minutos.x
Provavelmente, você pode acelerar bastante a inversão do CDF se investir algum pensamento. Então, novamente, o pensamento dói. Eu, pessoalmente, iria para a amostragem de rejeição, o que é mais rápido e muito menos propenso erro de, a menos que eu tinha muito boas razões para não.
fonte