适合指数cdf到数据python?

问题描述 投票:0回答:1

我试图将指数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适合数据?或者如何找到最适合数据的分布?

python scipy distribution data-fitting
1个回答
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。

© www.soinside.com 2019 - 2024. All rights reserved.