【问题标题】:fit exponential cdf to data python?将指数 cdf 拟合到数据 python?
【发布时间】:2019-02-24 13:35:14
【问题描述】:

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

【问题讨论】:

  • 您接受的答案将您的 x 值解释为 y,将您的 y 值解释为 x。

标签: python scipy distribution data-fitting


【解决方案1】:

您可以定义一个通用的 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 函数:

从拟合参数可以看出函数为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。

【讨论】:

  • 谢谢!有没有办法测试它与其他分布的拟合度?还是我必须更改定义的函数并手动测试其他拟合?
  • 如果你认为它们是指数分布,我认为你可以将相同的 exp 函数 (exp_func) 与其他分布一起使用。
  • 由于我的数据可能不是 CDF 分布,有没有一种方法可以最适合误差最小的数据的任何分布?
  • 看看这个 StackOverflow 答案:stackoverflow.com/a/37616966/1060738
  • 只要函数的最后一个值设置为 1 并且单调递增 (en.wikipedia.org/wiki/…),它就是一个有效的 CDF。不需要采取任何衍生物。理想情况下,第一个值为 0,但这不是严格要求的。
猜你喜欢
  • 2014-07-16
  • 2016-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-15
  • 2016-08-22
  • 1970-01-01
相关资源
最近更新 更多