使指数CDF适合数据python?

时间:2019-02-24 02:58:23

标签: python scipy distribution data-fitting

我正在尝试将指数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 :(得分:0)

您可以定义通用的exp函数,并使用scipy.optimize中的curve_fit:

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。