作为Python的相对入门者,我正在努力理解(并使用)scipy.optimize中的“ curve_fit”
我已经尝试过回答以下先前的问题:python numpy/scipy curve fitting和exponential curve fitting with python,但不幸的是,运气不好。
这是一个工程问题(要处理来自测试台的测量数据),因此我知道公式的格式为Y =(X / A)+(X / B)^(1 / C),其中A, B,C是需要找到的常数
[[当前代码]
import numpy as np
from scipy.optimize import curve_fit
valY_list = [yyy1,yyy2,yyy3,yyy4]
valX_list = [xxx1,xxx2,xxx3,xxx4]
val_Y = np.array(valY_list)
val_X = np.array(valX_list)
def fit_func(val_X,A,B,C):
return (val_X/A)+((val_X/B)^(1/C))
params = curve_fit(fit_func, val_X, val_Y)
[A,B,C] = params[0]
NB1:实际上valY_list和valX_list的长度大于500个条目(存储为浮点数。)
NB2:我也知道A,B,C的值应该在某个值的范围内,所以我想在执行优化时限制解决方案。
0.005 0.0 0.0001 我意识到我的代码可能很初级,可能遗漏了很多东西(或者对于经验丰富的编码员来说,显而易见的错误!),所以我深表歉意。任何帮助,将不胜感激!
您可能会发现lmfit(https://lmfit.github.io/lmfit-py)对于此问题和其他曲线拟合问题很有用。它提供了比curve_fit
更高的曲线拟合界面,并为模型构建以及使用参数和拟合统计量提供了许多方便和高级的选项。
使用lmfit,我建议采用以下方法:
import numpy as np
from scipy.optimize import curve_fit
from lmfit import Model
valY_list = [yyy1,yyy2,yyy3,yyy4]
valX_list = [xxx1,xxx2,xxx3,xxx4]
val_Y = np.array(valY_list)
val_X = np.array(valX_list)
def fit_func(x, a, b, c):
return (a*x)+(b*x)**c
mymodel = Model(fit_func)
params = mymodel.make_params(a=10, b=1, c=100.0)
params['a'].min = 2.0
params['a'].max = 200.
params['b'].min = 0.002
params['b'].max = 1.e8
params['c'].min = 10.0
params['c'].max = 10000.0
result = mymodel.fit(val_Y, params, x=val_X)
print(result.fit_report())
for par_name, param in result.params.items():
print(par_name, param.value, param.stderr)
请注意,我稍微更改了模型功能以使用1 / PARAM,并相应地调整了边界(我认为!)。打印的拟合报告将包括拟合统计信息以及每个变量的最佳拟合值和标准误差。另外,请注意,使用lmfit时,将根据拟合函数的参数名称来命名参数,而最小/最大范围将与Parameter对象一起使用。尽管上面的示例设置了边界,但是您也可以使用(例如)来修复任何参数:
params['c'].vary = False
并且,如果您确实想要A,B和C,则可以将它们作为约束表达式来设置参数:
params.add('A', expr='1/a')
params.add('B', expr='1/b')
params.add('C', expr='1/c')
这些拟合度不会改变,但是会报告其值和标准误差。本质上,可以使用任何有效的python表达式,以及其他参数名称和基本的数学函数。
[还有许多其他功能以及不错的文档和示例,但这应该可以帮助您入门。