приспособить экспоненциальный cdf к данным python? - PullRequest
0 голосов
/ 24 февраля 2019

Я пытаюсь вписать экспоненциальный CDF в мои данные, чтобы посмотреть, подходит ли он для этого, или разработать уравнение из подбора, но я не уверен, как, так как я думаю, что scipy.stats подходит для PDF, а не для CDF.Если у меня есть данные ниже:

eta = [1,0.5,0.3,0.25,0.2];
q = [1e-9,9.9981e-10,9.9504e-10,9.7905e-10,9.492e-10];

Как мне вписать экспоненциальный CDF в данные?Или как найти распределение, которое лучше всего подходит для данных?

1 Ответ

0 голосов
/ 24 февраля 2019

Вы можете определить обычную функцию 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, которая очень похожа на ваши значения: enter image description here

Из установленных параметров видно, что функция 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.

...