前言

《Python人工智能:原理、实践及应用》中随机变量分布的学习。
随机变量可能取得的值,可以把它们分为两种基本类型:离散型连续型

离散型

离散型随机变量即在一定区间内变量取值为有限个或可数个
离散型随机变量根据不同的概率分布有伯努利分布、二项分布、几何分布、泊松分布、超几何分布等。

连续型

连续型随机变量即在一定区间内变量取值有无限个,或数值无法一一列举出来。
连续型随机变量根据不同的概率分布有均匀分布、指数分布、正态分布、伽马分布等。

代码实现

伯努利分布(Bernoulli Distribution)

伯努利分布(Bernoulli Distribution)又称两点分布或0-1分布,
其样本空间中只有两个点,一般取为{0,1},不同的伯努利分布只是取到这两个值的概率不同。
伯努利分布只有一个参数 ,记作 Python给定一组数据进行泊松分布的卡方检验 python生成泊松分布随机数_python,或Python给定一组数据进行泊松分布的卡方检验 python生成泊松分布随机数_概率论_02,读作 Python给定一组数据进行泊松分布的卡方检验 python生成泊松分布随机数_二项分布_03服从参数为 Python给定一组数据进行泊松分布的卡方检验 python生成泊松分布随机数_机器学习_04的伯努利分布

import numpy as np
from scipy import stats
import matplotlib.pyplot as plt

def bernoulli_pmf(p=0.0):
    """
    抛硬币  描述离散型随机变量的概率质量分布函数(Probability Mass Function,PMF)
    :param p: 硬币正面朝上的概率
    :return:
    """
    ber_dist = stats.bernoulli(p)
    x = [0, 1]
    x_name = ['0', '1']
    pmf = [ber_dist.pmf(x[0]), ber_dist.pmf(x[1])]
    plt.bar(x, pmf, width=0.15)
    plt.xticks(x, x_name)
    plt.ylabel('Probability')
    plt.title('PMF of bernoulli distribution')
    plt.show()

bernoulli_pmf(p=0.3)

Python给定一组数据进行泊松分布的卡方检验 python生成泊松分布随机数_概率分布_05

二项式分布

如果把一个伯努利分布独立地重复 n次,就得到了一个二项分布。
二项分布是最重要的离散型概率分布之一。随机变量 要满足这个分布有两个重要条件:
①各次试验的条件是稳定的;
②各次试验之间是相互独立的。

一个随机变量 服从参数为 Python给定一组数据进行泊松分布的卡方检验 python生成泊松分布随机数_python_06Python给定一组数据进行泊松分布的卡方检验 python生成泊松分布随机数_机器学习_04的二项分布,记作 Python给定一组数据进行泊松分布的卡方检验 python生成泊松分布随机数_二项分布_08Python给定一组数据进行泊松分布的卡方检验 python生成泊松分布随机数_概率论_09

利用抛硬币的例子来比较伯努利分布和二项分布的区别。

  • 如果将抛一次硬币看作一次伯努利实验,且将正面朝上记为1,反面朝上记为0。那么抛Python给定一组数据进行泊松分布的卡方检验 python生成泊松分布随机数_概率论_10次硬币,记录正面朝上的次数Python给定一组数据进行泊松分布的卡方检验 python生成泊松分布随机数_机器学习_11, 就服从二项分布。
    假如硬币是均匀的, 取值应该大部分集中在 Python给定一组数据进行泊松分布的卡方检验 python生成泊松分布随机数_二项分布_12附近,而非常大或非常小的值都很少。
  • 由此可见,二项分布关注的是计数,而伯努利分布关注的是比值(Python给定一组数据进行泊松分布的卡方检验 python生成泊松分布随机数_概率分布_13)。
import numpy as np
from scipy import stats
import matplotlib.pyplot as plt


