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