指数分布是泊松点过程中事件之间时间的概率分布,即事件以恒定的平均速率连续且独立发生的过程。这是伽玛分布的一个特例。例如,顾客到达商店、服务器上的文件请求等。

指数分布的概率密度函数(pdf)定义为:

NumPy 指数分布

其中,β 是尺度参数,它是倒数速率参数 λ = 1/β。

指数分布的均值 β 和方差 β2

累积分布函数 ( cdf) 在 x 处评估,是随机变量 (X) 取小于或等于 x 的值的概率。指数分布的cdf定义为:

NumPy 指数分布

NumPy random.exponential() 函数返回指数分布的随机样本。

语法

numpy.random.exponential(scale=1.0, size=None) 

参数

scale可选。 指定尺度参数,β = 1/λ。 float 或 array_like of floats。必须是非负数。默认值为 1.0。
size可选。 指定输出形状。 int 或 int 元组。如果给定形状为(m, n, k),则绘制m * n * k个样本。如果 size 为 None(默认),并且 scale 是标量,则返回单个值。否则,将抽取 np.array(scale).size 样本。

返回值

返回来自参数化指数分布的样本。 ndarray 或标量。

示例:指数分布的值

在下面的示例中,random.exponential() 函数用于创建给定矩阵包含从指定指数分布中抽取的随机值的形状。

import numpy as np

size = (5,3)

sample = np.random.exponential(1, size)
print(sample) 

上述代码的可能输出可能是:

[[0.71318134 0.51261985 2.21255627]
 [0.38593481 0.54545811 0.39075276]
 [0.56583485 1.59475025 0.13879821]
 [0.82487244 0.20735562 1.33014896]
 [0.21085364 1.06640552 1.33323175]] 

绘制指数分布

示例:密度图

Matplotlib 是一个 Python 绘图库,可用于绘制指数分布的概率密度函数 (pdf)使用 hist() 函数。

import matplotlib.pyplot as plt
import numpy as np

#修复种子以提高重现性
#结果
np.random.seed(10)

size = 10000
#抽取10000个样本
#指数分布
sample = np.random.exponential(1, size)
bin = np.arange(0,10,0.1)

plt.hist(sample, bins=bin, edgecolor='blue') 
plt.title("Exponential Distribution") 
plt.show() 

上述代码的输出将是:

NumPy 指数分布

示例:比较 pdf

可以使用 Seaborn kdeplot() 函数以图形方式比较多个概率密度函数。 在下面的示例中,比较了三个指数分布(分别具有比例因子 1、2 和 3)的 pdf。

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

#修复种子以提高重现性
#结果
np.random.seed(10)

size = 1000
#绘制1000个样本
#不同的指数分布
sns.kdeplot(np.random.exponential(1, size))
sns.kdeplot(np.random.exponential(2, size))
sns.kdeplot(np.random.exponential(3, size))

plt.legend([r"$\beta = 1$", 
            r"$\beta = 2$", 
            r"$\beta = 3$"])
plt.show() 

上述代码的输出将为:

NumPy 指数分布

示例:比较 cdf

可以使用 Seaborn ecdfplot() 函数以图形方式比较多个累积分布函数。在下面的示例中,比较了三个指数分布(比例因子分别为 1、2 和 3)的 cdf。

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

#修复种子以提高重现性
#结果
np.random.seed(10)

size = 1000
#绘制1000个样本
#不同的指数分布
sns.ecdfplot(np.random.exponential(1, size))
sns.ecdfplot(np.random.exponential(2, size))
sns.ecdfplot(np.random.exponential(3, size))

plt.legend([r"$\beta = 1$", 
            r"$\beta = 2$", 
            r"$\beta = 3$"])
plt.show() 

上述代码的输出将为:

NumPy 指数分布