将指数 cdf 拟合到数据 python?

fit exponential cdf to data python?

我正在尝试将指数 CDF 拟合到我的数据中以查看它是否是一个好的 fit/develop 拟合方程,但我不确定如何拟合,因为我认为 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?或者如何找到最适合数据的分布?

你可以定义一个通用的exp函数,然后使用curve_fit from 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。