http://cos.name/2013/01/lda-math-gamma-function/

1. 神奇的Gamma函数
1.1 Gamma 函数诞生记
学高等数学的时候,我们都学习过如下一个长相有点奇特的Gamma函数

Γ(x)=∫∞0tx−1e−tdt

通过分部积分的方法,可以推导出这个函数有如下的递归性质

Γ(x+1)=xΓ(x)

于是很容易证明,Γ(x) 函数可以当成是阶乘在实数集上的延拓,具有如下性质

Γ(n)=(n−1)!

学习了Gamma 函数之后,多年以来我一直有两个疑问:

  • 这个长得这么怪异的一个函数,数学家是如何找到的;
  • 为何定义 Γ 函数的时候,不使得这个函数的定义满足Γ(n)=n! 而是 Γ(n)=(n−1)!

最近翻了一些资料,发现有不少文献资料介绍 Gamma 函数发现的历史,要说清楚它需要一定的数学推导,这儿只是简要的说一些主线。

1728年,哥德巴赫在考虑数列插值的问题,通俗的说就是把数列的通项公式定义从整数集合延拓到实数集合,例如数列 1,4,9,16,⋯ 可以用通项公式 n2 自然的表达,即便 n 为实数的时候,这个通项公式也是良好定义的。直观的说也就是可以找到一条平滑的曲线y=x2通过所有的整数点(n,n2),从而可以把定义在整数集上的公式延拓到实数集合。一天哥德巴赫开始处理阶乘序列 1,2,6,24,120,720,⋯,我们可以计算 2!,3!, 是否可以计算 2.5!呢?我们把最初的一些 (n,n!)的点画在坐标轴上,确实可以看到,容易画出一条通过这些点的平滑曲线。

但是哥德巴赫无法解决阶乘往实数集上延拓的这个问题,于是写信请教尼古拉斯.贝努利和他的弟弟丹尼尔.贝努利,由于欧拉当时和丹尼尔.贝努利在一块,他也因此得知了这个问题。而欧拉于1729 年完美的解决了这个问题,由此导致了Γ 函数的诞生,当时欧拉只有22岁。

事实上首先解决n!的插值计算问题的是丹尼尔.贝努利,他发现,
如果 m,n都是正整数,如果 m→∞,有

1⋅2⋅3⋯m(1+n)(2+n)⋯(m−1+n)(m+n2)n−1→n!

于是用这个无穷乘积的方式可以把n!的定义延拓到实数集合。例如,取 n=2.5, m足够大,基于上式就可以近似计算出 2.5!。

欧拉也偶然的发现 n! 可以用如下的一个无穷乘积表达

[(21)n1n+1][(32)n2n+2][(43)n3n+3]⋯=n!(∗)(1)

用极限形式,这个式子整理后可以写为

limm→∞1⋅2⋅3⋯m(1+n)(2+n)⋯(m+n)(m+1)n=n!(∗∗)(2)

左边可以整理为

===1⋅2⋅3⋯m(1+n)(2+n)⋯(m+n)(m+1)n1⋅2⋅3⋯n⋅(n+1)(n+2)⋯m(1+n)(2+n)⋯m⋅(m+1)n(m+1)(m+2)⋯(m+n)n!(m+1)n(m+1)(m+2)⋯(m+n)n!∏k=1nm+1m+k→n!(m→∞)

所以 (*)、(**)式都成立。

欧拉开始尝试从一些简单的例子开始做一些计算,看看是否有规律可循,欧拉极其擅长数学的观察与归纳。当 n=1/2 的时候,带入(*)式计算,整理后可以得到

(12)!=2⋅43⋅3⋅4⋅65⋅5⋅6⋅87⋅7⋅8⋅109⋅9⋯−−−−−−−−−−−−−−−−−−−−−−−√

然而右边正好和著名的 Wallis 公式关联。Wallis 在1665年使用插值方法计算半圆曲线 y=x(1−x)−−−−−−−√ 下的面积(也就是直径为1的半圆面积)的时候,得到关于π的如下结果,

