我正在尝试将指数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拟合到数据中?还是如何找到最适合数据的分布?
答案 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()
从拟合的参数中,您可以看到函数为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。