根据给定的概率分布从集合中提取值

Posted

技术标签:

【中文标题】根据给定的概率分布从集合中提取值【英文标题】:Extract values from a set according to a given probability distribution 【发布时间】:2017-07-22 16:28:47 【问题描述】:

我必须解决这个问题:

vector<int> myset=1,2,3,4;
vector<double> distribution =0.01,0.1,0.3,0.59;

我必须根据给定的分布myset中选择一些值。实际上 distributionmyset 并不固定。它们具有相同的维度,但是这个维度可以改变并且也很大。我可以在 [0 100] 范围内统一提取一个数字,然后这样做:

int extracted_numb;
int numb = rand(0,100);
if(numb<1)
  extracted_numb=myset[0];
else if(numb<11)
  extracted_numb=myset[1];
else if(numb<41)
  extracted_numb=myset[2];
else
  extracted_numb=myset[3];

但我再说一遍,我不知道实际情况下 distributionmyset 的维度(因为是用户参数),因此我不知道有多少if要做。

我问是否有一个很好的算法来解决这个问题,也许一些 C++ 或 Boost 的本地库已经完成了它

(我使用的是 Boost 1.63 和 C++11)

【问题讨论】:

【参考方案1】:

在 C++11 中,使用 random::discrete_distribution 选择索引到 myset。 (Boost 也有类似的功能。)

示例(改编自 cppreference 链接):

#include <iostream>
#include <map>
#include <random>
#include <vector>

int main()

    std::vector<int> myset = 10,22,35,47;
    std::vector<double> distribution = 0.01,0.1,0.3,0.59;
    std::random_device rd;
    std::mt19937 gen(rd());
    std::discrete_distribution<> d(distribution.begin(), distribution.end());
    std::map<int, int> m;
    for(int n=0; n<10000; ++n) 
        ++m[myset[d(gen)]];
    
    for(auto p : m) 
        std::cout << p.first << " generated " << p.second << " times\n";
    

(Live on coliru)

【讨论】:

令人印象深刻的时机。我知道这个,但是 5 分钟对我来说太快了 非常聪明的解决方案。正是我想要的。非常感谢

以上是关于根据给定的概率分布从集合中提取值的主要内容,如果未能解决你的问题,请参考以下文章

机器学习中的数学比例混合分布

联合概率分布怎么做?

python 根据给定语料的二元条件概率分布,自动生成文字

如何计算给定均值和标准差的正态分布中的概率?

概率分布

机器学习是否有可能从数据集中找到所有元素的概率分布?