注:上一小节总结了离散型随机变量,这个小节总结连续型随机变量。离散型随机变量的可能取值只有有限多个或是无限可数的(可以与自然数一一对应),连续型随机变量的可能取值则是一段连续的区域或是整个实数轴,是不可数的。最常见的一维连续型随机变量有三种:均匀分布,指数分布和正态分布。下面还是主要从概述、定义、主要用途和Python的实现几个方面逐一描述。
以下所有Python代码示例,均默认已经导入上面的这几个包,导入代码如下:
import numpy as np from scipy import stats import matplotlib.pyplot as plt
Python中调用一个分布函数以及相关方法还是遵循以下步骤:
- 初始化一个分布函数(也叫作冻结的分布);
- 调用该分布函数的方法或计算其数值特征;
1. 均匀分布
均匀分布算是最简单的连续型概率分布。因为其概率密度是一个常数,不随随机变量X取值的变化而变化。
1.1 定义
如果连续型随机变量 $X$ 具有如下的概率密度函数,则称 $X$ 服从 $[a,b]$ 上的均匀分布(uniform distribution),记作 $X \sim U(a,b)$ 或 $X \sim Unif(a,b)$
\begin{equation}
\nonumber f_X(x) = \left\{
\begin{array}{l l}
\frac{1}{b-a} & \quad a < x < b\\
0 & \quad x < a \textrm{ or } x > b
\end{array} \right.
\end{equation}
均匀分布具有等可能性,也就是说,服从 $U(a,b)$ 上的均匀分布的随机变量 $X$ 落入 $(a, b)$ 中的任意子区间上的概率只与其区间长度有关,与区间所处的位置无关。
由于均匀分布的概率密度函数是一个常数,因此其累积分布函数是一条直线,即随着取值在定义域内的增加,累积分布函数值均匀增加。
\begin{equation}
\hspace{70pt}
F_X(x) = \left\{
\begin{array}{l l}
0 & \quad \textrm{for } x < a \\
\frac{x-a}{b-a} & \quad \textrm{for }a \leq x \leq b\\
1 & \quad \textrm{for } x > b
\end{array} \right.
\hspace{70pt}
\end{equation}
图1-1,均匀分布的累积分布函数曲线
1.2 主要用途
- 设通过某站的汽车10分钟一辆,则乘客候车时间 $X$ 在 $[0, 10]$ 上服从均匀分布;
- 某电台每个20分钟发一个信号,我们随手打开收音机,等待时间 $X$ 在 $[0, 20]$ 上服从均匀分布;
- 随机投一根针与坐标纸上,它和坐标轴的夹角 $X$ 在 $[0, π]$ 上服从均匀分布。
1.3 Python实现
从定义可以看出来,定义一个均匀分布需要两个参数,定义域区间的起点 $a$ 和终点 $b$,但是在Python中是 location 和 scale, 分别表示起点和区间长度。
参考:https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.uniform.html#scipy.stats.uniform
1 def uniform_distribution(loc=0, scale=1): 2 """ 3 均匀分布,在实际的定义中有两个参数,分布定义域区间的起点和终点[a, b] 4 :param loc: 该分布的起点, 相当于a 5 :param scale: 区间长度, 相当于 b-a 6 :return: 7 """ 8 uniform_dis = stats.uniform(loc=loc, scale=scale) 9 x = np.linspace(uniform_dis.ppf(0.01), 10 uniform_dis.ppf(0.99), 100) 11 fig, ax = plt.subplots(1, 1) 12 13 # 直接传入参数 14 ax.plot(x, stats.uniform.pdf(x, loc=2, scale=4), 'r-', 15 lw=5, alpha=0.6, label='uniform pdf') 16 17 # 从冻结的均匀分布取值 18 ax.plot(x, uniform_dis.pdf(x), 'k-', 19 lw=2, label='frozen pdf') 20 21 # 计算ppf分别等于0.001, 0.5, 0.999时的x值 22 vals = uniform_dis.ppf([0.001, 0.5, 0.999]) 23 print(vals) # [ 2.004 4. 5.996] 24 25 # Check accuracy of cdf and ppf 26 print(np.allclose([0.001, 0.5, 0.999], uniform_dis.cdf(vals))) # Ture 27 28 r = uniform_dis.rvs(size=10000) 29 ax.hist(r, normed=True, histtype='stepfilled', alpha=0.2) 30 plt.ylabel('Probability') 31 plt.title(r'PDF of Unif({}, {})'.format(loc, loc+scale)) 32 ax.legend(loc='best', frameon=False) 33 plt.show() 34 35 uniform_distribution(loc=2, scale=4)
上面的代码采用两种方式——直接传入参数和先冻结一个分布,画出来均匀分布的概率分布函数。此外还从该分布中取了10000个值做直方图。
图2-2,均匀分布 $U(2, 6)$ 的概率密度函数曲线
2. 指数分布
其实指数分布和离散型的泊松分布之间有很大的关系。泊松分布表示单位时间(或单位面积)内随机事件的平均发生次数,指数分布则可以用来表示独立随机事件发生的时间间隔。由于发生次数只能是自然数,所以泊松分布自然就是离散型的随机变量;而时间间隔则可以是任意的实数,因此其定义域是 $(0, +\infty)$。
2.1 定义
如果一个随机变量 $X$ 的概率密度函数满足一下形式,就称 $X$ 为服从参数 $\lambda$ 的指数分布(Exponential Distribution),记做 $X \sim E(\lambda)$ 或 $X \sim Exp(\lambda)$.
指数分布只有一个参数 $\lambda$,且 $\lambda > 0$.
\begin{equation}
\nonumber f_X(x) = \left\{
\begin{array}{l l}
\lambda e^{-\lambda x} & \quad x > 0\\
0 & \quad \textrm{otherwise}
\end{array} \right.
\end{equation}
2.2 主要用途
- 表示独立随机事件发生的时间间隔,比如旅客进机场的时间间隔、中文维基百科新条目出现的时间间隔等;
- 在排队论中,一个顾客接受服务的时间长短也可以用指数分布来近似;
- 无记忆性的现象(连续时间)。
2.3 性质
指数分布的一个显著的特点是其具有无记忆性。例如如果排队的顾客接受服务的时间长短服从指数分布,那么无论你已经排了多久时间的队,在排 t 分钟的概率始终是相同的。
用公式表示就是:
$$P(X \geq s + t | X \geq s) = P(X \geq t)$$.
其实我还没有找到一种直观的理解指数分布这一性质的方法。
2.4 Python 实现
这里的参数与实际指数分布的参数有点不一样,参考下面代码中的注释。
1 def exponential_dis(loc=0, scale=1.0): 2 """ 3 指数分布,exponential continuous random variable 4 按照定义,指数分布只有一个参数lambda,这里的scale = 1/lambda 5 :param loc: 定义域的左端点,相当于将整体分布沿x轴平移loc 6 :param scale: lambda的倒数,loc + scale表示该分布的均值,scale^2表示该分布的方差 7 :return: 8 """ 9 exp_dis = stats.expon(loc=loc, scale=scale) 10 x = np.linspace(exp_dis.ppf(0.000001), 11 exp_dis.ppf(0.999999), 100) 12 fig, ax = plt.subplots(1, 1) 13 14 # 直接传入参数 15 ax.plot(x, stats.expon.pdf(x, loc=loc, scale=scale), 'r-', 16 lw=5, alpha=0.6, label='uniform pdf') 17 18 # 从冻结的均匀分布取值 19 ax.plot(x, exp_dis.pdf(x), 'k-', 20 lw=2, label='frozen pdf') 21 22 # 计算ppf分别等于0.001, 0.5, 0.999时的x值 23 vals = exp_dis.ppf([0.001, 0.5, 0.999]) 24 print(vals) # [ 2.004 4. 5.996] 25 26 # Check accuracy of cdf and ppf 27 print(np.allclose([0.001, 0.5, 0.999], exp_dis.cdf(vals))) 28 29 r = exp_dis.rvs(size=10000) 30 ax.hist(r, normed=True, histtype='stepfilled', alpha=0.2) 31 plt.ylabel('Probability') 32 plt.title(r'PDF of Exp(0.5)') 33 ax.legend(loc='best', frameon=False) 34 plt.show() 35 36 exponential_dis(loc=0, scale=2)
上面给出了 $Exp(0.5)$ 的概率分布函数图,
图2-1, $Exp(0.5)$ 的概率分布函数图
下面是对不同参数的指数分布的概率分布函数图的比较:
图2-2,不同参数的指数分布pdf图
代码如下:
1 def diff_exp_dis(): 2 """ 3 不同参数下的指数分布 4 :return: 5 """ 6 exp_dis_0_5 = stats.expon(scale=0.5) 7 exp_dis_1 = stats.expon(scale=1) 8 exp_dis_2 = stats.expon(scale=2) 9 10 x1 = np.linspace(exp_dis_0_5.ppf(0.001), exp_dis_0_5.ppf(0.9999), 100) 11 x2 = np.linspace(exp_dis_1.ppf(0.001), exp_dis_1.ppf(0.999), 100) 12 x3 = np.linspace(exp_dis_2.ppf(0.001), exp_dis_2.ppf(0.99), 100) 13 fig, ax = plt.subplots(1, 1) 14 ax.plot(x1, exp_dis_0_5.pdf(x1), 'b-', lw=2, label=r'lambda = 2') 15 ax.plot(x2, exp_dis_1.pdf(x2), 'g-', lw=2, label='lambda = 1') 16 ax.plot(x3, exp_dis_2.pdf(x3), 'r-', lw=2, label='lambda = 0.5') 17 plt.ylabel('Probability') 18 plt.title(r'PDF of Exponential Distribution') 19 ax.legend(loc='best', frameon=False) 20 plt.show() 21 22 diff_exp_dis()