概率论中伯努利分布(bernoulli distribution)介绍及C++11中std::bernoulli_distribution的使用

来源:互联网 发布:安装ubuntu u盘 编辑:程序博客网 时间:2024/06/01 10:13

Bernoulli分布(Bernoulli distribution):是单个二值随机变量的分布。它由单个参数ø∈[0,1],ø给出了随机变量等于1的概率。它具有如下的一些性质:

P(x=1)= ø

P(x=0)=1-ø

P(x=x)= øx(1-ø)1-x

Ex[x]= ø

Varx(x)= ø(1-ø)

伯努力分布(Bernoulli distribution,又名两点分布或者0-1分布)是一个离散型概率分布,为纪念瑞士科学家雅各布·伯努利而命名。若伯努利试验成功,则伯努利随机变量取值为1。若伯努利试验失败,则伯努利随机变量取值为0。记其成功概率为p(0≤p≤1),失败概率为q=1-p。则:

其概率质量函数为:

其期望值为:

其方差为:


Multinoulli分布(multionoulli distribution)或者范畴分布(categorical distribution):是指在具有k个不同状态的单个离

散型随机变量上的分布,其中k是一个有限值。Multinoulli分布由向量p∈[0,1]k-1参数化,其中每一个分量pi表示第i个状

态的概率。最后的k个状态的概率可以通过1-lTp给出。注意必须限制lTp≤1。Multinoulli分布经常用来表示对象分类的分

布,所以很少假设状态1具有数值1之类的。因此,我们通常不需要去计算Multinoulli分布的随机变量的期望和方差.

Bernoulli分布和Multinoulli分布足够用来描述在它们领域内的任意分布。它们能够描述这些分布,不是因为它们

特别强大,而是因为它们的领域很简单;它们可以对那些能够将所有的状态进行枚举的离散型随机变量进行建模。

当处理的是连续型随机变量时,会有不可数无限多的状态,所以任何通过少量参数描述的概率分布都必须在分布上加以

严格的控制。

“multinoulli”这个术语是最近被Gustavo Lacerdo发明,被Murphy(2012)推广的。Multinoulli分布是多项式分

布(multinomial distribution)的一个特例。多项式分布是{0,…,n}k中的向量的分布,用于表示当对Multinoulli分布采

样n次时k个类中的每一个被访问的次数。多项式分布(multinomial distribution)是二项式分布的推广。二项分布的

典型例子是扔硬币,硬币正面朝上概率为p,重复扔n次硬币,k次为正面的概率即为一个二项式分布概率。把二

项分布推广至多个(大于2)互斥事件的发生次数,就得到了多项式分布。比如扔骰子,不同于扔硬币,骰子有6个

面对应6个不同的点数,这样单次每个点数朝上的概率都是1/6.

In probability theory and statistics, a categorical distribution(分类分布)(also called a generalized Bernoulli

distribution(广义伯努利分布), multinoull distribution or, less precisely, a discrete distribution) is a probabilit

distribution that describes the possible results of a random event that can take on one of K possible outcomes,

with the probability of each outcom separately specified. There is not necessarily an underlying ordering of thes

outcomes, but numerical labels are often attached for convenience in describing the distribution. On the other

hand, the categorical distribution is a special case of the multinomial distribution.

以上内容摘自:《深度学习中文版》和 维基百科

以下是对C++11中伯努利分布std::bernoulli_distribution类介绍:

C++11在头文件<random>中提供了伯努利概率分布类std::Bernoulli_distribution。伯努利分布(Bernoulli distribution)是判断某件事情发生或者未发生的概率,产生随机bool值。它是一个单次试验只有0(失败)和1(成功)两个结果的离散分布。

std::bernoulli_distribution:Bernoulli distribution, Random number distribution that produces bool values according to a Bernoulli distribution.

