Я хотел бы создать образцы из синей области, определенной здесь:
Наивным решением является использование выборки отбраковки на единицу площади, но это обеспечивает эффективность только (~ 21,4%).
Есть ли какой-нибудь способ, которым я могу сделать выборку более эффективно?
probability
sampling
monte-carlo
random-generation
Cam.Davidson.Pilon
источник
источник
Ответы:
Будет ли два миллиона очков в секунду?
Распределение симметрично: нам нужно только определить распределение для одной восьмой части полного круга, а затем скопировать его вокруг других октантов. В полярных координатах совокупное распределение угла Θ для случайного положения ( X , Y ) при значении θ определяется площадью между треугольником ( 0 , 0 ) , ( 1 , 0 ) , ( 1 , tan θ ) и дуга окружности, продолжающаяся от (( r , θ ) Θ (X,Y) θ (0,0),(1,0),(1,tanθ) до ( cos θ , sin θ ) . Таким образом, оно пропорционально(1,0) (cosθ,sinθ)
откуда его плотность
Мы можем сделать выборку из этой плотности, используя, скажем, метод отбраковки (который имеет эффективность ).8/π−2≈54.6479%
Условная плотность радиальной координаты пропорциональна r d r между r = 1 и r = sec θ . Это можно сделать с помощью простой инверсии CDF.R г др г = 1 г = секθ
Если мы сгенерируем независимые выборки , преобразование обратно в декартовы координаты ( x i , y i ) произведет выборку этого октанта. Поскольку выборки являются независимыми, случайное переключение координат создает независимую случайную выборку из первого квадранта, по желанию. (Случайные свопы требуют генерации только одной биномиальной переменной, чтобы определить, сколько реализаций нужно поменять.)( гя,θi) (xi,yi)
Каждая такая реализация требует, в среднем, одной равномерной переменной (для R ) плюс 1 / ( 8 π - 2 ) умножения на две равномерных переменной (для Θ ) и небольшое количество (быстрых) вычислений. Это 4 / ( π - 4 ) ≈ 4,66 вариации на точку (что, конечно, имеет две координаты). Полная информация приведена в примере кода ниже. Эта цифра показывает 10000 из более чем полумиллиона сгенерированных очков.(X,Y) R 1/(8π−2) Θ 4/(π−4)≈4.66
Вот
R
код, который произвел это моделирование и рассчитал его.источник
Я предлагаю следующее решение, которое до сих пор должно быть проще, эффективнее и / или дешевле в вычислительном отношении, чем другие решения @cardinal, @whuber и @ stephan-kolassa.
Он включает в себя следующие простые шаги:
Интуиция этого алгоритма показана на рисунке.
Шаги 2a и 2b можно объединить в один шаг:
Следующий код реализует алгоритм выше (и проверяет его с помощью кода @ whuber).
Некоторые быстрые тесты дают следующие результаты.
Алгоритм /stats//a/258349 . Лучший из 3: 0,33 секунды на миллион очков.
Это алгоритм. Лучший из 3: 0,18 секунды на миллион очков.
источник
Что ж, более эффективно можно сделать, но я надеюсь, что вы не ищете быстрее .
Wolfram поможет вам интегрировать это :
Вероятно, вы можете немного ускорить инверсию CDF, если будете немного думать. Опять же, мышление болит. Я лично пошел бы на выборку отклонения, которая быстрее и гораздо менее подвержена ошибкам, если у меня не было очень веских причин не делать этого.
источник