Como gerar pontos distribuídos uniformemente na bola unitária 3-d?


11

Eu postei uma pergunta anterior , isso está relacionado, mas acho que é melhor iniciar outro tópico. Desta vez, estou pensando em como gerar pontos uniformemente distribuídos dentro da esfera da unidade 3-d e como verificar a distribuição visual e estatisticamente também? Não vejo as estratégias postadas lá diretamente transferíveis para essa situação.


4
rr3u[0,1]wwu1/3

@ whuber: talvez eu simplesmente não tenha entendido a essência das técnicas anteriores. Deixe-me tentar o que você descreveu. Além disso, quais são as maneiras de verificar a uniformidade aqui novamente?
Qiang Li

2
@ Função K de Qiang Ripley e testes qui-quadrado. Você também pode verificar a uniformidade da projeção radial dos pontos na superfície da esfera, a uniformidade do cubo dos comprimentos dos pontos e a independência desses dois.
whuber

Para mim, não é tão óbvio o que "uniformemente distribuída", ... E, provavelmente, uma tentativa de defini-lo automagicamente criar um algoritmo de geração (=

fR,Θ,Φ(r,θ,ϕ)=r2

Respostas:


14

43πr3=0.523...


+1. Essa é uma das técnicas recomendadas pela FAQ do comp.graphics.algorithms "Pontos aleatórios uniformes na esfera".
David Cary

1
n>100

2
Isso é chamado de "método de rejeição". Enquanto trabalha bem em três dimensões, por vinte e sete dimensões, apenas um em um trilhão de pontos está na bola de 27 e não no resto do cubo de 27, de modo que o método de rejeição não generaliza bem. Menciono isso porque atualmente preciso de amostras uniformemente em uma bola de 2.440 dimensões.
perfil completo de Reb.Cabin

13

xyzx=rsinθcosϕy=rsinθsinϕz=rcosθ

ϕ02πrθrr3r3r2rθ(1cosθ)/21(1cos(θ))/2θ>π/2θsin(θ)/2

θ11

Em R, isso pareceria como mostrado abaixo.

n <- 10000 # For example n = 10,000.
phi <- runif(n, max=2*pi)
r <- runif(n)^(1/3)
cos_theta <- runif(n, min=-1, max=1)
x <- r * sqrt(1-cos_theta^2) * cos(phi)
y <- r * sqrt(1-cos_theta^2) * sin(phi)
z <- r * cos_theta

Ao escrever e editar esta resposta, percebi que a solução é menos trivial do que eu pensava.

(x,y,z)r

xyz <- matrix(rnorm(3*n), ncol=3)
lambda <- runif(n)^(1/3) / sqrt(rowSums(xyz^2))
xyz <- xyz*lambda

3
Esta é uma resposta muito melhor devido à falta de rejeição. Em espaços de alta dimensão, a amostragem por rejeição pode ser muito cara devido à baixa probabilidade de aceitação.
kingledion

2
O último pedaço de código pode ser adaptado para uma dimensão superior, digamos d. Para isso, substitua todas as instâncias de 3por d.
precisa saber é o seguinte

0

PP=N/||N||U1/nNU[0,1]1/nn

Et voilà!


2
Um raio uniformemente distribuída não vai dar um ponto uniforme na bola ...
b Kjetil Halvorsen

1
U
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.