Вы можете определить обычную функцию exp и использовать команду curve_fit из scipy.optimize:
import matplotlib.pyplot as plt
import numpy as np
from scipy.optimize import curve_fit
def exp_func(x, a, b, c):
return a * np.exp(-b * x) + c
eta = np.array([1,0.5,0.3,0.25,0.2])
cdf = np.array([1e-9,9.9981e-10,9.9504e-10,9.7905e-10,9.492e-10])
popt, pcov = curve_fit(exp_func, eta, cdf)
plt.plot(eta, cdf)
plt.plot(eta, exp_func(eta, *popt), 'r-', label='fit: a=%5.3f, b=%5.3f, c=%5.3f' % tuple(popt))
plt.legend()
plt.show()
И вы получите функцию exp, которая очень похожа на ваши значения:
Из установленных параметров видно, что функция y = np.exp (-19,213 * x).
* Обновление *
Если вы хотите убедиться, что это действительно функция CDF, вам нужно рассчитать pdf (взяв производную):
x = np.linspace(0, 1, 1000)
cdf_fit = exp_func(x, *popt)
cdf_diff = np.r_[cdf_fit[0], np.diff(cdf_fit)]
Вы можете проверить работоспособность:
plt.plot(x, np.cumsum(cdf_diff))
А затем используйте scipy для подгонки pdf к распределению экспонент:
from scipy.stats import expon
params = expon.fit(cdf_diff)
pdf_fit = expon.pdf(x, *params)
Я должен предупредить вас, что что-то не суммируется.pdf_fit не совпадает с cdf_diff.Может быть, ваш CDF не является реальной функцией распределения?Последнее значение CDF должно быть 1.