2016-05-19 2 views
1

Я знаю библиотеку, такую ​​как gsl, для генерации гауссовских распределений и генерации случайного числа, основанного на распределении gaussian. https://www.gnu.org/software/gsl/manual/html_node/The-Gaussian-Distribution.html Мне интересно, есть ли какая-либо библиотека, которая могла бы генерировать случайное число, подчиняться смеси гауссовского распределения и могла бы вернуть вероятность данного значения на основе гауссового распределения смеси? С большим спасибо. enter image description hereсмесь gaussian distribution в C++

следит за: это то же самое, если я сначала генерирует случайное число в диапазоне от (0,1), если она попадает в (0, 0,5), я просто генерировать номер подчиняются одному гауссово распределение, в противном случае генерировать номер из другого гауссовского распределения. Является ли этот процесс таким же, как порождение числа, подчиняться смеси двух гауссиан? (Если предположить, что вес равен между двумя гауссианов)

+0

Выбирая график, который вы опубликовали, я предполагаю, что «смесь» означает просто сумму двух гауссиан? –

ответ

1

Вы правильно: Вы можете создать образец из гауссовой модели смеси в два этапа:

  • Произвольное решить, из которых распределение Гаусса к образцу, в зависимости на весах смеси.
  • Создайте один случайный образец из выбранного распределения Гаусса.

Вот минимальный рабочий пример с использованием встроенного генераторов случайных чисел в C++:

#include <iostream> 
#include <random> 
#include <array> 

int main() 
{ 
    std::random_device rd; 
    std::mt19937 gen(rd()); 

    using normal_dist = std::normal_distribution<>; 
    using discrete_dist = std::discrete_distribution<std::size_t>; 

    auto G = std::array<normal_dist, 3>{ 
     normal_dist{5.0, 0.1}, // mean, stddev of G[0] 
     normal_dist{8.0, 0.4}, // mean, stddev of G[1] 
     normal_dist{2.0, 0.3} // mean, stddev of G[2] 
    }; 
    auto w = discrete_dist{ 
     0.1, // weight of G[0] 
     0.6, // weight of G[1] 
     0.3 // weight of G[2] 
    }; 

    for (int n = 0; n < 100; ++n) { 
     // Create one sample of the Gaussian mixture model 
     auto index = w(gen); 
     auto sample = G[index](gen); 
     std::cout << sample << " "; 
    } 
    std::cout << '\n'; 
} 

Try it out here.

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