Como gerar pontos uniformemente distribuídos na superfície da esfera unitária 3-d?


68

Eu estou querendo saber como gerar pontos uniformemente distribuídos na superfície da esfera da unidade 3-d? Depois de gerar esses pontos, qual é a melhor maneira de visualizar e verificar se eles são realmente uniformes na superfície x2+y2+z2=1 ?


Se pelo uniforme quer dizer "regular", não há nenhuma maneira de fazê-lo fora de = 2, 4, 6, 8, 12, 20.n
Marcos

11
o que há de errado com amostra de um MultiVariateGaussian e que vector apenas normalizá-lo: v = MultivariateNormal(torch.zeros(10000), torch.eye(10000))e depois v = v/v.norm(10000)
Pinocchio

Respostas:


72

Um método padrão é gerar três normais normais e construir um vetor unitário a partir deles. Ou seja, quando e λ 2 = X 2 1 + X 2 2 + X 2 3 , ( X 1 / λ , X 2 / λ , X 3 / λ ) é distribuído uniformemente a esfera. Este método funciona bem para d esferas dimensionais, também.XiN(0,1)λ2=X12+X22+X32(X1/λ,X2/λ,X3/λ)d

Em 3D, você pode usar a amostragem por rejeição: desenhe de uma distribuição uniforme [ - 1 , 1 ] até que o comprimento de ( X 1 , X 2 , X 3 ) seja menor ou igual a 1, então - assim como no método anterior - normalize o vetor para o comprimento da unidade. O número esperado de tentativas por ponto esférico é igual a 2 3 / ( 4 π / 3 ) = 1,91. Em dimensões mais altas, o número esperado de tentativas se torna tão grande que rapidamente se torna impraticável.Xi[1,1](X1,X2,X3)23/(4π/3)

Existem muitas maneiras de verificar a uniformidade . Uma maneira elegante, embora um tanto intensamente computacional, é com a função K de Ripley . O número esperado de pontos dentro da distância (euclidiana 3D) de qualquer local na esfera é proporcional à área da esfera dentro da distância ρ , que é igual a π ρ 2 . Ao calcular todas as distâncias entre pontos, você pode comparar os dados com esse ideal.ρρπρ2

Os princípios gerais da construção de gráficos estatísticos sugerem que uma boa maneira de fazer a comparação é traçar resíduos estabilizados por variância contra i = 1 , 2 , , n ( n - 1 ) / 2 = m onde d [ i ] é a i th menor das distâncias mútuas e e i = 2 ei(d[i]ei)i=1,2,,n(n1)/2=md[i]ith . O gráfico deve estar próximo de zero. (Essa abordagem não é convencional.)ei=2i/m

Aqui está uma imagem de 100 desenhos independentes de uma distribuição esférica uniforme obtida com o primeiro método:

100 pontos esféricos uniformes

Aqui está o gráfico de diagnóstico das distâncias:

Gráfico de diagnóstico

A escala y sugere que esses valores estão próximos de zero.

Aqui está o acúmulo de 100 desses gráficos para sugerir quais desvios de tamanho podem realmente ser indicadores significativos de não uniformidade:

Valores simulados

(Essas parcelas parecem muito com pontes brownianas ... pode haver algumas descobertas teóricas interessantes à espreita aqui.)

Finalmente, aqui está o gráfico de diagnóstico para um conjunto de 100 pontos aleatórios uniformes mais outros 41 pontos distribuídos uniformemente apenas no hemisfério superior:

Valores não uniformes simulados

Em relação à distribuição uniforme, mostra uma diminuição significativa nas distâncias médias entre pontos, para um intervalo de um hemisfério. Isso por si só não tem sentido, mas a informação útil aqui é que algo não é uniforme na escala de um hemisfério. De fato, esse gráfico detecta prontamente que um hemisfério tem uma densidade diferente do outro. (Um teste qui-quadrado mais simples faria isso com mais força se você soubesse com antecedência qual hemisfério deveria testar dentre os infinitos possíveis.)


(X1/λ,X2/λ,X3/λ)

23
XN(0,In)Inn×nQQXN(0,In)XY=X/X2YQ=QX/QX2=QX/X2Q. Como é invariável às rotações, o mesmo acontece com , e como quase certamente, então ele deve ser uniformemente distribuído na esfera. XYY2=1
cardeal

3
@ Mike Não, porque uma distribuição uniforme da latitude não fornece uma distribuição uniforme na esfera. (A maior parte da superfície da esfera encontra-se menores latitudes perto do equador longe dos pólos Você precisa de uma distribuição uniforme. em vez disso.)ϕcos(ϕ)
whuber

11
@Ahsan Como as matrizes ortogonais formam um grupo transitivo de transformações que preservam a área da esfera, a distribuição é uniforme sobre o subconjunto da esfera da forma : mas essa é a esfera inteira. X/||X||2
whuber

11
@ Cesar "Distribuição uniforme" (na esfera).
whuber

19

Aqui está um código R bastante simples

