我们进入统计分布的第一部分,从最基本简单的伯努利(Bernoulli)和二项分布(Binomial)开始聊起。
Bernoulli为什么发明了Bernoulli分布?目的就是描述一件事情发生或者不发生的概率(或者称为yes-no问题),发生为1不发生为0,分别对应概率P和1-P。
伯努利分布是所有分布中最基本的情况(用最逼格的名称描述最简单的场景)。其对应的PMF也非常简单:

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