使用 scipy curve_fit 时是否可以在 range/dependent 函数上强制执行边界?

Is it possible to enforce bounds on the range/dependent function when using scipy curve_fit?

我有一个适合一组点的对数函数

def log_func(x, a, b):
    return a * np.log(x) + b
popt, pcov = curve_fit(log_func, x, yn)

这导致如下图 - Plotted Curve

但是,系统有限制,范围应固定在 0 到 100 之间。我已经专门在这些边界上传递了点(即 x = np.array([3200 ... other points ... 42000 ])y = np.array([0 ... other points ... 100 ] ) 但显然曲线没有必须修复这些值。

我读到我可以为参数添加边界(所以这里是 ab),但是有没有办法通过特别强制曲线通过两个端点来限制输出.或者,我是否必须对函数引入某种极端惩罚以导致参数强制结果介于 0 和 100 之间?

您可以将曲线拟合问题表述为约束优化问题,并使用 scipy.optimize.minimize 来求解。考虑到最优a应该为正的数据集,由此得出对拟合函数范围的要求等同于约束a*np.log(3200)+b>=0a*np.log(42000)+b<=100.

可以进行如下操作(我使用了一个简单的数据集)。

from scipy.optimize import minimize


x = np.array([3200, 14500, 42000])
yn = np.array([0, 78, 100])

def LS_obj(p):
    a, b = p
    return ((log_func(x, a, b) - yn)**2).sum()

cons = ({'type': 'ineq', 'fun': lambda p: p[0] * np.log(3200) + p[1]},
        {'type': 'ineq', 'fun': lambda p: 100 -p[0] * np.log(42000) - p[1]})

p0 = [10,-100] #initial estimate 
sol = minimize(LS_obj,p0 ,constraints=cons)
print(sol.x)  #optimal parameters

[ 36.1955 -285.316 ]

下图比较了curve_fitminimize方案。正如预期的那样,minimize 解决方案在要求的范围内。