def binom_dis(n=1, p=1):
    """
    n=20, p=0.6的二项分布,表示每次试验抛硬币,该硬币正面朝上的概率大于背面朝上的概率,共抛20次并记录正面朝上的次数。
    :param n: 次数
    :param p: 正面朝上的概率
    :return:
    """
    binom_dis = stats.binom(n, p)
    # ppf 累积分布函数(cdf)的反函数
    x = np.arange(binom_dis.ppf(0.0001), binom_dis.ppf(0.9999))
    print(x)  # [ 4.  5.  6.  7.  8.  9. 10. 11. 12. 13. 14. 15. 16. 17. 18.]
    fig, ax = plt.subplots(1, 1)
    ax.plot(x, binom_dis.pmf(x), 'bo', label='binom pmf')
    ax.vlines(x, 0, binom_dis.pmf(x), colors='b', lw=5, alpha=0.5)
    ax.legend(loc='best', frameon=False)

    plt.ylabel('Probability')
    plt.title('PMF of binomial distribution(n = {}, p = {})'.format(n, p))
    plt.show()


binom_dis(n=20, p=0.6)

Python给定一组数据进行泊松分布的卡方检验 python生成泊松分布随机数_二项分布_14

泊松分布

如果某事件以固定强度随机且独立地出现,该事件在单位时间内出现的次数(个数)可以看成是服从泊松分布。
我们把一个随机变量 Python给定一组数据进行泊松分布的卡方检验 python生成泊松分布随机数_二项分布_03服从参数为 Python给定一组数据进行泊松分布的卡方检验 python生成泊松分布随机数_二项分布_16 的泊松分布,记作 Python给定一组数据进行泊松分布的卡方检验 python生成泊松分布随机数_python_17,或 Python给定一组数据进行泊松分布的卡方检验 python生成泊松分布随机数_概率论_18。泊松分布适合于描述单位时间内随机事件发生次数的概率分布

import numpy as np
from scipy import stats
import matplotlib.pyplot as plt


def poisson_pmf(mu=3):
    poisson_dis = stats.poisson(mu)
    # print(poisson_dis.ppf(0.001))
    # print(poisson_dis.ppf(0.999))
    # print(poisson_dis.cdf(0.001))
    x = np.arange(poisson_dis.ppf(0.001), poisson_dis.ppf(0.999))
    # print(type(x))
    # print(poisson_dis.pmf(x))
    print(x)  # [ 1.  2.  3.  4.  5.  6.  7.  8.  9. 10. 11. 12. 13. 14. 15. 16. 17.]
    fig, ax = plt.subplots(1, 1)            # 子图行列数为 1
    ax.plot(x, poisson_dis.pmf(x), 'bo', ms=8, label='Poisson pmf')
    # matplotlib库的axiss模块中的Axes.vlines()函数用于在从ymin到ymax的每个x处绘制垂直线。
    ax.vlines(x, 0, poisson_dis.pmf(x), colors='b', lw=5, alpha=0.5)
    # 图例位置  图例边框
    ax.legend(loc='best', frameon=False)
    plt.ylabel('Probability')
    plt.title('PMF of poisson distribution(mu = {})'.format(mu))
    plt.show()


poisson_pmf(mu=8)

Python给定一组数据进行泊松分布的卡方检验 python生成泊松分布随机数_机器学习_19

均匀分布(Uniform Distribution)

均匀分布(Uniform Distribution)是最简单的连续型概率分布,因为其概率密度是一个常数,不随随机变量取值的变化而变化。
如果连续型随机变量 具有如下的概率密度函数,则称 服从Python给定一组数据进行泊松分布的卡方检验 python生成泊松分布随机数_概率论_20上的均匀分布,记作Python给定一组数据进行泊松分布的卡方检验 python生成泊松分布随机数_机器学习_21Python给定一组数据进行泊松分布的卡方检验 python生成泊松分布随机数_机器学习_22
Python给定一组数据进行泊松分布的卡方检验 python生成泊松分布随机数_python_23

import numpy as np
from scipy import stats
import matplotlib.pyplot as plt


