2015-03-19 2 views
1

Так что я довольно много смотрю вокруг переполнения стека и google, прежде чем задавать этот вопрос. У меня есть симуляция, над которой я работаю, и мне нужно иметь возможность генерировать случайные входные данные между 0 и 1.0, которые следуют определенным статистическим распределениям.Случайно сгенерированные числа из Boost Pareto Distribution

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

Первые два доступны в boost/random /, но парето доступно только как необработанное распределение (т. Е. Недоступно для использования в генераторе колебаний). Кто-нибудь знает способ генерации указанных случайных чисел? Пожалуйста, обратите внимание, что я уже вылил дополнительную документацию, в том числе для распространения Pareto. Я ищу для генерации случайных чисел, которые следуют дистрибутивный Парето, не использовать распределение Парето для определения статистической вероятности. Единственное, о чем я могу думать до сих пор, - использовать равномерный генератор и подключить эти значения к CDF дистрибутива Парето (но должен быть лучший способ, чем этот).

Любая помощь будет принята с благодарностью, поскольку я новичок в повышении.

Спасибо!

Вот код, который я использую для первых двух, в тандеме с генератором вариантов. Это все очень тестовый код, поэтому, пожалуйста, не забивай меня по стилю или конвенции:

#include <time.h> 
#include <iostream> 
#include <boost/random/normal_distribution.hpp> 
#include <boost/random/uniform_real_distribution.hpp> 
#include <boost/math/distributions/pareto.hpp> 
#include <boost/random/mersenne_twister.hpp> 
#include <boost/random/variate_generator.hpp> 

int main(){ 
    boost::mt19937 randGen(time(0)); 

    boost::normal_distribution<> dist1(.5,.2); 
    boost::random::uniform_real_distribution<> dist2(0.0,1.0); 

    boost::variate_generator<boost::mt19937&,boost::normal_distribution<> > generator1(randGen,dist1); 
    boost::variate_generator<boost::mt19937&,boost::random::uniform_real_distribution<> > generator2(randGen,dist2); 

    for(int x = 0; x < 10; x++) 
     std::cout << generator1() << std::endl; 

    std::cout << "\n\n\n"; 

    for(int x = 0; x < 10; x++) 
     std::cout << generator2() << std::endl; 

    return 0; 
} 
+0

Но почему-то вы пропустили первый хит для распространения «boost pareto»? http://www.boost.org/doc/libs/1_41_0/libs/math/doc/sf_and_dist/html/math_toolkit/dist/dist_ref/dists/pareto.html –

+0

Совсем нет. Это не отвечает на мой вопрос.Вот как использовать распределение Парето для определения вероятностей в соответствии с распределением. Мне нужно генерировать случайные числа, которые следуют за распределением Парето в качестве входных данных образца. Пожалуйста, найдите время, чтобы понять суть вопроса, прежде чем переходить к выводам. –

+1

@TylerS, возможно, вы не смогли установить соединение, и комментатор этого не понял. Я тоже, я читал это как «Я не могу найти реализацию распределения Парето». В общем, легко упредить ответы, которые вы ожидаете, указав на это в своем вопросе. («Я знаю, что boost реализует статистическое распределение здесь, но я не уверен, как я могу применить это (если вообще) к генераторам Boost Random») – sehe

ответ

0

После нескольких исследований и консультаций с некоторыми специалистами в отделе статистики я нашел способ сделать это, используя распространение uniform_real. Сначала я попытался использовать функцию квантиля, как описано в сообщении this, но всегда получал строки 1 или 0 в качестве моих результатов.

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

Boost интересен тем, что использует функции, не являющиеся членами, для вычисления значений cdf, поэтому cdf не является свойством самого распределения parteo. Вместо того, чтобы должным образом сделать это импульс является:

#include <boost/random/uniform_real_distribution.hpp> 
#include <boost/random/mersenne_twister.hpp> 
#include <boost/random/variate_generator.hpp> 
#include <boost/math/distributions/pareto.hpp> 

int main(){ 
    boost::mt19937 randGen(15); //held constant for repeatability 
    boost:math::pareto_distribution<> dist; 
    boost::random::uniform_real_distribution<> uniformReal(1.0,10.0); //this range can be adjusted to effect values 

    boost::variate_generator<boost::mt19937&,boost::random::uniform_real_distribution<> > generator(randGen, dist); 

    double cdfComplement; 
    for(int i = 0; i < 5000; i++){ 
      cdfComplement = boost::math::cdf(complement(dist,generator())); 
      //do something with value 
    }   

    return 0; 
} 

Там нет хорошего способа, который я нашел, как еще, чтобы ограничить значение распределения для значений точности в пределах от 0,0 до 1,0 диапазона. Есть выбросы, которые падают чуть ниже 0.0 и другие, которые превышают 1.0 (хотя это полностью зависит от диапазона реальных чисел, которые вы им подаете). Вы можете легко выбросить ценности вне диапазона, который вы ищете.

Мне удалось достичь этих результатов, используя параметры формы по умолчанию и метод, описанный выше. Отображено 5 000 точек данных: Pareto random values with default shape parameters and 5,000 data points.

1

The pareto distribution is related to the exponential distribution. Таким образом, вы могли бы использовать импульс, чтобы генерировать случайные значения, которые следуют за экспоненциальное распределение и вручную вычислить PARETO распределенных значений из них , This question также может быть интересным для вас.

Смежные вопросы