2⋅43⋅3⋅4⋅65⋅5⋅6⋅87⋅7⋅8⋅109⋅9⋯=π4

于是,欧拉利用 Wallis 公式得到了如下一个很漂亮的结果

(12)!=π√2

大数学家欧拉

欧拉和高斯都是具有超凡直觉的数学家,但是欧拉和高斯的风格迥异。高斯是个老狐狸,数学上非常严谨,发表结果的时候却都把思考的痕迹抹去,只留下漂亮的结果,这招致了一些数学家对高斯的批评;而欧拉的风格不同,经常通过经验直觉做大胆的猜测,而他的文章中往往留下他如何做数学猜想的痕迹,而文章有的时候论证不够严谨。 拉普拉斯曾说过:”读读欧拉,他是所有人的老师。”波利亚在他的名著《数学与猜想》中也对欧拉做数学归纳和猜想的方式推崇备至。

欧拉看到 (12)! 中居然有 π, 对数学家而言,有π 的地方必然有和圆相关的积分。由此欧拉猜测 n! 一定可以表达为某种积分形式,于是欧拉开始尝试把 n! 表达为积分形式。虽然Wallis 的时代微积分还没有发明出来,Wallis 是使用插值的方式做推导计算的,但是Wallis 公式的推导过程基本上就是在处理积分 ∫10x12(1−x)12dx,受 Wallis 的启发,欧拉开始考虑如下的一般形式的积分

J(e,n)=∫10xe(1−x)ndx

此处n 为正整数,e 为正实数。利用分部积分方法,容易得到

J(e,n)=ne+1J(e+1,n−1)

重复使用上述迭代公式,最终可以得到

J(e,n)=1⋅2⋯n(e+1)(e+2)⋯(e+n+1)

于是欧拉得到如下一个重要的式子

n!=(e+1)(e+2)⋯(e+n+1)∫10xe(1−x)ndx

接下来,欧拉使用了一点计算技巧,取 e=f/g 并且令 f→1,g→0,
然后对上式右边计算极限(极限计算的过程此处略去,推导不难,有兴趣的同学看后面的参考文献吧),于是欧拉得到如下简洁漂亮的结果:

n!=∫10(−logt)ndt

欧拉成功的把n!表达为了积分形式!如果我们做一个变换 t=e−u,就可以得到我们常见的Gamma 函数形式

n!=∫∞0une−udu

于是,利用上式把阶乘延拓到实数集上,我们就得到 Gamma 函数的一般形式

Γ(x)=∫10(−logt)x−1dt=∫∞0tx−1e−tdt

Gamma 函数找到了,我们来看看第二个问题,为何 Gamma 函数被定义为 Γ(n)=(n−1)!, 这看起来挺别扭的。如果我们稍微修正一下,把Gamma 函数定义中的 tx−1 替换为tx

Γ(x)=∫∞0txe−tdt

这不就可以使得 Γ(n)=n!了嘛。欧拉最早的Gamma函数定义还真是如上所示,选择了Γ(n)=n!,可是欧拉不知出于什么原因,后续修改了 Gamma 函数的定义,使得Γ(n)=(n−1)!。 而随后勒让德等数学家对Gamma 函数的进一步深入研究中,认可了这个定义,于是这个定义就成为了既成事实。有数学家猜测,一个可能的原因是欧拉研究了如下积分

B(m,n)=∫10xm−1(1−x)n−1dx

这个函数现在称为Beta 函数。如果Gamma 函数的定义选取满足 Γ(n)=(n−1)!, 那么有

B(m,n)=Γ(m)Γ(n)Γ(m+n)

非常漂亮的对称形式。可是如果选取Γ(n)=n! 的定义,令

E(m,n)=∫10xm(1−x)ndx

则有

E(m,n)=Γ(m)Γ(n)Γ(m+n+1)

这个形式显然不如 B(m,n)优美,而数学家总是很在乎数学公式的美感的。