def uniform_distribution(loc=0, scale=1):
    """
    直接传入参数和先冻结一个分布,画出来均匀分布的概率分布函数,此外还从该分布中取了10000个值作直方图
    :param loc: location表示起点,
    :param scale: 表示区间长度
    :return:
    """
    uniform_dis = stats.uniform(loc=loc, scale=scale)
    x = np.linspace(uniform_dis.ppf(0.01), uniform_dis.ppf(0.99), 100)
    fig, ax = plt.subplots(1, 1)
    # 直接传入参数
    ax.plot(x, stats.uniform.pdf(x, loc=2, scale=4), 'r-', lw=5, alpha=0.6, label='uniform pdf')
    # 从冻结的均匀分布取值
    ax.plot(x, uniform_dis.pdf(x), 'k-', lw=2, label='frozen pdf')
    # 计算pdf分别等于0.001、0.5和0.999是的x值
    vals = uniform_dis.ppf([0.001, 0.5, 0.999])
    print(vals)  # [2.004 4.    5.996]
    # 检测cdf和pdf的精确度
    print(np.allclose([0.001, 0.5, 0.999], uniform_dis.cdf(vals)))
    # True

    r = uniform_dis.rvs(size=10000)
    ax.hist(r, density=True, histtype='stepfilled', alpha=0.2)
    plt.ylabel('Probability')
    plt.title('PDF of Unif({}, {})'.format(loc, scale))
    ax.legend(loc='best', frameon=False)
    plt.show()


uniform_distribution(loc=2, scale=4)

Python给定一组数据进行泊松分布的卡方检验 python生成泊松分布随机数_python_24

指数分布

指数分布和离散型的泊松分布之间有很大的关系。

  • 泊松分布表示单位时间(或单位面积)内随机事件的平均发生次数
  • 指数分布则可以用来表示独立随机事件发生的时间间隔。
  • 由于发生次数只能是自然数,所以泊松分布自然就是离散型的随机变量,而时间间隔则可以是任意的实数,因此其定义域是Python给定一组数据进行泊松分布的卡方检验 python生成泊松分布随机数_概率分布_25

如果一个随机变量 的概率密度函数满足以下形式,
Python给定一组数据进行泊松分布的卡方检验 python生成泊松分布随机数_机器学习_26
就称Python给定一组数据进行泊松分布的卡方检验 python生成泊松分布随机数_二项分布_03为服从参数 lambda 的指数分布(Exponential Distribution),记作Python给定一组数据进行泊松分布的卡方检验 python生成泊松分布随机数_python_28Python给定一组数据进行泊松分布的卡方检验 python生成泊松分布随机数_机器学习_29。指数分布只有一个参数 Python给定一组数据进行泊松分布的卡方检验 python生成泊松分布随机数_二项分布_16,且Python给定一组数据进行泊松分布的卡方检验 python生成泊松分布随机数_概率分布_31

指数分布的一个显著的特点是其具有无记忆性。

import numpy as np
from scipy import stats
import matplotlib.pyplot as plt


def exponential_dis(loc=0, scale=1.0):
    """
    指数分布, exponential continuous random variable
    按照定义,指数分布只有一个参数lambda, 这里的scale = 1 / lambda
    :param loc: 定义与的左端点,相当于将整体分布沿x轴平移loc
    :param scale: lambda的倒数,loc + scale表示该分布的均值, scale ^ 2表示该分布的方差
    :return:
    """
    exp_dis = stats.expon(loc=loc, scale=scale)
    x = np.linspace(exp_dis.ppf(0.000001), exp_dis.ppf(0.999999), 100)
    fig, ax = plt.subplots(1, 1)

    # 直接传入参数
    ax.plot(x, stats.expon.pdf(x, loc=loc, scale=scale), 'r-', lw=5, alpha=0.6, label='exponential pdf')
    # 从冻结的均匀分布取值
    ax.plot(x, exp_dis.pdf(x), 'k-', lw=2, label='frozen pdf')
    # 计算pdf分别等于0.001、0.5和0.999是的x值
    vals = exp_dis.ppf([0.001, 0.5, 0.999])
    print(vals)  # [2.00100067e-03 1.38629436e+00 1.38155106e+01]
    # 检测cdf和pdf的精确度
    print(np.allclose([0.001, 0.5, 0.999], exp_dis.cdf(vals)))
    # True

    r = exp_dis.rvs(size=10000)
    ax.hist(r, density=True, histtype='stepfilled', alpha=0.2)
    plt.ylabel('Probability')
    plt.title('PDF of Exp(0.5)')
    ax.legend(loc='best', frameon=False)
    plt.show()

exponential_dis(loc=0, scale=2)

