C ++中高斯分布的混合

时间:2016-05-19 10:05:37

标签: c++ probability gaussian gsl

我知道库像gsl生成高斯分布并根据高斯分布生成随机数。https://www.gnu.org/software/gsl/manual/html_node/The-Gaussian-Distribution.html 我想知道是否有任何库可以产生随机数服从混合高斯分布并且可以根据混合高斯分布返回给定值的概率?非常感谢。enter image description here

跟进:如果我首先在(0,1)之间生成一个随机数,它是否相同,如果它落入(0,0.5),我只生成数字服从一个高斯分布,否则从其他高斯分布生成数字。这个过程是否与生成两个高斯的数量服从混合物相同? (假设两位高斯之间的重量相等)

1 个答案:

答案 0 :(得分:2)

你是对的:你可以分两步从高斯混合模型中生成一个样本:

  • 根据混合物的重量,随机决定从哪个高斯分布进行采样。
  • 从选定的高斯分布中创建一个随机样本。

这是使用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