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


68

Мене цікавить, як генерувати рівномірно розподілені точки на поверхні 3-д одиничної сфери? Крім того, після створення цих точок, що є найкращим способом візуалізації та перевірки, чи справді вони рівномірні на поверхні x2+y2+z2=1 ?


Якщо під формою ви маєте на увазі "регулярний", немає можливості зробити це поза n = 2, 4, 6, 8, 12, 20.
Маркос

1
що не так із зразком з MultiVariateGaussian, і цей вектор просто його нормалізує: v = MultivariateNormal(torch.zeros(10000), torch.eye(10000))а потім v = v/v.norm(10000)
Буратіно

Відповіді:


72

Стандартний метод - це генерувати три стандартні нормали та побудувати з них одиничний вектор. Тобто, коли і λ 2 = X 2 1 + X 2 2 + X 2 3 , то ( X 1 / λ , X 2 / λ , X 3 / λ ) рівномірно розподілено на сфера. Цей метод добре працює і для d -вимірних сфер.XiN(0,1)λ2=X12+X22+X32(X1/λ,X2/λ,X3/λ)d

У 3D можна використовувати вибірку відхилення: намалюйте з рівномірного [ - 1 , 1 ] розподілу, поки довжина ( X 1 , X 2 , X 3 ) не буде меншою або дорівнює 1, потім - так само, як і попередній метод - нормалізація вектора до одиничної довжини. Очікувана кількість випробувань на сферичну точку дорівнює 2 3 / ( 4 π / 3 ) = 1,91. У більш високих вимірах очікувана кількість випробувань стає такою великою, що швидко стає нездійсненною.Xi[1,1](X1,X2,X3)23/(4π/3)

Існує багато способів перевірити рівномірність . Акуратний спосіб, хоча і дещо обчислювально інтенсивний, - це функція K Ріплі . Очікувана кількість точок на (3D-евклідовій) відстані будь-якого місця на сфері пропорційна площі сфери в межах відстані ρ , яка дорівнює π ρ 2 . Обчислюючи всі проміжні відстані, ви можете порівняти дані з цим ідеальним.ρρπρ2

ei(d[i]ei)i=1,2,,n(n1)/2=md[i]ithei=2i/m

Ось малюнок 100 незалежних малюнків з рівномірного сферичного розподілу, отриманого першим методом:

100 рівномірних сферичних точок

Ось діагностичний графік відстаней:

Діагностичний сюжет

Шкала y припускає, що ці значення близькі до нуля.

Ось накопичення 100 таких ділянок, щоб припустити, які відхилення розмірів можуть бути фактично значущими показниками нерівномірності:

Модельовані значення

(Ці сюжети виглядають дуже багато, як броунівські мости ... тут можуть ховатися цікаві теоретичні відкриття.)

Нарешті, ось діагностичний графік для набору 100 рівномірних випадкових точок плюс ще 41 точка, рівномірно розподілених лише у верхній півкулі:

Моделювання неоднорідних значень

Відносно рівномірного розподілу він показує значне зменшення середніх проміжних відстаней до діапазону однієї півкулі. Це саме по собі безглуздо, але корисна інформація тут полягає в тому, що щось не є рівномірним у масштабі однієї півкулі. Насправді цей сюжет легко виявляє, що одна півсфера має іншу щільність, ніж інша. (Простіший тест на квадратний чі зробив би це з більшою потужністю, якби ви заздалегідь знали, яку півкулю випробувати з нескінченно багатьох можливих.)


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

23
XN(0,In)Inn×nQQXN(0,In)XY=X/X2YQ=QX/QX2=QX/X2Q. Оскільки інваріантний обертанням, так це , а оскільки майже точно, то він повинен бути рівномірно розподілений по сфері. XYY2=1
кардинал

3
@Mike Ні, тому що рівномірний розподіл широти не дає рівномірного розподілу по сфері. (Більша частина поверхні сфери лежить на нижчих широтах біля екватора подалі від поляків. Натомість потрібен рівномірний розподіл .ϕcos(ϕ)
whuber

1
@Ahsan Оскільки ортогональні матриці утворюють перехідну групу перетворень сфери, що зберігають область, розподіл є рівномірним по підмножині сфери форми : але це вся сфера. X/||X||2
whuber

1
@Cesar "Рівномірний розподіл" (на сферу).
whuber

19

Ось декілька досить простих R-кодів

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)     

З конструкції дуже просто побачити, що і так але якщо це потрібно перевірити,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

