Як генерувати рівномірно розподілені точки в 3-денній одиничній кулі?


11

Я розмістив попереднє запитання , це пов’язано, але я думаю, що краще почати іншу тему. Цього разу мені цікаво, як генерувати рівномірно розподілені точки всередині 3-д одиничної сфери і як перевірити розподіл також візуально та статистично? Я не бачу стратегій, розміщених там, безпосередньо переноситись на цю ситуацію.


4
Методи попереднього запитання застосовуються безпосередньо після того, як ви помітите, що кількість точок, що знаходяться на відстані від початку, має бути пропорційною . Таким чином, якщо ви генеруєте незалежну рівномірну змінну в разом з точкою на поверхні сфери, масштабування по робить трюк. г 3 U [ 0 , 1 ] ш ш U 1 / 3rr3u[0,1]wwu1/3
whuber

@whuber: можливо я просто не зрозумів суть попередніх методик. Дозвольте спробувати те, що ви описали. Крім того, які способи перевірити рівномірність тут ще раз?
Цянь Лі

2
@ Qiang Ripley's K-функція та тести на чи-квадрат. Ви також можете перевірити рівномірність радіальної проекції точок на поверхню сфери, рівномірність куба довжин точок і незалежність цих двох.
whuber

Для мене не так очевидно, що означає "рівномірно розподілений" ... І, мабуть, спроба його визначити автоматично створить алгоритм генерації (=

@mbq, я думаю, щоб визначити термін, нам потрібно мати pdf . fR,Θ,Φ(r,θ,ϕ)=r2
Цянь Лі

Відповіді:


14

Найпростіший спосіб - відбирати точки рівномірно у відповідному гіперкубі і відкидати ті, які не лежать у сфері. У 3D це не повинно траплятися часто, приблизно в 50% часу. (Об'єм гіперкуба - 1, об'єм сфери - ).43πr3=0.523...


+1. Це одна з методик, рекомендованих comp.graphics.algorithms FAQ "Уніфіковані випадкові точки на сфері".
Девід Кері

1
Що робити, якщо ми хочемо зробити це для ? n>100
ares

2
Це називається "методом відхилення". Хоча добре працює в трьох вимірах, на двадцять сім вимірах, лише одна на трильйон балів лежить у 27-бальній кулі, а не в решті 27-кубових, тому метод відхилення не є загальним. Я згадую це, тому що в даний час мені потрібні зразки рівномірно в кулі розміром 2440.
Reb.Cabin

13

Ви також можете це зробити в сферичних координатах, і в цьому випадку відхилення немає. Спочатку ви генеруєте радіус і два кути навмання, потім використовуєте формулу переходу для відновлення , y і z ( x = r sin θ cos ϕ , , ).xyzx=rsinθcosϕz = r cos θy=rsinθsinϕz=rcosθ

Ви генеруєте одночасно між і . Радіус і нахил неоднакові. Імовірність того, що точка знаходиться всередині кулі радіуса дорівнює тому функція щільності ймовірності дорівнює . Ви можете легко перевірити, що кубічний корінь рівномірної змінної має точно такий же розподіл, тому таким чином можна генерувати . Ймовірність того, що точка лежить у сферичному конусі, визначеному нахилом є або якщо0 2 π r θ r r 3 r 3 r 2 r θ ( 1 - cos θ ) / 2 1 - ( 1 - cos ( - θ ) ) / 2 θ > π / 2 θ s i n ( θ ) / 2ϕ02πrθrr3r3r2rθ(1cosθ)/21(1cos(θ))/2θ>π/2 . Отже щільність - це . Ви можете перевірити, що мінус аркозіна рівномірної змінної має належну щільність.θsin(θ)/2

Або, простіше кажучи, ми зможемо симулювати косинус рівномірно і .- 1 1θ11

У R це виглядатиме, як показано нижче.

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

Під час написання та редагування цієї відповіді я зрозумів, що рішення менш тривіальне, ніж я думав.

Я думаю, що найпростіший та обчислювально найефективніший метод - це слідувати методу @ whuber для генерації на одиничній сфері, як показано на цій посаді, та масштабування їх за допомогою .r(x,y,z)r

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

3
Це набагато краща відповідь через відсутність відхилення. У просторах з високими розмірами відбір відбору відхилень може бути дуже дорогим через низьку ймовірність прийняття.
kingledion

2
Скажімо, останній біт коду може бути адаптований до більш високого виміру d. Для цього замініть всі екземпляри 3на d.
gui11aume

0

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

Et voilà!


2
Рівномірно розподілений радіус не дасть рівномірної точки в кулі ...
kjetil b halvorsen

1
U
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.