Случайные числа из бета-распределения, C++
Я написал симуляцию на C++, которая генерирует (1 000 000)^2 чисел из определенного распределения вероятностей, а затем что-то делает с ними. До сих пор я использовал экспоненциальное, нормальное, гамма, равномерное и пуассоновское распределения. Вот код для одного из них:
#include <boost/random.hpp>
...main...
srand(time(NULL)) ;
seed = rand();
boost::random::mt19937 igen(seed) ;
boost::random::variate_generator<boost::random::mt19937, boost::random::normal_distribution<> >
norm_dist(igen, boost::random::normal_distribution<>(mu,sigma)) ;
Теперь мне нужно запустить его для распространения бета-версии. Все дистрибутивы, которые я сделал, заняли 10-15 часов. Дистрибутив Beta отсутствует в пакете boost/random, поэтому мне пришлось использовать пакет boost/math/distributions. Я нашел эту страницу на Stackru, которая предложила решение. Вот оно (скопировано):
#include <boost/math/distributions.hpp>
using namespace boost::math;
double alpha, beta, randFromUnif;
//parameters and the random value on (0,1) you drew
beta_distribution<> dist(alpha, beta);
double randFromDist = quantile(dist, randFromUnif);
Я повторил это, и это сработало. Оценки времени выполнения моего моделирования являются линейными и точно предсказуемыми. Говорят, что это продлится 25 дней. Я вижу две возможности: 1. предложенный метод уступает тому, который я использовал ранее для других дистрибутивов 2. Бета-дистрибутив намного сложнее генерировать случайные числа из
Имейте в виду, что у меня ниже минимального понимания кодирования C++, поэтому вопросы, которые я задаю, могут быть глупыми. Я не могу ждать месяц для завершения этой симуляции, так что я могу сделать что-нибудь, чтобы улучшить это? Возможно, использовать первоначальный метод, который я использовал, и изменить его для работы с пакетом boost/math/distributions? Я даже не знаю, возможно ли это.
Другая полезная информация заключается в том, что параметры одинаковы для всех (1 000 000)^2 чисел, которые мне нужно сгенерировать. Я говорю это потому, что бета-дистрибутив имеет неприятный PDF и, возможно, знание того, что параметры зафиксированы, может каким-то образом использоваться для упрощения процесса? Просто случайное предположение.
3 ответа
Бета-распределение связано с гамма-распределением. Пусть X - случайное число, полученное из гаммы (α,1), а Y - из гаммы (β,1), где первым аргументом гамма-распределения является параметр формы. Тогда Z=X/(X+Y) имеет распределение Beta(α,β). С этим преобразованием это займет всего вдвое больше времени, чем ваш тест гамма-распределения.
Примечание. Приведенное выше предположение предполагает наиболее распространенное представление гамма-распределения, гамма (форма, масштаб). Имейте в виду, что различные реализации генератора случайных чисел гамма-распределения будут варьироваться в зависимости от значения и порядка аргументов.
Если вам нужен дистрибутив, который очень похож на бета-версию, но имеет очень простой обратный CDF закрытой формы, стоит рассмотреть дистрибутив Kumaraswamy:
http://en.wikipedia.org/wiki/Kumaraswamy_distribution
Он используется в качестве альтернативы бета-распределению, когда быстро требуется большое количество случайных выборок.
Попробуйте скомпилировать с оптимизацией. Использование флага -O3 обычно ускоряет процесс. См. Этот пост о флагах оптимизации или этот обзор для более подробной информации.