【发布时间】:2018-09-02 19:01:50
【问题描述】:
我正在尝试用平滑函数(小于 5 个参数)例如 广义逻辑函数来近似经验累积分布函数 (ECDF I want to approximate)。
然而,使用scipy.optimize.curve_fit,拟合操作给出了非常糟糕的近似值,或者它根本不起作用(取决于初始值)。变量series 表示我的数据存储为pandas.Series。
from scipy.optimize import curve_fit
def fit_ecdf(x):
x = np.sort(x)
def result(v):
return np.searchsorted(x, v, side='right') / x.size
return result
ecdf = fit_ecdf(series)
def genlogistic(x, B, M, Q, v):
return 1 / (1 + Q * np.exp(-B * (x - M))) ** (1 / v)
params = curve_fit(genlogistic, xdata = series, ydata = ecdf(series), p0 = (0.1, 10.0, 0.1, 0.1))[0]
我应该使用其他类型的函数来进行拟合吗? 有没有代码错误?
更新 - 1
按照要求,我链接到一个包含 the data 的 csv。
更新 - 2
经过大量搜索和反复试验,我发现了这个功能
f(x; a, b, c) = 1 - 1 / (1 + (x / b) ** a) ** c
with a = 4.61320000, b = 2.94570952, c = 0.5886922
它比另一个更适合。唯一的问题是 ECDF 在x=1 附近显示的一小步。如何修改f 以提高合身质量?我正在考虑添加某种仅在这些点中“相关”的功能。这是拟合的图形结果,其中蓝色实线表示 ECDF,虚线表示(x, f(x)) 点。
【问题讨论】:
-
您能否提供一个简化的数据样本?(请参阅minimal reproducible example)以便测试适合它的解决方案
-
@xdze2 我更新了一个数据样本。 @mikuszefski 函数在
x=0的根不是绝对必要的。它可以返回一个小的值,并且我假装较大的x函数转到1。 -
@JamesPhillips 该功能似乎还可以,但显然不能很好地拟合数据。我正在尝试用另一个效果更好的函数来近似 ECDF。但是我想改善
x=1附近的贴合度。 -
我添加了图形结果和函数的参数。抱歉,一开始我忘记添加了。
-
由于某些点的重复值比其他点多,您实际上将加权对这些数据点的拟合。我建议进行一个测试,对重复点的值进行平均并分析这些回归结果,看看数据的隐式加权是否有任何不同。
标签: python scipy curve-fitting