首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++中高斯分布的混合

C++中高斯分布的混合
EN

Stack Overflow用户
提问于 2016-05-19 10:05:36
回答 1查看 1.8K关注 0票数 2

我知道像gsl这样的库可以生成高斯分布和基于高斯分布产生随机数,节点/-Gauss-Distribution.html我想知道是否有任何库可以产生服从混合高斯分布的随机数,并且可以根据混合高斯分布返回给定值的概率?非常感谢。

后续:如果我首先在(0,1)之间生成一个随机数,如果它属于(0,0.5),我只生成服从一个高斯分布的数字,否则就从另一个高斯分布生成数字,这是否相同。这个过程是否与生成数服从两个高斯混合的过程相同?(假设两个高斯之间的权重相等)

EN

回答 1

Stack Overflow用户

发布于 2016-05-19 16:03:25

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

  • 根据混合权重,随机决定样本的高斯分布。
  • 从选定的高斯分布中创建一个随机样本。

下面是一个使用C++内置随机数生成器的最小工作示例:

代码语言:javascript
复制
#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';
}

在这里试试

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37320025

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档