Melhor método para transformar sequência de baixa discrepância em distribuição normal?


9

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:

http://i.stack.imgur.com/gCXrh.png

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:

http://i.stack.imgur.com/NNcdH.png

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 )


3
Certamente você examinou a resposta natural e óbvia, que é aplicar a transformação de probabilidade aos valores uniformes. Em que aspectos essa abordagem falha em atender às suas necessidades?
whuber

Era o que eu supunha que era a maneira normal de criar essas distribuições a partir de uma entrada uniforme, mas tive problemas para encontrar esses algoritmos (sou programador, não estatístico, então comecei do zero na minha pesquisa). Os métodos que encontrei foram Box Muller, Marsaglia Polar, Ziggarat e Ratio of Uniforms, todos os quais exigem a mistura de mais de uma amostra de entrada que parece destruir as características que eu estava tentando preservar nas seqüências de baixa discrepância. Acabei de encontrar a seguinte página: home.online.no/~pjacklam/notes/invnorm, que me deu as informações que desejo.
Edouard Poor

3
Sim, esse site implementa a transformação de probabilidade para a distribuição Normal. Você pode ter tido problemas para pesquisar isso porque é extremamente conhecido que praticamente qualquer método alternativo de gerar valores aleatórios pressupõe implicitamente que você possa usar esse método e, em seguida, procure maneiras mais eficientes em casos especiais (incluindo os quatro métodos listados).
whuber

3
A inversão será o único método válido para este caso!
Kjetil b halvorsen

Gostaria de saber se também podemos obter outros valores quase aleatórios da distribuição, por exemplo, o valor quase aleatório da distribuição beta?
usar o seguinte comando

Respostas:


5

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 0,1)scipy


6

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_devpara 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

Dois métodos bem conhecidos usados ​​com números pseudo-aleatórios são os métodos Box-Muller e transformação inversa. Alguns pesquisadores e engenheiros financeiros afirmaram que é incorreto usar o método Box-Muller com seqüências de baixa discrepância e, em vez disso, o método de transformação inversa deve ser usado. Neste artigo, provamos que o método Box-Muller pode ser usado com seqüências de baixa discrepância e discutimos quando seu uso pode ser realmente vantajoso.

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:

figuras

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.


No artigo acima mencionado ( sciencedirect.com/science/article/pii/S0895717710005935 ), a última frase diz: "Com base nesses resultados, concluímos que Box-Muller é uma boa alternativa ao método de transformação inversa para gerar sequências de baixa discrepância da distribuição normal ". Isso não contradiz o ponto 1 das conclusões declaradas?
ngiann 13/09/19

@ngiann, não é contraditório. O artigo chega à minha mesma conclusão de que a distribuição é obtida corretamente pela transformação BM, mas não pelos outros métodos. A segunda parte da frase ("Mas as propriedades de baixa discrepância / preenchimento de espaço parecem estar perdidas".) Está relacionada a uma propriedade secundária que se procura nas seqüências de baixa discrepância, como preenchimento eficiente do espaço. Meu experimento não mostrou essa propriedade traduzida para a sequência transformada normal. Se bem me lembro, o artigo não aborda esse problema específico. Eu acho que isso precisa de mais estudo para ser conclusivo.
alfC 13/09/19

1

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.


0

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).

-3σ-6σ

+6σ

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.