2016-05-19 34 views
1

ガウス分布を生成し、ガウス分布に基づいて乱数を生成するために、gslのようなライブラリを知っています。 https://www.gnu.org/software/gsl/manual/html_node/The-Gaussian-Distribution.html 混合数ガウス分布に従う乱数を生成する可能性のあるライブラリがあり、混合ガウス分布に基づいて与えられた値の確率を返すことができるかどうか疑問に思っていますか?多くのおかげで。 enter image description hereC++でのガウス分布の混合

を次のそれは同じであるIは、最初の(0,1)の間の乱数を生成する場合、それは(0、0.5)になった場合、私はちょうど数オベイ1ガウス分布を生成し、そうでなければ番号を生成他のガウス分布から。このプロセスは、2つのガウス分布の混合に従った数を生成するのと同じですか? (重量は、2つのガウス分布の間で同一であると仮定すると)

+0

あなたが掲示したグラフではじめて、「混合」とは2つのガウスの合計を意味します。 –

答えて

1

あなたが正しいしている:あなたは、2つのステップにおけるガウス混合モデルからのサンプルを生成することができる:

  • はランダムに応じて、ガウス分布を試料にそこから決定混合物の重量について。
  • 選択したガウス分布からランダムサンプルを1つ作成します。

    #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:ここ

は、C++の組み込みの乱数生成器を使用して最小限の作業例です。

関連する問題