#include "bernoulli_distribution.hpp"#include <iostream>#include <random>#include <string>#include <iomanip>#include <map>/////////////////////////////////////////////////////////////////// reference: http://www.cplusplus.com/reference/random/bernoulli_distribution/int test_bernoulli_distribution_1(){{const int nrolls = 10000;std::default_random_engine generator;std::bernoulli_distribution distribution(0.5);int count = 0;  // count number of truesfor (int i = 0; i<nrolls; ++i) if (distribution(generator)) ++count;std::cout << "bernoulli_distribution (0.5) x 10000:" << std::endl;std::cout << "true:  " << count << std::endl;std::cout << "false: " << nrolls - count << std::endl;}{ // (1)、bernoulli_distribution::bernoulli_distribution: Constructs a bernoulli_distribution object//   with a probability of p (or with the probability specified by object parm)//   (2)、bernoulli_distribution::operator(): Generate random number//   Returns a new random value with the probability associated to the object (version 1) or//   with the probability specified by parm (version 2)//   (3)、bernoulli_distribution::p: Probability of true//   Returns the parameter p associated with the bernoulli_distribution.//   This parameter represents the probabily that member function operator() returns true.//   (4)、bernoulli_distribution::max:Maximum value, Returns the least upper bound of the range of//   values potentially returned by member operator(), which for bernoulli_distribution is true.//   (5)、bernoulli_distribution::min: Minimum value, Returns the greatest lower bound of the range of//   values potentially returned by member operator(), which for bernoulli_distribution is false.std::cout << "Please, enter a yes/no question (I will answer it):" << std::endl;std::string text;getline(std::cin, text);std::seed_seq seed(text.begin(), text.end());  // seed using questionstd::default_random_engine generator(seed);std::bernoulli_distribution distribution(0.91);bool result = distribution(generator);std::cout << (result ? "yes" : "no") << std::endl;std::cout << "p: " << distribution.p() << std::endl;std::cout << "max: " << distribution.max() << std::endl;std::cout << "min: " << distribution.min() << std::endl;}{ // bernoulli_distribution::param: Distribution parameters//   A bernoulli_distribution is defined by a single parameter: its probability (p) of true results.//   An object of type param_type carries this information, but it is meant to be used only to construct//   or specify the parameters for a bernoulli_distribution object, not to inspect the individual parameter.std::default_random_engine generator;std::bernoulli_distribution d1(0.7);std::bernoulli_distribution d2(d1.param());// print two independent values:std::cout << std::boolalpha;std::cout << d1(generator) << std::endl;std::cout << d2(generator) << std::endl;}{ // bernoulli_distribution::reset: Resets the distribution,//   so that subsequent uses of the object do not depend on values already produced by it.std::default_random_engine generator;std::bernoulli_distribution distribution;// print two independent values:std::cout << std::boolalpha;std::cout << distribution(generator) << std::endl;distribution.reset();std::cout << distribution(generator) << std::endl;}return 0;}/////////////////////////////////////////////////////////////// reference: http://en.cppreference.com/w/cpp/numeric/random/bernoulli_distributionint test_bernoulli_distribution_2(){std::random_device rd;std::mt19937 gen(rd());// give "true" 1/4 of the time// give "false" 3/4 of the timestd::bernoulli_distribution d(0.25);std::map<bool, int> hist;for (int n = 0; n<10000; ++n) {++hist[d(gen)];}for (auto p : hist) {std::cout << std::boolalpha << std::setw(5) << p.first<< ' ' << std::string(p.second / 500, '*') << '\n';}return 0;}/////////////////////////////////////////////////////////////int test_bernoulli_distribution_3(){std::random_device rd; std::mt19937 gen(rd()); // 每次产生不固定的不同的值//std::default_random_engine gen; // 每次产生固定的不同的值std::bernoulli_distribution d(0.5);for (int i = 0; i < 10; ++i)std::cout << d(gen);std::cout << std::endl;return 0;}

GitHub:https://github.com/fengbingchun/Messy_Test

阅读全文
0 0
原创粉丝点击