适合单调曲线(最好是在python中)

use*_*639 5 python optimization curve-fitting

我试图将单调曲线拟合到一些近乎单调的数据上.(X值是单调的,Y值应该是单调的,但噪声通常大于点到点的基础值的变化.)这里是我现在正在做的总结:

def goodness_of_fit(Xfit):
    assert(is_sorted(Xfit))
    # ( Calculate the area between the fit line and the join-the-dots line from the data )

scipy.optimize.minimize(goodness_of_fit, x0=numpy.linspace(xmin, xmax))
Run Code Online (Sandbox Code Playgroud)

我找不到一种方法来获得优化算法来保持Xfit数组排序 - 有没有人有任何建议?(数组的大小太大,无法创建N-1个别排序约束并使用约束优化函数.)如果最佳解决方案仅适用于Python,我愿意使用Python之外的其他语言.那种语言.

(注意,我确实拟合了X值,而不是Y值 - 这是因为我最终想要绘制dX/dY曲线,并且如果我从原始数据中绘制它,它就不会爆炸到荒谬的值.但是,如果将Y值拟合到固定的X值上要容易得多,我可以这样做.)

BKa*_*Kay 2

如何从 Xfit 创建一个严格单调子集的新数组,然后对其进行曲线拟合?就像是:

Xfit      = np.hstack(((-1,-1,0,1,1),np.arange(1,10),(-7,9,10,10)))
len_mono  = 0
Xfit_mono = zeros(Xfit.size)
Xfit_mono_ind = zeros(Xfit.size)
Xfit_mono[len_mono] = Xfit[0]

for(iX, x) in enumerate(Xfit):
    if iX > 0:
        if x > Xfit_mono[len_mono]:
            len_mono = len_mono + 1
            Xfit_mono[len_mono] = x
            Xfit_mono_ind[len_mono] = iX 
Xfit_mono_ind = Xfit_mono_ind[:len_mono+1]
Xfit_mono = Xfit_mono[:len_mono+1]
print(Xfit_mono_ind)
print(Xfit_mono)
Run Code Online (Sandbox Code Playgroud)

然后,您可以在曲线拟合中使用 Xfit_mono,并且当您想要选择关联的 y 值时,可以使用 Xfit_mono_ind 的值作为 y 的索引。

更新替换:

if x > Xfit[iX-1]:
Run Code Online (Sandbox Code Playgroud)

和:

if x > Xfit_mono[len_mono]:
Run Code Online (Sandbox Code Playgroud)

对于弱增加,旧的解决方案有效。然而,如果它不断减少,旧的结果就会给出错误的答案。此更新在两种情况下都提供了所需的结果。