Há algum tempo que uso seqüências de baixa discrepância nas Distribuições uniformes, pois achei suas propriedades úteis (principalmente em computação gráfica por sua aparência aleatória e por sua capacidade de cobrir densamente [0,1] de maneira incremental).
Por exemplo, valores aleatórios acima, valores da sequência de Halton abaixo:
Eu estava pensando em usá-los para algum planejamento de análise financeira, mas preciso de distribuições diferentes do que apenas uniformes. Comecei tentando gerar uma distribuição normal a partir de minhas distribuições uniformes através do algoritmo polar Marsaglia, mas os resultados não parecem tão bons quanto na distribuição uniforme.
Outro exemplo, novamente aleatório acima, Halton abaixo:
Minha pergunta é: Qual é o melhor método para obter uma distribuição normal com as propriedades de uma seqüência uniforme de baixa discrepância - cobertura, preenchimento incremental, não correlação em várias dimensões? Estou no caminho certo ou devo seguir uma abordagem completamente diferente?
(Código Python para distribuições uniformes e normais que eu uso acima: Gist 2566569 )
fonte
Respostas:
Você pode transformar de variáveis aleatórias em qualquer outra distribuição usando o inverso do CDF, também chamado de função de ponto percentual. É implementado como scipy.stats.norm.ppf .você( 0 , 1 )
scipy
fonte
Recentemente, me deparei com esse problema. Ingenuamente, pensei que qualquer transformação de uniforme funcionaria; portanto, conectei uma sequência 1D Sobol (e Halton) como se a sequência
std::normal_distribution<>
contivesse um gerador de números aleatórios em uma variável. Para minha surpresa, não funcionou, obviamente gerou uma distribuição não normal.Ok, então eu peguei a função Numerical Recipes Third Edition Chapter 7.3.9
Normal_dev
para gerar números normais das seqüências de Sobol ou Halton pelo método de "Proporção de uniformes" e ela falhou da mesma maneira. Então, porém, ok, se você olhar para o código, são necessários dois números aleatórios uniformes para gerar dois números aleatórios normalmente distribuídos. Talvez se eu usei uma sequência 2D de Sobol (ou Halton), ela funcionará. Bem, falhou novamente.Lembrei-me do "método Box-Muller" (mencionado nos comentários) e, como ele tem uma interpretação mais geométrica, pensei que poderia funcionar. Bem, funcionou! Fiquei muito empolgado por começar a fazer outro teste, a distribuição parece normal.
O problema que eu vi foi que a distribuição não era melhor que aleatória, era termos de preenchimento, então fiquei um pouco decepcionado, mas pronto para publicar o resultado.
Depois, fiz uma pesquisa mais profunda (agora que sabia o que procurar) e constatamos que já existe um artigo sobre esse assunto: http://www.sciencedirect.com/science/article/pii/S0895717710005935
Neste artigo, é realmente reivindicado
Portanto, a conclusão geral é esta:
1) Você pode usar o Box-Muller em sequências de baixa discrepância 2D para obter sequências normalmente distribuídas. Mas minhas poucas experiências parecem mostrar que a baixa discrepância / espaço, por exemplo, as propriedades de preenchimento, são perdidas na sequência de transformação normal.
2) Você pode usar o método inverso, presumivelmente as propriedades de baixa discrepância / preenchimento de espaço serão preservadas.
3) A relação de uniformes não pode ser usada.
EDIT : https://mathoverflow.net/a/144234 aponta para as mesmas conclusões.
Fiz uma ilustração (a primeira figura (Proporção de uniformes em Sobol) mostra que a distribuição obtida não é normal, mas os ohters (Box-Muller e aleatório para comparação) são:
EDIT2:
O ponto principal é que, mesmo que você encontre um método que possa transformar a "distribuição" de uma sequência de baixa discrepância, não é óbvio que você preservará as boas propriedades de preenchimento. Portanto, você não é melhor do que com uma distribuição normal verdadeiramente aleatória (padrão). Ainda não encontrei um método que seja de baixa discrepância e, no entanto, preencha bem uma distribuição não uniforme. Aposto que esse método é muito óbvio e talvez um problema em aberto.
fonte
Existem dois bons métodos. Primeiro, como observado acima, uma aproximação precisa do inverso da distribuição gaussiana pode ser usada. Então, pode-se transformar qualquer sequência de baixa discrepância em gaussiana.
O segundo método é o Box-Muller. Este método requer dois números put (R e A) e gera duas saídas. É necessária uma sequência bidimensional de baixa discrepância. Toma-se (por exemplo, na sequência de Halton), pares de números primos, um para o componente radial (R) e outro para o componente angular (A). Obtém-se Sqrt (-2 * Log (R)) para o componente radial e Sin (2 * Pi * A) e Cos (2 * Pi * A) para os componentes angulares. Multiplicar o radial pelos dois componentes angulares (separadamente) fornece dois gaussianos. A eficiência é a mesma que acima; duas entradas quase aleatórias e duas saídas gaussianas.
Qualquer sequência multidimensional de baixa discrepância pode ser usada, dependendo da dimensionalidade do problema.
fonte
O método mais nativo seria de fato usar o CDF inverso para se transformar em gaussiano normal, mas também há problemas com isso. Se você tem, por exemplo, um conjunto de pontos SUD criado por redes de classificação 1, então o ponto inicial é sempre (0,0); portanto, para transformá-lo, você precisa de uma pequena mudança, melhor ter o mesmo espaço que o canto (1,1).
fonte