Python--随机变量分布之伯努利分布、二项式分布、泊松分布、均匀分布、指数分布、正态分布 【实践】

前言

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

离散型

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

连续型

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

代码实现

伯努利分布(Bernoulli Distribution)

伯努利分布(Bernoulli Distribution)又称两点分布或0-1分布,
其样本空间中只有两个点,一般取为{0,1},不同的伯努利分布只是取到这两个值的概率不同。
伯努利分布只有一个参数 ,记作 X ~ B e r n o u l l i ( p ) X~Bernoulli(p) XBernoullip,或 X ~ B ( 1 , p ) X~B(1, p) XB1p,读作 X X X服从参数为 p p p的伯努利分布

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)

在这里插入图片描述

二项式分布

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

一个随机变量 服从参数为 n n n p p p的二项分布,记作 X ~ B i n o m i a l ( n , p ) X~Binomial(n , p) XBinomialnp X ~ B ( n , p ) X~B( n, p) XBnp

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

  • 如果将抛一次硬币看作一次伯努利实验,且将正面朝上记为1,反面朝上记为0。那么抛 n n n次硬币,记录正面朝上的次数 Y Y Y, 就服从二项分布。
    假如硬币是均匀的, 取值应该大部分集中在 n / 2 n/2 n/2附近,而非常大或非常小的值都很少。
  • 由此可见,二项分布关注的是计数,而伯努利分布关注的是比值( 正面朝上的计数 / n 正面朝上的计数/ n 正面朝上的计数/n)。
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)

在这里插入图片描述

泊松分布

如果某事件以固定强度随机且独立地出现,该事件在单位时间内出现的次数(个数)可以看成是服从泊松分布。
我们把一个随机变量 X X X服从参数为 λ \lambda λ 的泊松分布,记作 X ~ P o i s s o n ( λ ) X~Poisson( \lambda) XPoissonλ,或 X ~ P (  l a m b d a ) X~P(\ lambda) XP lambda。泊松分布适合于描述单位时间内随机事件发生次数的概率分布

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)

在这里插入图片描述

均匀分布(Uniform Distribution)

均匀分布(Uniform Distribution)是最简单的连续型概率分布,因为其概率密度是一个常数,不随随机变量取值的变化而变化。
如果连续型随机变量 具有如下的概率密度函数,则称 服从 [ a , b ] [ a, b] [ab]上的均匀分布,记作 X ~ U ( a , b ) X~U( a, b) XUab X ~ U n i f ( a , b ) X~Unif( a, b) XUnifab
f ( x ) = { 1 / ( b − a ) , a < x < b 0 , x < a 或 x > b f(x)=\begin{cases}1 / (b - a), &a< x < b \\ 0 ,& x< a 或 x > b\end{cases} f(x)={1/(ba),0,a<x<bx<ax>b

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)

在这里插入图片描述

指数分布

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

  • 泊松分布表示单位时间(或单位面积)内随机事件的平均发生次数

  • 指数分布则可以用来表示独立随机事件发生的时间间隔。

  • 由于发生次数只能是自然数,所以泊松分布自然就是离散型的随机变量,而时间间隔则可以是任意的实数,因此其定义域是 ( 0 , + ∞ ) (0,+∞) 0+

如果一个随机变量 的概率密度函数满足以下形式,
f ( x ) = { λ ∗ e − λ ∗ e , x > 0 0 , 其他 f(x) = \begin{cases}\lambda * e^{-\lambda * e}, &x > 0 \\ 0, &其他 \end{cases} f(x)={λeλe,0,x>0其他
就称 X X X为服从参数 lambda 的指数分布(Exponential Distribution),记作 X ~ E ( λ ) X~E(\lambda ) XEλ X ~ E x p ( λ ) X~Exp(\lambda ) XExpλ。指数分布只有一个参数 λ \lambda λ,且 λ > 0 \lambda >0 λ0

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

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)

在这里插入图片描述

正态分布(Normal Distribution

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

若随机变量X 服从一个数学期望为 μ μ μ 、方差为 σ 2 σ^2 σ2的正态分布,记为 N ( μ , σ 2 ) N( μ, σ^2) Nμσ2
其概率密度函数为正态分布的期望值 μ μ μ 决定了其位置,其标准差 σ σ σ决定了分布的幅度。
μ = 0 , σ = 1 μ =0, σ=1 μ=0σ=1时的正态分布是标准正态分布

概率密度函数为 f ( x ) = ( 1 / σ ∗ 2 π ) ∗ e − ( x − μ ) 2 / 2 σ 2 ) f(x) = (1 / σ * \sqrt{2π}) * e^{-(x-μ)^2} / 2σ^2) f(x)=(1/σ2π )e(xμ)2/2σ2)

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

  • 当固定 σ σ σ,改变 μ μ μ 的大小时, f ( x ) f(x) fx图形的形状不变,只是沿着轴作平移变换,因此 μ μ μ 被称为位置参数(决定对称轴的位置);
  • 当固定 μ μ μ,改变 σ σ σ 的大小时, f ( x ) f(x) fx图形的对称轴不变,形状改变, σ σ σ越小,图形尖峰越陡峭。 σ σ σ越大,图形越平坦,因此 σ σ σ被称为尺度参数,决定曲线的分散程度。
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()

在这里插入图片描述

总结

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

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

以上是我个人在学习过程中的记录所学,希望对正在一起学习的小伙伴有所帮助!!!
如果对你有帮助,希望你能一键三连【关注、点赞、收藏】!!!

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

故事挺秃然

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值