n     <- 100000                  # large enough for meaningful tests
z     <- 2*runif(n) - 1          # uniform on [-1, 1]
theta <- 2*pi*runif(n) - pi      # uniform on [-pi, pi]
x     <- sin(theta)*sqrt(1-z^2)  # based on angle
y     <- cos(theta)*sqrt(1-z^2)     

É muito simples ver pela construção que e, portanto, mas se precisar ser testado,x2+y2=1z2x2+y2+z2=1

mean(x^2+y^2+z^2)  # should be 1
var(x^2+y^2+z^2)   # should be 0

e fácil testar se cada um de e são distribuídos uniformemente em ( obviamente é) comy [ - 1 , 1 ] zxy[1,1]z

plot.ecdf(x)  # should be uniform on [-1, 1]
plot.ecdf(y)
plot.ecdf(z)

Claramente, dado um valor de , e são distribuídos uniformemente em torno de um círculo de raio e isso pode ser testado observando a distribuição do arco tangente de sua razão. Mas como tem a mesma distribuição marginal que e como , uma afirmação semelhante é verdadeira para qualquer par, e isso também pode ser testado. x y zxy zxy1z2zxy

plot.ecdf(atan2(x,y)) # should be uniform on [-pi, pi]
plot.ecdf(atan2(y,z))
plot.ecdf(atan2(z,x))

Se ainda não estiver convencido, os próximos passos seriam observar uma rotação 3D arbitrária ou quantos pontos caíram dentro de um determinado ângulo sólido, mas isso começa a ficar mais complicado, e acho desnecessário.


Eu só estou querendo saber se o seu método de gerar pontos (x, y, z) é essencialmente o mesmo que o método whuber's?
Qiang Li

3
Não, não é: o whuber usa três números aleatórios enquanto eu uso dois. O meu é um caso especial de "gerar um ponto em com densidade adequada [proporcional a ] e depois diminuir a dimensão". Aqui convenientemente pois esta é formalmente uma 2-esfera . [1,1](1z2)n/21n=2
Henry

3
Ou, de maneira mais geral, gere pontos uniformes no mapa usando qualquer projeção de área igual (a sua é uma de área igual cilíndrica) e projete de volta. (+1)
whuber

@ whuber: De fato. Offtopic, mas para qualquer pessoa interessada Eu tenho uma seleção interativa de mapa projeções mundo aqui , alguns dos quais são iguais área
Henry

2
Isso é muito bonito a abordagem padrão usado em computação gráfica, com base Hat-Box Arquimedes Teorema: mathworld.wolfram.com/ArchimedesHat-BoxTheorem.html
Edward KMETT

10

Se você quiser amostrar pontos distribuídos uniformemente na esfera 3D (ou seja, na superfície de uma bola 3D), use uma rejeição simples ou o método de Marsaglia (Ann. Math. Statist., 43 (1972), pp. 645– 646). Para dimensões baixas, a taxa de rejeição é bastante baixa.

Se você deseja gerar pontos aleatórios a partir de esferas e esferas de maior dimensão, isso depende do objetivo e da escala da simulação. Se você não deseja realizar grandes simulações, use o método de Muller (Commun. ACM, 2 (1959), pp. 19-20) ou sua versão "ball" (veja o artigo de Harman & Lacko citado acima). Isso é:

para obter uma amostra uniformemente distribuída em uma esfera n (superfície) 1) gerar X a partir da distribuição normal padrão n-dimensional 2) dividir cada componente de X pela norma euclidiana de X

para obter uma amostra uniformemente distribuída em uma bola n (interior) 1) gerar X a partir de (n + 2) distribuição normal padrão dimensional 2) dividir cada componente de X pela norma euclidiana de X e pegar apenas os primeiros n componentes

