使用Python单调减少曲线拟合

Nit*_*tin 5 python numpy scipy

我有一组数据点,如图所示。 在此处输入图片说明

我需要将曲线拟合到这些点,以使曲线单调递减。曲线没有指定的功能形式。我第一次尝试曲线拟合,总的来说,我想知道如何继续进行某些功能的选择,拟合和比较拟合以选择最佳功能。

我认为对于单调递减的曲线,约束条件是一阶导数为负。我正在查看scipy.curve_fit和scipy.interpolate.UnivariateSpline函数,但是它们似乎没有约束拟合的选项。在这种情况下使用的最佳功能是什么?谢谢。

Mar*_*tin 2

恐怕没有通用功能适配的包。您必须选择并定义您的功能空间。当你这样做时,它肯定是有限的,并且向系数添加约束以确保你的函数递减是没有问题的。

此外,您必须选择度量/目标函数。您想最小化 SSE 还是您的观点有一定的权重?或者也许是一个完全不同的目标?

你可以从这样的事情开始:

import numpy as np
impoty scipy.optimize as opt

def objective(pars):
    a, b, c = pars
    return np.sum((y-(a*np.exp(-b*x)+c))**2)

opt.minimize(objective, x0=np.array([12000, 0.3, 2000])) 
Run Code Online (Sandbox Code Playgroud)