і легко перевірити, що кожен з і рівномірно розподілений на ( очевидно, що ) зy [ - 1 , 1 ] zxy[1,1]z

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

Зрозуміло, що задані значення , і рівномірно розподілені навколо кола радіуса і це можна перевірити, дивлячись на розподіл арктангенту їх відношення. Але оскільки має такий самий граничний розподіл, що і і як , подібне твердження справедливо для будь-якої пари, і це теж можна перевірити. x y zxy zx1z2zxy

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

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


Мені просто цікаво, чи ваш метод генерування точок (x, y, z) по суті такий же, як метод Уубера?
Цянь Лі

3
Ні, це не так: whuber використовує три випадкові числа, тоді як я використовую два. Шахта - це особливий випадок "створити точку на з відповідною щільністю [пропорційною ], а потім зменшити розмірність". Тут зручно оскільки це формально 2-сфера . [1,1](1z2)n/21n=2
Генрі

3
Або, загалом, генеруйте на карті рівномірні точки, використовуючи будь-яку проекцію на рівну площу (ваша - циліндрична однакова площа), потім проектуйте назад. (+1)
блуд

@whuber: Дійсно. Оффтопік, але для тих , хто зацікавлений мене є інтерактивний вибір світових картографічних проекцій тут , деякі з яких дорівнюють область
Генрі

2
Це майже стандартний підхід, використовуваний у комп'ютерній графіці, заснований на теоремі Hat-Box від Archimedes: mathworld.wolfram.com/ArchimedesHat-BoxTheorem.html
Едвард КМЕТТ

10

Якщо ви хочете взяти вибірку точок, рівномірно розподілених на 3D-кулі (тобто поверхні 3D-кулі), використовуйте просте відкидання або метод Марсагліа (Ann. Math. Statist., 43 (1972), pp. 645– 646). Для низьких розмірів коефіцієнт відхилення досить низький.

Якщо ви хочете генерувати випадкові точки з сфери і кулі з більшими розмірами, то це залежить від мети та масштабу моделювання. Якщо ви не хочете виконувати великі симуляції, використовуйте метод Мюллера (Commun. ACM, 2 (1959), стор. 19–20) або його «кульову» версію (див. Цитований вище документ Harman & Lacko). Це:

щоб отримати зразок, рівномірно розподілений по n-сфері (поверхні) 1), генерувати X з n-мірного стандартного нормального розподілу 2) розділити кожну складову X за евклідовою нормою X

щоб отримати зразок, рівномірно розподілений на n-кулі (внутрішній) 1), генерувати X з (n + 2) -розмірного стандартного нормального розподілу 2) розділити кожну складову X за евклідовою нормою X і взяти лише перші n компонентів

