【发布时间】:2020-04-06 15:28:17
【问题描述】:
我有一个 PDF(代码如下),我正在尝试获取它的 cummulative distribution function (CDF)。我可以使用标准方法将 PDF 从 0.(它是允许的最小值)集成到增加 x 值。这按预期工作:
PDF 为红色,“逐步”CDF 为蓝色。但这给我留下了一张(x, y) 数据表,我想要描述这个CDF 的实际函数。所以我转而将 PDF 从 0. 到变量 y 进行积分以获得这个表达式。我这样做with WolframAlpha (WA) 我发现:
我使用upper incomplete gamma function 将此函数写入我的代码中,我得到了这个:
WA 集成 CDF 为橙色。我尝试了较低的不完全伽马函数,但结果更糟。
我很确定 WA CDF 的编写没有错误,所以我不确定我在这里做错了什么。
import numpy as np
from scipy.special import gamma, gammaincc
from scipy import integrate
import matplotlib.pyplot as plt
def main():
xx = np.linspace(0., 5., 100)
yy = PDF(xx)
plt.plot(xx, yy, c='r')
# Find stepwise CDF
cummul = []
for x in xx:
cummul.append([x, integrate.quad(PDF, 0., x)[0]])
plt.plot(*np.array(cummul).T)
# WolframAlpha's integral
y = CDF(xx)
plt.plot(xx, y)
def PDF(y):
a = (343. / 15.) * np.sqrt(7. / (2. * np.pi))
b, c = 5. / 2., -7. / 2.
return a * (y ** b) * np.exp(c * y)
def CDF(x):
"""
From WolframAlpha
"""
a = (343. / 15.) * np.sqrt(7. / (2. * np.pi))
b, c = 5. / 2., -7. / 2.
return a * (
x**b * (-c * x)**(-b) * (gammaincc(b + 1, -c * x) - b * gamma(b))) / c
if __name__ == '__main__':
main()
【问题讨论】: