Python 使用scipy曲线拟合时,是否可以强制范围/相关函数的边界?
我有一个对数函数适合一组点Python 使用scipy曲线拟合时,是否可以强制范围/相关函数的边界?,python,scipy,curve-fitting,Python,Scipy,Curve Fitting,我有一个对数函数适合一组点 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…其他点…42000])和y=np.array([0…其他点…100]),但显然曲线不一定固定这些值 我已经读到我可以给参数添加边界(所以这里是a和b),但有
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…其他点…42000])
和y=np.array([0…其他点…100])
,但显然曲线不一定固定这些值
我已经读到我可以给参数添加边界(所以这里是
a
和b
),但有没有一种方法可以通过特别强制曲线通过两个端点来约束输出。或者,我是否必须对函数引入某种极端惩罚,以生成将强制结果介于0和100之间的参数?您可以将曲线拟合问题表述为约束优化问题问题并使用scipy.optimize.minimize
来解决它。考虑到最优a
应为正的数据集,因此对拟合函数范围的要求相当于约束a*np.log(3200)+b>=0
和a*np.log(42000)+b您可以将曲线拟合问题表述为一个约束优化问题,并使用scipy.optimize.minimize
来解决它。考虑到最优a
应为正值的数据集,因此对拟合函数范围的要求相当于约束a*np.log(3200)+b> =0和a*np.log(42000)+b
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