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 ?
random-generation
Qiang Li
fonte
fonte
v = MultivariateNormal(torch.zeros(10000), torch.eye(10000))
e depoisv = v/v.norm(10000)
Respostas:
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.Xi∼N(0,1) λ2=X21+X22+X23 (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(n−1)/2=m d[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:
Aqui está o gráfico de diagnóstico das distâncias:
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:
(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:
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.)
fonte
Aqui está um código R bastante simples
É muito simples ver pela construção que e, portanto, mas se precisar ser testado,x2+y2=1−z2 x2+y2+z2=1
e fácil testar se cada um de e são distribuídos uniformemente em ( obviamente é) comy [ - 1 , 1 ] zx y [−1,1] 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 √z x y zxy1−z2−−−−−√ z x y
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.
fonte
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).
fonte
v = MultivariateNormal(torch.zeros(10000), torch.eye(10000))
e depoisv = v/v.norm(10000)
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, 2010n n
fonte
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.
fonte
Aqui está o pseudocódigo:
Em pitão:
Eu não entendo isso muito bem, mas fui informado pela whuber que:
também está correto, isto é, amostragem de um normal univariado para cada coordenada.
fonte
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 usandoq = 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.fonte