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

24

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

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

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

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

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

Jonjilla
источник
Этот вопрос имеет точный аналог на форуме 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")

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

Whuber
источник
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")

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

Q_Li
источник
4
Можете ли вы объяснить этот ответ на простом английском языке? На самом деле мы не сайт помощи по коду, и ответы, содержащие только код, не рекомендуется.
gung - Восстановить Монику
5
01r <- seq(0, 1, by=1/10)
1
@whuber Спасибо за указание на это. Это на самом деле моя основная идея решения. Мой подход состоял в том, чтобы создать много однородных кругов с различными радиусами, и для каждого круга число точек пропорционально длине его радиуса. Поэтому на единичной длине окружностей с разными радиусами количество точек одинаково. Чтобы избежать дискретной природы, мы могли бы сделать выборку rиз Uniform (0,1).
Q_Li