Python科学计算(第2版)
上QQ阅读APP看书,第一时间看更新

3.4.2 离散概率分布

当分布函数的值域为离散时我们称之为离散概率分布。例如投掷有六个面的骰子时,只能获得1到6的整数,因此所得到的概率分布为离散的。对于离散随机分布,通常使用概率质量函数(PMF)描述其分布情况。

在stats模块中所有描述离散分布的随机变量都从rv_discrete类继承,也可以直接用rv_discrete类自定义离散概率分布。例如假设有一个不均匀的骰子,它的各点出现的概率不相等。我们可以用下面的数组x保存骰子的所有可能值,数组p保存每个值出现的概率:

    x = range(1, 7)    
    p = (0.4, 0.2, 0.1, 0.1, 0.1, 0.1)

然后创建表示这个特殊骰子的随机变量dice,并调用其rvs( )方法投掷此骰子20次,获得符合概率p的随机数:

    dice = stats.rv_discrete(values=(x, p))
    dice.rvs(size=20)
    array([1, 6, 3, 1, 2, 2, 4, 1, 1, 1, 2, 5, 6, 2, 4, 2, 5, 2, 1, 4])

下面我们用程序验证概率论中的中心极限定理:大量相互独立的随机变量,其均值的分布以正态分布为极限。我们计算上面那个特殊骰子投掷50次的平均值,由于每次投掷骰子都可以看作一个独立的随机事件,因此投掷50次的平均值可以看作“大量相互独立的随机变量”,其平均值的分布应该十分接近正态分布。仍然通过rvs( )获得取样值,其结果是一个形状为(20000, 50)的数组,沿着第一轴计算每行的平均值,得到samples_mean:

    np.random.seed(42)
    samples = dice.rvs(size=(20000, 50))
    samples_mean = np.mean(samples, axis=1)