Se você deseja realizar simulações grandes, deve investigar métodos mais especializados. Mediante solicitação, posso enviar o artigo de Harman e Lacko sobre métodos de distribuição condicional, que fornece a classificação e generalizações de alguns algoritmos mencionados nesta discussão. O contato está disponível no meu site (http://www.iam.fmph.uniba.sk/ospm/Lacko)

Se você quiser verificar se seus pontos são realmente uniformes na superfície ou no interior de uma bola, observe os marginais (todos devem ser iguais, devido à invariância rotacional, a norma ao quadrado de uma amostra projetada é distribuída beta).


o que há de errado com amostra de um MultiVariateGaussian e que vector apenas normalizá-lo: v = MultivariateNormal(torch.zeros(10000), torch.eye(10000))e depois v = v/v.norm(10000)
Pinocchio

8

Eu tive um problema semelhante (n-sphere) durante meu doutorado e um dos 'especialistas' locais sugeriu uma amostragem de rejeição de um n-cubo! Isso, é claro, teria levado a idade do universo, como eu estava olhando para n na ordem dos hunderds.

O algoritmo que acabei usando é muito simples e publicado em:

WP Petersen e A. Bernasconic Amostragem uniforme de uma esfera n: relatório técnico do método isotrópico, TR-97-06, Centro Suíço de Computação Científica

Também tenho este artigo em minha bibliografia que ainda não examinei. Você pode achar útil.

Harman, R. & Lacko, V. Sobre algoritmos decomposicionais para amostragem uniforme de esferas e bolas Journal of Multivariate Analysis, 2010nn


é possível postar os links onde posso encontrar o texto completo dessas referências? obrigado.
Qiang Li

Eu não tenho o papel de mim, mas esta página parece descrever o algoritmo (e vários outros) mlahanas.de/Math/nsphere.htm
emakalic

3
Pelo que entendi (do artigo de Petersen e Bernasconic) para uma bola tridimensional, pode-se gerar o raio elevando uma variável U (0,1) à potência (1 / d) e o último ângulo como Variável U (0,2 ). Os ângulos intermediários podem ser obtidos como , onde é . Para mim, isso parece bastante simples. O que estou me perguntando é o seguinte: se eu usar uma sequência quase aleatória nos meus uniformes, também terei a gentileza da bola? πC.asin(uk)C1
πΓ(k2+0.5)Γ(k2+1)
Mohit

3

Eu já tive esse problema antes e aqui está uma alternativa que encontrei,

Quanto à distribuição em si, a fórmula que achei que funciona decentemente é usar coordenadas polares (na verdade, uso uma variação das coordenadas polares que se desenvolveram) e depois converter em coordenadas cartesianas.

O raio é, obviamente, o raio da esfera na qual você está plotando. Então você tem o segundo valor para o ângulo no plano plano, seguido pelo terceiro valor, que é o ângulo acima ou abaixo desse plano.

Para obter uma distribuição decente, assuma que U é um número aleatório uniformemente distribuído, r é raio, a é a segunda coordenada polar eb é a terceira coordenada polar,

a = U * 360 b = U + U-1 então converta para cartesiano via x = r * sin (b) sin (a) z = r sin (b) cos (a) y = r sin (b)

Recentemente, descobri o seguinte, que é melhor matematicamente falando, a = 2 (pi) * U b = cos ^ -1 (2U-1)

Na verdade, não é muito diferente da minha fórmula original, embora a minha seja graus versus radianos.

Esta versão recente supostamente pode ser usada para hiperesferas, embora nenhuma menção tenha sido feita sobre como alcançá-la.

Embora eu verifique visualmente a uniformidade pelo método bastante barato de fazer mapas para o Homeworld 2 e depois "jogar" esses mapas. De fato, como os mapas são feitos com scripts lua, você pode criar sua fórmula diretamente no mapa e, assim, verificar várias amostras sem sair do jogo. Talvez não seja científico, mas é um bom método para visualizar visualmente os resultados.


2

Aqui está o pseudocódigo:

  1. vMultiVariateGaussian(μ,σI)
  2. v=vv

Em pitão:

v = MultivariateNormal(torch.zeros(10000), torch.eye(10000))
v = v/v.norm(2)

Eu não entendo isso muito bem, mas fui informado pela whuber que:

v = torch.normal(torch.zeros(10000), torch.eye(10000))
v = v/v.norm(2)

também está correto, isto é, amostragem de um normal univariado para cada coordenada.


0

Meu melhor palpite seria primeiro gerar um conjunto de pontos uniformemente distribuídos no espaço bidimensional e depois projetá-los na superfície de uma esfera usando algum tipo de projeção.

Você provavelmente terá que combinar e combinar a maneira como gera os pontos com a maneira como os mapeia. Em termos da geração de geração de pontos 2D, acho que sequências de baixa discrepância embaralhadas seriam um bom ponto de partida (isto é, uma sequência de Sobol embaralhada), pois geralmente produz pontos que não são "agrupados". Não tenho tanta certeza sobre qual tipo de mapeamento usar, mas o Woflram exibiu a projeção Gnonomic ... então talvez isso possa funcionar?

O MATLAB possui uma implementação decente de sequências de baixa discrepância que você pode gerar usando q = sobolset(2)e embaralhar usando q = scramble(q). Há também uma caixa de ferramentas de mapeamento no MATLAB com diversas funções de projeção que você pode usar caso não queira codificar o mapeamento e os gráficos.


11
alguma dessas projeções ainda preserva a uniformidade da aleatoriedade? Novamente, como posso verificar se a distribuição final desses pontos é realmente uniformemente distribuída na superfície da esfera? Obrigado.
Qiang Li

Desculpe, eu estava apenas falando hipoteticamente ... Acho que as funções de mapeamento no MATLAB permitiriam que você verifique isso, pois elas têm algumas visualizações incorporadas. Caso contrário, eu também encontrei um site legal que fala sobre como gerar pontos uniformemente distribuídos em uma esfera em 3D usando coisas como ângulos aleatórios etc. Eles também têm algum código C lá. Dê uma olhada
Berk U.

3
Pontos aleatórios uniformes em uma projeção gnomônica não serão uniformes na esfera, porque o gnomônico não tem a mesma área. A projeção proposta por Henry, -> (da longitude-latitude para um retângulo em ), é de área igual. ( λ , sin ( φ ) ) R 2(λ,ϕ)(λ,sin(ϕ))R2
whuber
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.