要了解更多的 Gamma 函数的历史,推荐阅读

  • Philip J. Davis, Leonhard Euler’s Integral: A Historical Profile of the Gamma Function
  • Jacques Dutka, The Early History of the Factorial Function
  • Detlef Gronnau, Why is the gamma function so as it is?

1.2 Gamma 函数欣赏

Each generation has found something of interest to say about the gamma function. Perhaps the next generation will also. 
—Philip J.Davis

Gamma 函数从它诞生开始就被许多数学家进行研究,包括高斯、勒让德、威尔斯特拉斯、柳维尔等等。这个函数在现代数学分析中被深入研究,在概率论中也是无处不在,很多统计分布都和这个函数相关。Gamma 函数作为阶乘的推广,首先它也有和 Stirling 公式类似的一个结论

Γ(x)∼2π−−√e−xxx−12

另外, Gamma 函数不仅可以定义在实数集上,还可以延拓到整个复平面上。

复平面上的Gamma 函数

Gamma 函数有很多妙用,它不但使得 (1/2)! 的计算有意义,还能扩展很多其他的数学概念。比如导数,我们原来只能定义一阶、二阶等整数阶导数,有了Gamma 函数我们可以把函数导数的定义延拓到实数集,从而可以计算 1/2 阶导数,同样的积分作为导数的逆运算也可以有分数阶。我们先考虑一下 xn 的各阶导数

由于k阶导数可以用阶乘表达,于是我们用Gamma 函数表达为

Γ(n+1)Γ(n−k+1)xn−k

于是基于上式,我们可以把导数的阶从整数延拓到实数集。例如,取n=1,k=12我们可以计算 x 的 12阶导数为

Γ(1+1)Γ(1−1/2+1)x1−1/2=2x√π√

很容易想到对于一般的函数 f(x) 通过 Taylor 级数展开可以表达为幂级数,于是借用 xn 的分数阶导数,我们可以尝试定义出任意函数的分数阶导数。不过有点遗憾的是这种定义方法并非良定义的,不是对所有函数都适用,但是这个思想却是被数学家广泛采纳了,并由此发展了数学分析中的一个研究课题:Fractional Calculus,在这种微积分中,分数阶的导数和积分都具有良定义,而这都依赖于 Gamma 函数。

Gamma 函数和欧拉常数γ 有密切关系,可以发现

γ=−dΓ(x)dx|x=1=limn→∞(1+12+13+⋯+1n–logn)

进一步还可以发现 Gamma 函数和黎曼函数ζ(s)有密切联系,

ζ(s)=1+12s+13s+⋯

而ζ 函数涉及了数学中著名的黎曼猜想和素数的分布定理。希尔伯特曾说,如果他在沉睡1000年后醒来,他将问的第一个问题便是:黎曼猜想得到证明了吗?

logΓ(x)

从Gamma 函数的图像我们可以看到它是一个凸函数, 不仅如此, logΓ(x) 也是一个凸函数,数学上可以证明如下定理:

[Bohr-Mullerup定理]  如果 f:(0,∞)→(0,∞),且满足

  1. f(1)=1
  2. f(x+1)=xf(x)
  3. logf(x) 是凸函数

那么 f(x)=Γ(x), 也就是 Γ(x)是唯一满足以上条件的函数。

如下函数被称为 Digamma 函数,

Ψ(x)=dlogΓ(x)dx

这也是一个很重要的函数,在涉及求Dirichlet 分布相关的参数的极大似然估计时,往往需要使用到这个函数。Digamma 函数具有如下一个漂亮的性质

Ψ(x+1)=Ψ(x)+1x

函数Ψ(x)和欧拉常数γ 以及 ζ 函数都有密切关系,令

Ψn(x)=dn+1logΓ(x)dxn+1

则 Ψ0(x)=Ψ(x),可以证明

Ψ(1)=−γ,Ψ(2)=1−γ
Ψ1(1)=ζ(2)=π26,Ψ2(1)=−2ζ(3)

