繁体   English   中英

使用scipy curve_fit时,是否可以在范围/相关函数上强制执行边界?

[英]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)

这导致如下图 - 绘制曲线

但是,系统有一些约束条件,范围应该固定在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解决方案在所需范围内。

在此输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM