使用scipy.optimise curve_fit

时间:2018-05-25 10:48:22

标签: optimization scipy curve-fitting

作为Python的相对初学者,我很难理解(并因此使用)" curve_fit"来自scipy.optimise

我尝试过以前问题的答案: python numpy/scipy curve fittingexponential 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< A< 0.5

0.0< B< 5000

0.0001< C< 0.1

我意识到我的代码可能非常简陋,可能会丢失很多东西(或者对于经验丰富的编码人员来说显然是明显的错误!)所以我很抱歉。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:-1)

你可能会发现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表达式,都可以使用其他参数名称和基本数学函数。

还有更多功能和体面的文档和示例,但这应该可以帮助您入门。