所以Gamma 函数在数学上是很有魅力的,它在数学上应用广泛,不仅能够被一个理科本科生很好的理解,本身又足够的深刻,具有很多漂亮的数学性质,历史上吸引了众多一流的数学家对它进行研究。美国数学家 Philip J.Davis 写了篇很有名的介绍 Gamma 函数的文章:“Leonhard Euler’s Integral:A Historical Profile of the Gamma Function”,文中对 Gamma 函数一些特性发现的历史进行了很详细的描述,这篇文章获得了 Chauvenet Prize(美国数学会颁发的数学科普最高奖)。

(本小节主要是数学欣赏,如果对某些概念不熟悉,就略过吧:-))

1.3 从二项分布到Gamma 分布

Gamma 函数在概率统计中频繁现身,众多的统计分布,包括常见的统计学三大分布(t分布,χ2 分布,F 分布)、Beta分布、 Dirichlet 分布的密度公式中都有 Gamma 函数的身影;当然发生最直接联系的概率分布是直接由 Gamma 函数变换得到的 Gamma 分布。对Gamma 函数的定义做一个变形,就可以得到如下式子

∫∞0xα−1e−xΓ(α)dx=1

于是,取积分中的函数作为概率密度,就得到一个形式最简单的Gamma 分布的密度函数

Gamma(x|α)=xα−1e−xΓ(α)

如果做一个变换 x=βt, 就得到Gamma 分布的更一般的形式

Gamma(t|α,β)=βαtα−1e−βtΓ(α)

其中 α 称为 shape parameter, 主要决定了分布曲线的形状;而β 称为 rate parameter 或者inverse scale parameter (1β 称为scale parameter),主要决定曲线有多陡。

Gamma(t|α,β)分布图像

Gamma 分布在概率统计领域也是一个万人迷,众多统计分布和它有密切关系。指数分布和χ2 分布都是特殊的Gamma 分布。另外Gamma 分布作为先验分布是很强大的,在贝叶斯统计分析中被广泛的用作其它分布的先验。如果把统计分布中的共轭关系类比为人类生活中的情侣关系的话,那指数分布、Poission分布、正态分布、对数正态分布都可以是 Gamma 分布的情人。接下来的内容中中我们主要关注β=1的简单形式的 Gamma 分布。

Gamma 分布首先和 Poisson 分布、Poisson 过程发生密切的联系。我们容易发现Gamma 分布的概率密度和 Poisson 分布在数学形式上具有高度的一致性。参数为λ的Poisson 分布,概率写为

Poisson(X=k|λ)=λke−λk!

在 Gamma 分布的密度中取 α=k+1 得到

Gamma(x|α=k+1)=xke−xΓ(k+1)=xke−xk!

所以这两个分布数学形式上是一致的,只是 Poisson 分布是离散的,Gamma 分布是连续的,可以直观的认为 Gamma 分布是 Poisson 分布在正实数集上的连续化版本。

这种数学上的一致性是偶然的吗?这个问题我个人曾经思考了很久,终于想明白了从二项分布出发能把 Gamma 分布和 Poisson 分布紧密联系起来。我们在概率统计中都学过 Poisson(λ) 分布可以看成是二项分布 B(n,p) 在 np=λ,n→∞ 条件下的极限分布。如果你对二项分布关注的足够多,可能会知道二项分布的随机变量X∼B(n,p)满足如下一个很奇妙的恒等式

P(X≤k)=n!k!(n−k−1)!∫1ptk(1−t)n−k−1dt(∗)(3)

这个等式反应的是二项分布和 Beta 分布之间的关系,证明并不难,它可以用一个物理模型直观的做概率解释,而不需要使用复杂的数学分析的方法做证明。由于这个解释和 Beta 分布有紧密的联系,所以这个直观的概率解释我们放到下一个章节,讲解 Beta/Dirichlet 分布的时候进行。此处我们暂时先承认(*)这个等式成立。我们在等式右侧做一个变换t=xn,得到

