2012-04-27 5 views
8

Я написал симуляцию на C++, которая генерирует (1 000 000)^2 числа из определенного распределения вероятности, а затем делает с ними что-то. До сих пор я использовал экспоненциальные, нормальные, гамма, униформные и пуассоновские распределения. Вот код для одного из них:Случайные числа из бета-дистрибутива, C++

#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 часов. Бета-дистрибутив не находится в пакете boost/random, поэтому мне пришлось использовать пакет boost/math/distribution. Я нашел this page on StackOverflow, который предложил решение. Здесь это (скопировано):

#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/distribution? Я даже не знаю, возможно ли это.

Другая полезная информация состоит в том, что параметры одинаковы для всех (1 000 000)^2 чисел, которые мне нужно сгенерировать. Я говорю это, потому что у дистрибутива Beta есть неприятный PDF-файл, и, возможно, знание того, что параметры исправлены, может каким-то образом использоваться для упрощения процесса? Просто случайное предположение.

ответ

5

Бета-распределение связано с распределением гаммы. Пусть X - случайное число, взятое из Gamma (α, 1) и Y из Gamma (β, 1), где первым аргументом для гамма-распределения является параметр формы. Тогда Z = X/(X + Y) имеет распределение Beta (α, β). При таком преобразовании это займет всего два раза больше времени, чем ваш тест распределения гаммы.

Примечание: Вышеприведенное предположение представляет собой наиболее распространенное представление гамма-распределения, гамма (форма, масштаб). Имейте в виду, что различные реализации случайного генератора гамма-распределения будут меняться со значением и порядком аргументов.

+0

Спасибо, я не знал об этом имуществе. Я также использовал тот факт, что гамма-распределение - это всего лишь сумма экспонент. Ваше предложение изменило время работы от 600 до 40 часов. Спасибо! – jaff

+0

Используя стандартную нотацию, это не должно быть Gamma (α, 1) и Gamma (β, 1) вместо Gamma (1, α) и Gamma (1, β). То есть α и β должны быть параметрами формы, а не масштабными параметрами. – BenRI

+0

@BenRI - Существует несколько способов параметризации гамма-распределения. Одним из наиболее широко используемых является 'gamma (shape_factor, scale_factor)', и с этим использованием вы правы. Этот масштабный коэффициент также может быть нормой или средним значением. Другие определяют форму как второй аргумент (но это, по-видимому, не так широко используется). Я обновляю свой ответ, чтобы отразить более общую нотацию и указать, что аргумент формы является ключом. –

0

Попробуйте выполнить компиляцию с оптимизацией. Использование флага -O3 обычно ускоряет работу. См. Это post on optimisation flags или this overview для получения более подробной информации.

+5

Вы должны сначала спросить OP в комментарии, действительно ли он использует флаги оптимизации. – mfontanini

2

Если вы хотите распределение, очень бета-как, но имеет очень простую замкнутую форму обратную CDF, это стоит рассматривать распределение Кумарасв:

http://en.wikipedia.org/wiki/Kumaraswamy_distribution

Он используется в качестве альтернативы для Бета-распределение, когда требуется большое количество случайных выборок.