Como posso gerar pontos uniformemente distribuídos em um círculo?

8

Eu estou olhando para gerar 450 pontos de dados em R. Existem três conjuntos distintos 150 de cada um distribuídos em uma banda circular com raios diferentes (em 1, 2,8 e 5).

Em particular, pretendo reproduzir o primeiro gráfico da p546 de Os elementos do aprendizado estatístico. insira a descrição da imagem aqui

Ficaria muito grato por alguma assistência no código R que possa gerar esses dados.

Obrigado!

Carl
fonte
Veja, por exemplo, Lovisolo, da Silva. Distribuição uniforme de pontos em uma hiperesfera com aplicativos para codificação de plano de bits de vetor . Não há código pronto no artigo, mas o algoritmo. Se você não encontrar o pdf, envie-me um e-mail.
ttnphns
A geração de pontos uniformemente em uma esfera é descrita em stats.stackexchange.com/questions/7977/… ; o método generaliza diretamente para todas as outras dimensões. Mas o título desta pergunta parece ter pouco ou nada a ver com a pergunta em si, que pede uma distribuição uniforme no círculo, juntamente com o aditivo "ruído gaussiano" na direção radial. Portanto, editei o título para alterar "hiperesfera" para "círculo".
whuber

Respostas:

11

No caso de um círculo, basta gerar um ângulo uniforme, , em e depois fazer o raio, , o que for desejado. Se você deseja coordenadas cartesianas, em vez de polares, e .[ 0 , 2 π ) r x = r cos θ y = r sen θθ[0,2π)rx=rcosθy=rsinθ

Uma maneira realmente fácil de gerar pontos aleatórios a partir de uma distribuição uniforme de uma esfera d (uma hiperesfera em um espaço de dimensão arbitrária , com superfície de dimensão ), é gerar normais padrão multivariados e, em seguida, escala pela distância da origem:d X iN d + 1 ( 0 , I )d+1dXiNd+1(0,I)

Yi=Xi/||Xi||,

ondeé a norma euclidiana .||.||

Em R, vamos gerar na superfície de uma (2) esfera:

x <- matrix(rnorm(300),nc=3)
y <- x/sqrt(rowSums(x^2))
head(y)
           [,1]        [,2]       [,3]
[1,]  0.9989826 -0.03752732 0.02500752
[2,] -0.1740810  0.08668104 0.98090887
[3,] -0.7121632 -0.70011994 0.05153283
[4,] -0.5843537 -0.49940138 0.63963192
[5,] -0.7059208  0.20506946 0.67795451
[6,] -0.6244425 -0.70917197 0.32733262

head(rowSums(y^2))
[1] 1 1 1 1 1 1

Aqui estão os dados de dois ângulos ligeiramente diferentes:

Gráficos 3D de dados distribuídos uniformes na esfera

Você pode então escalar para qualquer outro raio que desejar.

Em dimensões baixas, existem maneiras mais rápidas, mas se o gerador normal de números aleatórios for razoavelmente rápido, será muito bom em dimensões mais altas.

Existem vários pacotes no CRAN para estatísticas circulares, incluindo CircStatse circular. Provavelmente existe algo no CRAN que gera distribuições uniformes nas n-esferas para n> 1, mas eu não sei.

Glen_b -Reinstate Monica
fonte
Este é o primeiro passo da abordagem usada no artigo a que me refiro no meu comentário acima. Os autores utilizam três estágios: 1) geram muitos pontos de dados normais e os redimensionam para um raio de unidade; 2) use o agrupamento k-means para substituir os muitos pontos das k poins que você precisa para revestir a hiperesfera; a telha é quase uniforme até o momento; 3) aplique a mudança especial a cada ponto para chegar à uniformidade quase exata. Uma vez eu codificado que algoritmo, mas em SPSS, não em R.
ttnphns
Acho que as etapas 2 e 3 são úteis quando você deseja gerar uma boa malha na esfera, mas não para a geração de pontos aleatórios ... [@Glen_b boa resposta! ]
Elvis
@ttnphns Peguei a pergunta para perguntar sobre pontos com uma distribuição uniforme sobre a superfície, em vez de algo em que os pontos estão próximos de um espaçamento uniforme.
Glen_b -Reinstala Monica
Mas entendi que o OP pedia isso: ladrilhos realmente uniformes, regulares e espaçados de maneira uniforme. Dados aleatórios estão longe de serem realmente uniformes.
ttnphns
1
Sim, claro. Para desambiguação, é sempre aconselhável dizer "proveniente da distribuição uniforme / normal" em vez de dúbio "ter distribuição uniforme / normal".
ttnphns