Моделюйте рівномірний розподіл на диску


24

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

Оскільки для цього потрібно лише розмістити точки в межах кругової області, я ввів два рівномірні випадкові розподіли в полярних координатах: R (радіус) і θ (полярний кут).

Але зробивши цю ін’єкцію, я чітко отримую більше очок у центрі кола порівняно з ребром.

введіть тут опис зображення

Який був би правильний спосіб виконати цю ін’єкцію по колу, щоб точки були випадковим чином розподілені по колу?


Це питання має точний аналог в геометрії форумі: math.stackexchange.com/questions/87230 / ...
аксакал

Відповіді:


35

Ви хочете, щоб пропорція балів була рівномірна пропорції площі, а не відстані до початку. Оскільки площа пропорційна відстані у квадраті, генеруйте однакові випадкові радіуси та приймайте їхні квадратні корені. Поєднайте це з рівномірним полярним кутом.

Це швидко і просто в коді, ефективне у виконанні (особливо на паралельній платформі) і створює точно встановлену кількість балів.

Приклад

Це робочий Rкод для ілюстрації алгоритму.

n <- 1e4
rho <- sqrt(runif(n))
theta <- runif(n, 0, 2*pi)
x <- rho * cos(theta)
y <- rho * sin(theta)
plot(x, y, pch=19, cex=0.6, col="#00000020")

введіть тут опис зображення


3

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

Ось приклад.

x=runif(1e4,-1,1)
y=runif(1e4,-1,1)

d=data.frame(x=x,y=y)
disc_sample=d[d$x^2+d$y^2<1,]
plot(disc_sample)

введіть тут опис зображення


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

1
π/4

@whuber дякую, що ви навчали мене, коментуючи мою відповідь!
Хайтао Дю

3

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

Є два підходи, які я збираюся обговорити. Один з них я назвав би "точним" , і ви отримаєте повне рішення з ним в Р. Другий, який я називаю евристичним , і це лише ідея, не передбачено повного рішення.

«Точне» рішення

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

введіть тут опис зображення

d1/г

n <- 1e4
rho <- sqrt(runif(n))
# d - # of dimensions of hyperdisk
d = 2
r = matrix(rnorm(n*d),nrow=n,ncol=d)
x = r/rep(sqrt(rowSums(r^2))/rho,1)
plot(x[,1], x[,2], pch=19, cex=0.6, col="#00000020")

введіть тут опис зображення

Ось фрагмент коду для 3d-корпусу, тобто суцільного кулі:

library(scatterplot3d)
n <- 1e3
# d - # of dimensions of hyperdisk

d=3
rho <- (runif(n))^(1/d)
r = matrix(rnorm(n*d),nrow=n,ncol=d)
x = r/rep(sqrt(rowSums(r^2))/rho,1)

scatterplot3d(x[,1], x[,2], x[,3])

введіть тут опис зображення

Евристичний підхід

Vn(R)=πn2Γ(n2+1)Rn
Rn

i=1dxi2<R2

1d+2


@Silverfish, ти маєш рацію, я виправив мову
Аксакал

@Silverfish, це повільно завдяки використанню гауссових змінних, але може бути швидшим, ніж простий відбір відхилень у високовимірному випадку, що для багатьох не очевидно, хоча це інша тема
Аксакал

1/г,г

@whuber, я копіював вставку, виправляв друкарську помилку на потужність куба. Якщо ми будемо використовувати Гаусса, то вибірки відторгнення не є кращими, тому нам доведеться використовувати щось у формі дзвоника, яке швидше, ніж Гаусса, ви праві
Аксакал

0

Ось альтернативне рішення в R:

n <- 1e4
## r <- seq(0, 1, by=1/1000)
r <- runif(n)
rho <- sample(r, size=n, replace=T, prob=r)
theta <- runif(n, 0, 2*pi)
x <- rho * cos(theta)
y <- rho * sin(theta)
plot(x, y, pch=19, cex=0.6, col="#00000020")

введіть тут опис зображення


4
Чи можете ви пояснити цю відповідь простою англійською? Ми насправді не є веб-сайтом довідки щодо коду, і відповіді, що стосуються лише коду, повинні бути обережними.
gung - Відновити Моніку

5
Це рішення інтригує. На жаль, це не зовсім коректно, хоча сюжет виглядає чудово. Причина полягає в тому, що він обмежує радіуси в зразку дискретним набором значень, однаково розташованих між собою0 і 1. Це не те саме, що призначений розподіл. Зокрема, він є єдиним : у нього навіть немає PDF-файлу! Якщо ви не впевнені, r <- seq(0, 1, by=1/10)замість цього повторіть, щоб чіткіше побачити його дискретний характер.
whuber

1
@whuber Дякую, що вказали на це. Це фактично моя головна ідея рішення. Мій підхід полягав у створенні багатьох рівномірних кіл з різними радіусами, і, для кожного кола, кількість точок пропорційна довжині його радіуса. Тому на одиничній довжині кіл з різними радіусами кількість точок однакова. Щоб уникнути дискретного характеру, ми могли б зробити вибірку rз Уніформи (0,1).
Q_Li
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.