У меня есть PDF (код ниже), и я пытаюсь получить его кумулятивная функция распределения (CDF). Я могу использовать стандартный подход интеграции PDF с 0. (это минимально допустимое значение) для увеличения x
значений. Это работает, как и ожидалось:
, где PDF отображается красным, а "пошаговый" CDF синим. Но это оставляет меня с таблицей (x, y)
данных, и я хочу фактическую функцию , которая описывает этот CDF. Поэтому я перехожу к интеграции PDF от 0. до переменной y
, чтобы получить это выражение. Я делаю это с WolframAlpha (WA) и нахожу:
Я пишу эту функцию в свой код, используя верхняя неполная гамма-функция , и я получаю это:
, где 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()