P(X≤k)=n!k!(n−k−1)!∫1ptk(1−t)n−k−1dt=n!k!(n−k−1)!∫nnp(xn)k(1−xn)n−k−1dxn=(n−1)!k!(n−k−1)!∫nnp(xn)k(1−xn)n−k−1dx=∫nnp(n−1k)(xn)k(1−xn)n−k−1dx=∫nnpBinomial(Y=k|n−1,xn)dx(4)

上式左侧是二项分布 B(n,p), 而右侧为无穷多个二项分布 B(n−1,xn)的积分和, 所以可以写为

Binomial(X≤k|n,p)=∫nnpBinomial(Y=k|n−1,xn)dx(5)

实际上,对上式两边在条件np=λ,n→∞ 下取极限,则左边有 B(n,p)→Poisson(λ), 而右边有B(n−1,xn)→Poisson(x),所以得到

Poisson(X≤k|λ)=∫∞λPoisson(Y=k|x)dx(6)

把上式右边的Possion 分布展开,于是得到

Poisson(X≤k|λ)=∫∞λPoisson(Y=k|x)dx=∫∞λxke−xk!dx

所以对于们得到如下一个重要而有趣的等式

Poisson(X≤k|λ)=∫∞λxke−xk!dx(∗∗)(7)

接下来我们继续玩点好玩的,对上边的等式两边在 λ→0 下取极限,左侧Poisson分布是要至少发生k个事件的概率, λ→0 的时候就不可能有事件发生了,所以 P(X≤k)→1, 于是我们得到

1=limλ→0∫∞λxke−xk!dx=∫∞0xke−xk!dx

在这个积分式子说明 f(x)=xke−xk!在正实数集上是一个概率分布函数,而这个函数恰好就是Gamma 分布。我们继续把上式右边中的 k! 移到左边,于是得到

k!=∫∞0xke−xdx

于是我们得到了 k! 表示为积分的方法。

看,我们从二项分布的一个等式出发, 同时利用二项分布的极限是Possion 分布这个性质,基于比较简单的逻辑,推导出了 Gamma 分布,同时把 k! 表达为 Gamma 函数了!实际上以上推导过程是给出了另外一种相对简单的发现 Gamma 函数的途径。

回过头我们看看(**)式,非常有意思,它反应了Possion 分布和 Gamma 分布的关系,这个和(*)式中中反应的二项分布和Beta 分布的关系具有完全相同的结构。把(**)式变形一下得到

Poisson(X≤k|λ)+∫λ0xke−xk!dx=1

我们可以看到,Poisson分布的概率累积函数和Gamma 分布的概率累积函数有互补的关系。

其实(*)和(**)这两个式子都是陈希儒院士的《概率论与数理统计》这本书第二章的课后习题,不过陈老师习题答案中给的证明思路是纯粹数学分析的证明方法,虽然能证明等式成立,但是看完证明后无法明白这两个等式是如何被发现的。上诉的论述过程说明,从二项分布出发,这两个等式都有可以很好的从概率角度进行理解。希望以上的推导过程能给大家带来一些对 Gamma 函数和 Gamma 分布的新的理解,让Gamma 分布不再神秘。

