如何通俗的理解伽马(gamma)函数

如何通俗的理解伽马(gamma)函数

如何通俗的理解伽马(gamma)函数 - 直觉,求导和示例

我为什么要在乎garmma分布?

使用伽马函数定义了许多概率分布,例如伽马分布,Beta分布,狄利克雷分布,卡方分布和学生t分布等。 对于数据科学家,机器学习工程师,研究人员来说,伽马函数可能是一种最广泛使用的函数,因为它已在许多分布中使用。然后将这些分布用于贝叶斯推理,随机过程(例如排队模型),生成统计模型(例如潜在狄利克雷分配)和变分推理。因此,如果您很好地了解了Garmma函数,您将对其中出现的许多应用程序有更好的了解!

1.为什么需要伽玛函数?

因为我们要泛化阶乘!



阶乘函数仅针对离散点(对于正整数-上图中的黑点)定义,但是我们希望连接黑点。我们想将阶乘函数扩展到所有复数。阶乘的简单公式x!= 1 * 2 x,不能直接用于小数值,因为它仅在x是整数时才有效。 因此,数学家一直在寻找...

“什么样的function将这些点平滑地连接起来,并为我们提供所有实际值的阶乘?”

但是,他们找不到可以表示x的和,乘积,幂,指数或对数的* 有限*组合!直到…的实数.

2.欧拉发现了伽玛函数。(在18世纪)



上面的公式用于找到z的任何实数值的Gamma函数的值。 假设您要计算Γ(4.8)。您将如何解决上述整合? 可以手动计算Γ(4.8)吗?也许使用零件积分?

试试看,让我知道您是否找到有趣的方式!对于我(以及到目前为止的许多其他人)而言,没有快速简便的方法手动评估分数的Gamma函数。(如果您有兴趣用手解决它,这是一个很好的起点。) 好吧,那么就不用分析了。您能否实现从0到无穷大的积分-以编程方式添加术语“无限次”?

您可以通过几种方法来实现。最常用的两种实现是斯特林近似 和Lanczos近似。

[For implementation addicts:] For implementation addicts: the codes of Gamma function (mostly Lanczos approximation) in 60+ different language - C, C++, C#, python, java, etc.

让我们计算Γ(4.8)使用计算机在已经实现的。

我们得到了17.837。 正如我们所期望的,17.837介于3!(=Γ(4)= 6)和4!(=Γ(5)= 24)之间。 (当z是自然数时,Γ(z)=(z-1)!我们将很快证明这一点。) 与只需要正整数的阶乘不同,我们可以将任何实数/复数输入z,包括负数。Gamma函数连接黑点,并很好地绘制曲线。

Confusion-buster: 我们正在积分从0到无穷大的x(NOT z)。 • x是正在集成的辅助变量。 • 我们没有将4.8插入x。我们将4.8插入z。

3. Gamma函数如何对阶乘函数进行插值?


如果看一下Gamma函数,您会注意到两件事。 首先,相对于z,它绝对是一个递增函数。 其次,当z是自然数时,Γ(z + 1)= z! (我保证我们会尽快证明这一点!) 因此,我们可以期望Gamma函数连接阶乘。


Gamma函数如何以当前项x ^ z和e ^ -x结束? 我不确切知道欧拉的思维过程是什么,但是他是发现自然数e的那个人,因此他必须做很多实验,将e与其他函数相乘才能找到当前形式。

4. Gamma函数的图形是什么样的?



当x变为无穷大∞时,第一项(x ^ z)也变为无穷大∞,但是第二项(e ^ -x)变为零。

然后,伽玛函数会收敛到有限值吗?

我们可以使用L'Hôpital规则严格证明它收敛。但是我们也可以毫不费力地看到它的融合。如果您考虑一下,我们正在积分x ^ z(一个多项式递增函数) 和e ^ -x(一个 指数递减函数)的乘积。因为e ^ -x的值 下降快于x ^ z的值,所以Gamma函数很可能收敛并具有有限的值。 让我们绘制每个图形,因为眼见为实。





x ^ z * e ^ -x的图 让我们看一下Γ(4.8)的情况。



图下绿色阴影区域从0到无穷大,Γ(4.8)= 3.8! Python代码用于生成上面的漂亮图。自己绘制,看看z如何改变Gamma函数的形状!

########################
# f(x) = exp(-x) graph #
########################
import matplotlib.pyplot as plt
import numpy as np
# Create x and y
x = np.linspace(-2, 20, 100)
y = np.exp(-x)
# Create the plot
fig, ax = plt.subplots()
plt.plot(x, y, label='f(x) = exp(-x)', linewidth=3, color='palegreen')
# Make the x=0, y=0 thicker
ax.set_aspect('equal')
ax.grid(True, which='both')
ax.axhline(y=0, color='k')
ax.axvline(x=0, color='k')
# Add a title
plt.title('f(x) = exp(-x)', fontsize=20)
# Add X and y Label
plt.xlabel('x', fontsize=16)
plt.ylabel('f(x)', fontsize=16)
# Add a grid
plt.grid(alpha=.4, linestyle='--')
# Show the plot
plt.show()
####################
# f(x) = x^z graph #
####################
import matplotlib.pyplot as plt
import numpy as np
# Create x and y
x = np.linspace(0, 2, 100)
y1 = x**1.3
y2 = x**2.5 
y3 = x**3.8
# Create the plot
fig, ax = plt.subplots()
plt.plot(x, y1, label='f(x) = x^1.3', linewidth=3, color='palegreen')
plt.plot(x, y2, label='f(x) = x^2.5', linewidth=3, color='yellowgreen')
plt.plot(x, y3, label='f(x) = x^3.8', linewidth=3, color='olivedrab')
# Make the x=0, y=0 thicker
ax.set_aspect('equal')
ax.grid(True, which='both')
ax.axhline(y=0, color='k')
ax.axvline(x=0, color='k')
# Add a title
plt.title('f(x) = x^z', fontsize=20)
# Add X and y Label
plt.xlabel('x', fontsize=16)
plt.ylabel('f(x)', fontsize=16)
# Add a grid
plt.grid(alpha=.4, linestyle='--')
# Add a Legend
plt.legend(bbox_to_anchor=(1, 1), loc='best', borderaxespad=1, fontsize=12)
# Show the plot
plt.show()
###############################
# f(x) = x^(3.8)*e^(-x) graph #
###############################
import matplotlib.pyplot as plt
import numpy as np
# Create x and y
x = np.linspace(0, 20, 100)
y = x**3.8 * np.exp(-x)
# Create the plot
fig, ax = plt.subplots()
plt.plot(x, y, label='f(x) = x^(3.8) * np.exp(-x)', linewidth=3, color='palegreen')
ax.fill_between(x, 0, y, color='yellowgreen')
# Make the x=0, y=0 thicker
ax.set_aspect('equal')
ax.grid(True, which='both')
ax.axhline(y=0, color='k')
ax.axvline(x=0, color='k')
# Add a title
plt.title('f(x) =  x^(3.8)*e^(-x) ', fontsize=20)
# Add X and y Label
plt.xlabel('x', fontsize=16)
plt.ylabel('f(x)' ,fontsize=16)