Python给定一组数据进行泊松分布的卡方检验 python生成泊松分布随机数_二项分布_32

正态分布(Normal Distribution

正态分布(Normal Distribution),也称常态分布,又名高斯分布(Gaussian Distribution),最早由A.棣莫弗在求二项分布的渐近公式中得到。C.F.高斯在研究测量误差时从另一个角度导出了它。P.S.拉普拉斯和高斯研究了它的性质。正态分布是一个在数学、物理及工程等领域都非常重要的概率分布,在统计学的许多方面有着重大的影响力。正态曲线呈钟形,两头低,中间高,左右对称因其曲线呈钟形,因此人们又经常称其为钟形曲线

若随机变量X 服从一个数学期望为Python给定一组数据进行泊松分布的卡方检验 python生成泊松分布随机数_二项分布_33 、方差为Python给定一组数据进行泊松分布的卡方检验 python生成泊松分布随机数_机器学习_34的正态分布,记为 Python给定一组数据进行泊松分布的卡方检验 python生成泊松分布随机数_python_35
其概率密度函数为正态分布的期望值 Python给定一组数据进行泊松分布的卡方检验 python生成泊松分布随机数_二项分布_33 决定了其位置,其标准差 Python给定一组数据进行泊松分布的卡方检验 python生成泊松分布随机数_python_37决定了分布的幅度。
Python给定一组数据进行泊松分布的卡方检验 python生成泊松分布随机数_机器学习_38时的正态分布是标准正态分布

概率密度函数为Python给定一组数据进行泊松分布的卡方检验 python生成泊松分布随机数_概率论_39

正态分布中的两个参数含义如下:

  • 当固定 Python给定一组数据进行泊松分布的卡方检验 python生成泊松分布随机数_机器学习_40,改变 Python给定一组数据进行泊松分布的卡方检验 python生成泊松分布随机数_二项分布_41 的大小时, Python给定一组数据进行泊松分布的卡方检验 python生成泊松分布随机数_概率分布_42图形的形状不变,只是沿着轴作平移变换,因此Python给定一组数据进行泊松分布的卡方检验 python生成泊松分布随机数_二项分布_41 被称为位置参数(决定对称轴的位置);
  • 当固定Python给定一组数据进行泊松分布的卡方检验 python生成泊松分布随机数_二项分布_41,改变 Python给定一组数据进行泊松分布的卡方检验 python生成泊松分布随机数_机器学习_40 的大小时, Python给定一组数据进行泊松分布的卡方检验 python生成泊松分布随机数_概率分布_42图形的对称轴不变,形状改变,Python给定一组数据进行泊松分布的卡方检验 python生成泊松分布随机数_机器学习_40越小,图形尖峰越陡峭。 Python给定一组数据进行泊松分布的卡方检验 python生成泊松分布随机数_机器学习_40越大,图形越平坦,因此 Python给定一组数据进行泊松分布的卡方检验 python生成泊松分布随机数_机器学习_40被称为尺度参数,决定曲线的分散程度。
import math

import numpy as np
from scipy import stats
import matplotlib.pyplot as plt


u = 0  # 均值μ
sig = math.sqrt(0.2)  # 标准差σ

x = np.linspace(u - 3 * sig, u + 3 * sig, 50)
y_sig = np.exp(-(x - u) ** 2 / (2 * sig ** 2)) / (math.sqrt(2 * math.pi) * sig)
print(x)
print('=' * 20)
print(y_sig)
plt.plot(x, y_sig, 'r-', linewidth=2)
plt.grid(True)
plt.show()

Python给定一组数据进行泊松分布的卡方检验 python生成泊松分布随机数_python_50

总结

随机变量的性质主要有两类:

  • 一类是大而全的性质,这类性质可以详细描述述所有可能取值的概率,
    例如描述连续型随机变量的累积分布函数(Cumulative Distribution Function,CDF)、概率密度函数(Probability Density Function,PDF),
    描述离散型随机变量的概率质量分布函数(Probability Mass Function,PMF)等;
  • 另一类是找 到 该 随 机 变 量 的 一 些 特 征 或 代 表 值 , 例 如 随 机 变 量的 方 差(Variance)、期望(Expectation)、置信区间等数字特征。