Distribution Is All You Need – 1. Bernoulli and Binomial

我们进入统计分布的第一部分,从最基本简单的伯努利(Bernoulli)和二项分布(Binomial)开始聊起。

Bernoulli为什么发明了Bernoulli分布?目的就是描述一件事情发生或者不发生的概率(或者称为yes-no问题),发生为1不发生为0,分别对应概率P和1-P。

伯努利分布是所有分布中最基本的情况(用最逼格的名称描述最简单的场景)。其对应的PMF也非常简单:

    \[{\displaystyle f(k;p)={\begin{cases}p&{\text{if }}k=1,\\q=1-p&{\text{if }}k=0.\end{cases}}}\]

为什么发明Binomial分布?多次进行Bernoulli实验得到的成功结果的分布就是Binomial分布。注意到这里其实评估的是多次的Bernoulli实验,在考察一组实验结果的分布。感觉问题稍微复杂了一点,因为我们在考察一组行为之后的结果。下面就是把n次实验成功的次数作为随机变量对应的PMF:

    \[{\displaystyle f(k,n,p)=\Pr(k;n,p)=\Pr(X=k)={\binom {n}{k}}p^{k}(1-p)^{n-k}}\]

    \[{\displaystyle {\binom {n}{k}}={\frac {n!}{k!(n-k)!}}}\]

这里n是做了n次Bernoulli实验,k表示n次实验中成功k次的结果,p表示每次Bernolli实验成功的概率。

附录

import random
import operator as op
from functools import reduce
import numpy as np

import matplotlib.pyplot as plt
import seaborn as sns

sns.set_style("whitegrid")
custom_params = {"axes.spines.right": False, "axes.spines.top": False}
sns.set_theme(style="ticks", rc=custom_params)

def bernoulli(p, k):
    return p if k else 1 - p

experiment = [0.3]
x = [0, 1]

plt.figure(dpi=150)
for p in experiment:
    y = []
    for k in range(2):
        y.append(bernoulli(p, k))
    sns.barplot(x=x, y=y)
    
plt.ylabel('Probability')
plt.show()

####################

def const(n, r):
    r = min(r, n-r)
    numer = reduce(op.mul, range(n, n-r, -1), 1)
    denom = reduce(op.mul, range(1, r+1), 1)
    return numer / denom

def binomial(n, p):
    q = 1 - p
    y = [const(n, k) * (p ** k) * (q ** (n-k)) for k in range(n)]
    return y, np.mean(y), np.std(y)

plt.figure(dpi=150)

for ls in [(0.7, 20), (0.5, 20), (0.5, 40)]:
    p, n_experiment = ls[0], ls[1]
    x = np.arange(n_experiment)
    y, u, s = binomial(n_experiment, p)
    plt.scatter(x, y, label=f'p={p}, n={n_experiment}')

plt.legend()
plt.ylabel('Probability')
plt.xlabel('k success')
plt.show()

发表评论

您的电子邮箱地址不会被公开。