Якщо ви хочете виконати великі симуляції, то слід вивчити більш спеціалізовані методи. За запитом я можу надіслати вам документ Хармана та Лакко про методи умовного розподілу, що забезпечує класифікацію та узагальнення деяких алгоритмів, згаданих у цій дискусії. Контакт доступний на моєму веб-сайті (http://www.iam.fmph.uniba.sk/ospm/Lacko)

Якщо ви хочете перевірити, чи справді точки точки є рівномірними на поверхні чи внутрішній стороні кулі, погляньте на крайові поля (все повинно бути однаковим, оскільки обертальна інваріантність розподіляється у формі бета-версії прогнозованого зразка).


що не так із зразком з MultiVariateGaussian, і цей вектор просто його нормалізує: v = MultivariateNormal(torch.zeros(10000), torch.eye(10000))а потім v = v/v.norm(10000)
Буратіно

8

У мене була аналогічна проблема (n-сфера) під час доктора наук, і один з місцевих "експертів" запропонував відбирати відбір проб з n-куба! Це, звичайно, сприйняло б вік Всесвіту, як я дивився на російський порядок.

Алгоритм, який я закінчив, дуже простий і опублікований у:

WP Petersen та A. Bernasconic Уніфікований відбір з n-сфери: Технічний звіт ізотропного методу, TR-97-06, Швейцарський центр наукових обчислень

Я також маю цей документ у своїй бібліографії, який я не розглядав. Ви можете вважати його корисним.

Harman, R. & Lacko, V. Про декомпозиційні алгоритми рівномірного відбору проб з сфер та кульок Journal of Multivariate Analysis, 2010nn


чи можна розміщувати посилання, де я можу знайти повний текст цих посилань? Дякую.
Цянь Лі

Я не маю папір на мене, але ця сторінка , здається, описує алгоритм (і кілька інших) mlahanas.de/Math/nsphere.htm
emakalic

3
Як я розумію, (з паперу Петерсена та Бернасконіка) для двовимірної кулі можна генерувати радіус, піднімаючи змінну U (0,1) до потужності (1 / d), а останній кут як a U (0,2 ) змінна. Проміжні кути можна отримати у вигляді , де є . Для мене це звучить досить просто. Що мені цікаво, це таке: якщо я використовую квазі випадкову послідовність для уніформи, я отримаю приємність і в балі? πC.asin(uk)C1
πΓ(k2+0.5)Γ(k2+1)
Мохіт

3

У мене була ця проблема раніше, і ось я знайшов альтернативу,

Що стосується самого розподілу, то формула, яку я знайшов, що працює пристойно, - це використовувати полярні координати (я фактично використовую варіацію полярних координат, що розвинулися), а потім перетворити на декартові координати.

Радіус, звичайно, є радіусом сфери, на якій ви побудуєте графік. Тоді ви маєте друге значення кута на плоскій площині, а потім третє значення, яке є кутом вище або нижче цієї площини.

Для отримання гідного розподілу припустимо, що U - рівномірно розподілене випадкове число, r - радіус, a - друга полярна координата, а b - третя полярна координата,

a = U * 360 b = U + U-1, то перетворять на декартову через x = r * sin (b) sin (a) z = r sin (b) cos (a) y = r sin (b)

Нещодавно я знайшов таке, що краще математично кажучи, a = 2 (pi) * U b = cos ^ -1 (2U-1)

Насправді не сильно відрізняється від моєї оригінальної формули, хоча моя - це градуси проти радіану.

Ця остання версія нібито може використовуватися для гіперсфер, хоча про її досягнення не згадувалося.

Хоча я перевіряю рівномірність візуально досить дешевим методом створення карт для Homeworld 2, а потім "відтворення" цих карт. Насправді, оскільки карти зроблені зі скриптами lua, ви можете скласти свою формулу прямо на карту і таким чином перевірити кілька зразків, не виходячи з гри. Мабуть, не науково, але це хороший метод для візуального бачення результатів.


2

Ось псевдокод:

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

У pytorch:

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

Я не розумію цього досить добре, але мені сказали:

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

також є правильним, тобто вибірки з одновимірної нормальної для кожної координати.


0

Моя найкраща здогадка - спочатку генерувати набір рівномірно розподілених точок у двовимірному просторі, а потім проектувати ці точки на поверхню кулі, використовуючи якусь проекцію.

Ймовірно, вам доведеться змішувати і співставляти спосіб генерування очок із способом їх відображення. Що стосується покоління 2D точок, я вважаю, що скремльовані послідовності з низькою невідповідністю були б хорошим місцем для початку (тобто скремблированої послідовності Соболя), оскільки вона, як правило, створює точки, які не "збиті разом". Я не впевнений, який тип картографування використовувати, але Woflram спливав Gnonomic проекцію ... так, може, це могло б спрацювати?

MATLAB має гідну реалізацію послідовностей з низькою невідповідністю, які можна генерувати за допомогою q = sobolset(2)та сканувати за допомогою q = scramble(q). Також у MATLAB є набір інструментів для відображення з купою різних функцій проекції, які ви могли б використовувати, якщо ви не хочете кодувати картографування та графіку самостійно.


1
чи може будь-яка з цих проекцій зберегти рівномірність випадковості? Знову ж таки, як я можу перевірити, чи кінцевий розподіл цих точок справді рівномірно розподілений на поверхні сфери? Дякую.
Цянь Лі

Вибачте, що я просто говорив гіпотетично ... Я думаю, що функції картографування на MATLAB дозволили б вам перевірити це, оскільки в них вбудовані деякі візуалізації. Якщо ні, я також знайшов приємний веб-сайт, який розповідає про те, як генерувати рівномірно розподілені точки на кулі в 3D, використовуючи такі речі, як рандомізовані кути тощо. У них є і якийсь код C. Погляньте
Берк У.

3
Уніфіковані випадкові точки на гномонічній проекції не будуть рівномірними на кулі, тому що гномоніка не є рівною площею. Проекція , запропонований Генрі, -> (від довготи-широти до прямокутника в ), є рівною площі. ( λ , sin ( ϕ ) ) R 2(λ,ϕ)(λ,sin(ϕ))R2
whuber
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.