gamma分布与指数分布、泊松分布甚至其它一些分布有较为紧密的联系,本文通过对比与之相关的概率分布,建立某种联系并推导其概率密度函数,以便加深理解与认知。
在设置 Gamma 的两个参数α、β 并将它们代入公式之前,让我们暂停一下,问几个问题……
1. 我们为什么要发明 Gamma 分布? 答:预测未来事件的等待时间。 嗯好的,但我认为这就是指数分布的目的。 那么,指数分布和伽马分布有什么区别呢? 指数分布预测等待时间,直到*最先*事件。另一方面,伽马分布预测等待时间,直到*第k个*事件发生。为什么我们必须发明 Gamma 分布?(即,为什么存在这种分布?) 何时应使用 Gamma 分布进行建模?
在我们之前的文章中,我们从泊松过程推导出了指数分布的 PDF。如果您还没有这样做,我强烈建议您学习泊松和指数分布。完全理解它们对于理解 Gamma 是绝对必要的。
顺序应该 1. Poisson,2. Exponential,3. Gamma。
Gamma 分布的 PDF 的推导与指数分布 PDF 的推导非常相似,除了一件事——它是直到第 k 个事件的等待时间,而不是第一个事件。
以以往的推导相似,为了得到 PDF,我们会先找到 CDF,然后再对其进行微分。
现在,让我们区分它。
为了更容易区分,我们从求和中取出 x = 0 时的项 ( e^(-λt) )。
我们得到了伽玛分布的PDF! 推导看起来很复杂,但我们只是重新排列变量,应用微分的乘积规则,扩展总和,并删除一些。 如果您查看推导的最终输出,您会注意到它与指数分布的 PDF 相同,当k =1 时。 由于k是一个正整数(k个事件的数量),(k) = (k−1)!其中表示伽马函数。最终产品可以重写为:
如果事件的到达遵循速率为 λ 的泊松过程,则直到 k 到达的等待时间遵循 Γ(k, λ)。
Gamma 的参数化有两个方面让我们感到困惑!
一是它有两个不同的参数化集——( k , θ ) &( α , β )——以及不同形式的 PDF。另一个是对于“规模”参数应该是什么没有普遍共识。 让我们澄清一下。 第一个问题很容易弄清楚。 对于 ( α , β ) 参数化:使用我们的符号k(事件数)和λ(事件率),只需将α替换为k,β替换为 λ。PDF 的格式与我们导出的格式相同。 对于(k, θ)参数化: θ是事件率 λ 的倒数,它是平均等待时间(事件到达之间的平均时间)。 即使 PDF 具有不同的格式,两种参数化都会生成相同的模型。就像为了定义一条直线一样,有些人使用斜率和 y 截距,而另一些人使用 x 截距和 y 截距,选择一个参数化而不是另一个参数化是个人喜好问题。在我看来,考虑到我们如何使用泊松率 λ 推导指数和伽马,使用 λ 作为速率参数更有意义。我还发现 ( α , β ) 参数化更容易集成。 其次,一些作者称λ为尺度参数,而另一些作者则称θ=1/λ为尺度参数。恕我直言,“形状”或“比例”参数实际上是用词不当。我绘制了具有不同k和λ集的多个 Gamma PDF( k和λ有无限的参数选择,因此,存在无限数量的可能 Gamma 分布)并实现了k(和λ)都改变了“形状”和“尺度” ”。认真命名它们的人可以给出更直观的名称,例如 - 事件数和泊松率! 眼见为实!让我们形象化。
对于固定速率λ,如果我们等待更多事件 ( k ) 发生,等待时间 ( T ) 会更长。
对于固定数量的事件k,当事件率λ较高时,我们等待较短的时间T。
这是生成上面漂亮图的 Python 代码。(自己绘制它们,看看这两个参数如何改变“比例”和“形状”!)
"""
k : 等待发生的事件数。
λ : 泊松分布后发生的事件率。
"""
x = np.linspace(0, 50, 1000)
a = 1 # k = 1
mean, var, skew, kurt = gamma.stats(a, moment='mvsk')
y1 = gamma.pdf(x, a)
a = 5 # k = 5
mean, var, skew, kurt = gamma.stats(a, moment='mvsk')
y2 = gamma.pdf(x, a)
a = 10 # k = 15
mean, var, skew, kurt = gamma.stats(a, moment='mvsk')
y3 = gamma.pdf(x, a)plt.title("伽玛分布的 PDF")
plt.xlabel("T")
plt.ylabel("概率密度")
plt.plot(x, y1, label="k = 1", color='palegreen')
plt.plot(x, y2, label="k = 5", color='yellowgreen')
plt.plot(x, y3, label="k = 10", color='olivedrab')
plt.legend(bbox_to_anchor= (1, 1), loc='右上角',
borderaxespad=1, fontsize=12)
plt.ylim([0, 0.40])
plt.xlim([0, 20])
plt.savefig('gamma_k.png' )
plt.clf()def plot_gamma_lambda():
"""
k : 等待发生的事件数。
λ : 泊松分布后发生的事件率。
"""
a = 10 # k = 10
x = np.linspace(0 , 50, 1000)
lambda_ = 1
mean, var, skew, kurt = gamma.stats(a, scale=1/lambda_, moment='mvsk')
y1 = gamma.pdf(x, a, scale=1/lambda_)
lambda_ = 2
mean, var, skew, kurt = gamma.stats(a, scale=1/lambda_, moment='mvsk')
y2 = gamma.pdf(x, a, scale=1/lambda_)
lambda_ = 3
mean, var, skew, kurt = gamma.stats(a, scale=1/lambda_, moment='mvsk')
y3 = gamma.pdf(x, a, scale=1/lambda_)plt.title("伽玛分布的 PDF (k = 10)")
plt.xlabel("T")
plt.ylabel("概率密度")
plt.plot(x, y1, label="λ = 1", color ='gold')
plt.plot(x, y2, label="λ = 2", color='burlywood')
plt.plot(x, y3, label="λ = 3", color='darkorange')
plt .legend(bbox_to_anchor=(1, 1), loc='右上角',
borderaxespad=1, fontsize=12)
plt.ylim([0, 0.40])
plt.xlim([0, 20])
plt.savefig( 'gamma_lambda.png')
plt.clf()
我们可以为使用指数分布的每个应用程序使用 Gamma 分布——等待时间建模、可靠性(故障)建模、服务时间建模(排队论)等——因为指数分布是 Gamma 分布的一个特例(只需插入1到k )。
【排队论示例】你去了Chipotle,加入了排在你前面的两个人的队伍。一个正在服务,另一个正在等待。它们的服务时间S1和S2是独立的指数随机变量,平均为 2 分钟。(因此平均服务费率为0.5/分钟。如果这个“费率与时间”的概念让您感到困惑,请阅读此内容以澄清。) 您在队列中等待超过 5 分钟的概率是多少? 我们所做的只是将t = 5和λ = 0.5代入我们已经导出的 Gamma 分布的 CDF。这与我们在指数随机变量的总和中介绍的示例相同。如您所见,我们也可以使用 Gamma 的 CDF 解决这个问题。 我在 Chipotle 等待超过 5 分钟的几率不到 30%?我会接受的! 需要注意的几点: Poisson、Exponential 和 Gamma 分布对同一过程的不同方面进行建模 - Poisson 过程。 泊松分布用于对未来事件的数量进行建模,指数分布用于预测第一个事件之前的等待时间,伽玛分布用于预测第 k 个事件之前的等待时间。 Gamma 的两个参数都是严格正数,因为一个是事件数,另一个是事件率。他们不能是消极的。 Gamma 分布的特殊情况 Erlang 和 Gamma 之间的区别在于,在 Gamma 分布中,k可以是非整数(正实数),而在 Erlang 中,k只能是正整数。