Имитация равномерного распределения на диске


24

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

Поскольку это требует только размещения точек в круглой области, я ввел два равномерных случайных распределения в полярных координатах: (радиус) и (полярный угол).θрθ

Но после выполнения этой инъекции я ясно получаю больше точек в центре круга по сравнению с краем.

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

Каков будет правильный способ выполнить эту инъекцию по кругу, чтобы точки были случайным образом распределены по кругу?


Этот вопрос имеет точный аналог на форуме Geometry: 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 спасибо, что просветил меня, комментируя мой ответ!
Haitao Du

3

Я дам вам общий n-мерный ответ, который, конечно, работает и для двумерного случая. В трех измерениях аналог диска представляет собой объем сплошного шара (сферы).

Есть два подхода, которые я собираюсь обсудить. Один из них я бы назвал «точным» , и вы получите полное решение с ним на R. Второй, который я назвал эвристическим , и это только идея, полного решения не предоставляется.

«Точное» решение

Мое решение основано на работах Марсальи и Мюллера . По сути, так получается, что нормализованный по своей норме гауссов вектор дает равномерно распределенные точки на d-мерной гиперсфере:

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

d1/d

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")

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

Вот фрагмент кода для трехмерного случая, то есть сплошной шар:

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])

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

Эвристический подход

ВN(р)знак равноπN2Γ(N2+1)рN
рN

Σязнак равно1dИкся2<р2

1d+2


@ Silverfish, ты прав, я исправил язык
Аксакал

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

1/d,d

@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
01r <- seq(0, 1, by=1/10)

1
@whuber Спасибо за указание на это. Это на самом деле моя основная идея решения. Мой подход состоял в том, чтобы создать много однородных кругов с различными радиусами, и для каждого круга число точек пропорционально длине его радиуса. Поэтому на единичной длине окружностей с разными радиусами количество точек одинаково. Чтобы избежать дискретной природы, мы могли бы сделать выборку rиз Uniform (0,1).
Q_Li
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.