LDA-math-神奇的Gamma函数的更多相关文章

  1. gamma函数及相关其分布

    神奇的gamma函数(上) 神奇的gamma函数(下) gamma函数的定义及重要性质 \[\Gamma(x)=\int_0^{\infty}t^{x-1}e^{-t}dt\] \[\Gamma(x+ ...

  2. Gamma函数深入理解

    Gamma函数 当n为正整数时,n的阶乘定义如下:n! = n * (n - 1) * (n - 2) * … * 2 * 1. 当n不是整数时,n!为多少?我们先给出答案. 容易证明,Γ(x + 1 ...

  3. Gamma函数是如何被发现的?

    学过微积分的人,肯定都接触过Euler积分,按教科书上的说法,这是两种含有参变量的定积分,但其实没那么玄乎,它们只是两个函数.其中第一型Euler积分叫\(B\)-函数,第二型Euler积分叫\(\G ...

  4. PHP 神奇的sprintf函数

    sprintf 1.定义 sprintf() 函数将字符串进行各种类型的格式化. 2.语法 sprintf(format,arg1,arg2,arg++) format:格式类型. arg1,arg2 ...

  5. ECNUOJ 2613 Gamma 函数

    Gamma 函数 Time Limit:1000MS Memory Limit:65536KBTotal Submit:237 Accepted:138 Description  Pollux最近在复 ...

  6. 数据库->神奇的concat_ws函数

    神奇的concat_ws函数 了解到concat_ws函数起因是因为:朋友给我发了一份面试题,其中有一句看似很简单的查询,但是我就是没做出来.如下图:   经查阅资料了解通过两个字段拼接并且用“_”进 ...

  7. Java中math类的常用函数

    Java中math类的常用函数 在 Java 中 Math 类封装了常用的数学运算,提供了基本的数学操作,如指数.对数.平方根和三角函数等 只要在源文件的顶部加上下面这行代码就不必在数学方法名和常量名 ...

  8. LDA数学八卦笔记(一)Gamma函数

    Technorati Tags: LDA主题模型

  9. 神奇的sort()函数

    今天来谈一谈sort()函数,sort() 方法用于对数组的元素进行排序,用法为arrayObject.sort(sortby):括号中的为可选参数,准确来说应该是一个函数,这个函数用来规定排序方法, ...

随机推荐

  1. node.js创建服务器报错

    创建nodeTest.js如下: var http = require('http'); http.createServer(function (request, response){ respons ...

  2. 转:自定义ASP.NET MVC Html辅助方法

    在ASP.NET MVC中,Html辅助方法给我们程序员带来很多方便,其重要性也就不言自明.有时候,我们不想重复地写一些HTML代码,或者MS没有提供我们想要的那个HTML标签的Html辅助方法,那么 ...

  3. 如何使用批处理解决批量telnet命令的输入

    用telnet命令做不了自动,因为如果成功telnet了,telnet就控制输入了.其实,不用那么麻烦,您下载一个微软官方的扫描器叫portqry,用一句for读取您文件里的ip和port,执行就行了 ...

  4. UITabBar 设置字体的颜色(选中状态/正常状态)setTitleTextAttributes

    UITabbar有个setTintColor这个方法,可以理解为,高亮的时候,或者点击后的颜色设置. UITabBarItem有个setTitleTextAttributes的方法,是用来设置字体的颜 ...

  5. 配置Tomcat6的管理用户

    在Tomcat上发布war之前需要配置一个管理用户以进入上传页面,而配置就是通过修改/usr/local/tomcat6/conf/tomcat-users.xml这个文件进行的.下面是修改后的文字: ...

  6. LeetCode Closest Binary Search Tree Value II

    原题链接在这里:https://leetcode.com/problems/closest-binary-search-tree-value-ii/ 题目: Given a non-empty bin ...

  7. ELK-Python(一)

    不具有通用性,留作纪念. [root@GXB-CTRLCENTER python]# cat insert_active_user.py #!/usr/bin/env python # -*- cod ...

  8. form和validate示例

    //验证from表单 $(function () { $("#addUserForm").validate({ rules: { txtName: { required: true ...

  9. [GeoServer]重拾GeoServer之安装篇

    GeoServer的项目是一个完整的Java(J2EE)系统,现实了OpenGIS联盟的网络功能服务器规范和网络覆盖服务器规范,并且集成了Web地图服务器. 在大三的时候WebGIS课程中老师讲解过一 ...

  10. Unable to instantiate Action...............

    当时找了好久都没搞明白,出现这样的问题,可能不是代码错了.将新添加的action不要添加在末尾,这样可能导致这样的问题出现,所以新添加的action最好放置在struts配置文件中间.