在 python 中使用 lmfit 的最小化时出现令人困惑的错误
confusing error when using minimize of lmfit in python
我的代码如下:
import numpy as np
from math import *
from scipy.optimize import *
import scipy.optimize as opt
from lmfit import Minimizer, Parameters, report_fit
import lmfit as lf
f = open('data.txt','r')
lines=f.readlines()
n1=[]
n2=[]
n=[]
h=[]
for x in lines:
x=x.strip() # remove \n before splitting the line
n1.append(x.split('\t')[0])
n2.append(x.split('\t')[1])
n.append(x.split('\t')[2])
h.append(x.split('\t')[3])
f.close()
n1 = [float(i) for i in n1]
n2 = [float(i) for i in n2]
n = [float(i) for i in n]
h = [float(i) for i in h]
# convert a list into an array
n1 = np.array(n1)
n2 = np.array(n2)
n = np.array(n)
h = np.array(h)
def fith(params,n1,n2,n,h):
a1 = params['p1']
b1 = params['p2']
a2 = params['p3']
b2 = params['p4']
model = (a1 + b1*n) * n1 + (a2 + b2*n) * n2
return model - h
params = Parameters()
params.add('p1',value=1.0)
params.add('p2',value=1.0)
params.add('p3',value=1.0)
params.add('p4',value=1.0)
out = minimize(fith,params,args=(n1,n2,n,h))
print(out)
在运行之后,我得到如下错误:
#
回溯(最近调用最后):
文件 "E:\new model\calculate_H_v2.py",第 50 行,位于
out = minimize(fith,params,args=(n1,n2,n,h))
文件 "E:\softwares\python\lib\site-packages\scipy\optimize_minimize.py",第 481 行,最小化
return _minimize_bfgs(乐趣,x0,args,jac,回调,**选项)
文件 "E:\softwares\python\lib\site-packages\scipy\optimize\optimize.py",第 943 行,在 _minimize_bfgs 中
gfk = myfprime(x0)
文件 "E:\softwares\python\lib\site-packages\scipy\optimize\optimize.py",第 292 行,在 function_wrapper 中
return 函数((wrapper_args + args))
文件 "E:\softwares\python\lib\site-packages\scipy\optimize\optimize.py",第 703 行,在 approx_fprime 中
return_approx_fprime_helper(xk, f, epsilon, args=args)
_approx_fprime_helper 中的文件 "E:\softwares\python\lib\site-packages\scipy\optimize\optimize.py",第 637 行
f0 = f(((xk,) + args))
文件 "E:\softwares\python\lib\site-packages\scipy\optimize\optimize.py",第 292 行,在 function_wrapper 中
return 函数(*(wrapper_args + args))
文件 "E:\new model\calculate_H_v2.py",第 35 行,在第五个
a1 = 参数['p1']
IndexError:只有整数、切片(:
)、省略号(...
)、numpy.newaxis(None
)和整数或布尔数组是有效的索引
#
看完题目后,我一直想不通为什么会出现这种错误。你能帮帮我吗?
提前致谢。
静
我认为基本问题是您使用的是 scipy.optimize.minimize()
而不是 lmfit.minimize()
。也就是说,您从 scipy.optimize
import *
,然后从 lmfit
.
导入 Minimizer
即使用from lmfit import minimize, Parameters, report_fit
,或使用
mini = Minimizer(fith,params,args=(n1,n2,n,h))
out = mini.minimize()
应该让你的脚本使用 lmfit.minimize()
,在我看来它应该可以工作。
这就是 import *
痛苦的原因:您很难分辨符号的来源。
作为旁注,您可以使用 numpy.loadtxt()
来简化将数据读取到 numpy 数组的过程。
我的代码如下:
import numpy as np
from math import *
from scipy.optimize import *
import scipy.optimize as opt
from lmfit import Minimizer, Parameters, report_fit
import lmfit as lf
f = open('data.txt','r')
lines=f.readlines()
n1=[]
n2=[]
n=[]
h=[]
for x in lines:
x=x.strip() # remove \n before splitting the line
n1.append(x.split('\t')[0])
n2.append(x.split('\t')[1])
n.append(x.split('\t')[2])
h.append(x.split('\t')[3])
f.close()
n1 = [float(i) for i in n1]
n2 = [float(i) for i in n2]
n = [float(i) for i in n]
h = [float(i) for i in h]
# convert a list into an array
n1 = np.array(n1)
n2 = np.array(n2)
n = np.array(n)
h = np.array(h)
def fith(params,n1,n2,n,h):
a1 = params['p1']
b1 = params['p2']
a2 = params['p3']
b2 = params['p4']
model = (a1 + b1*n) * n1 + (a2 + b2*n) * n2
return model - h
params = Parameters()
params.add('p1',value=1.0)
params.add('p2',value=1.0)
params.add('p3',value=1.0)
params.add('p4',value=1.0)
out = minimize(fith,params,args=(n1,n2,n,h))
print(out)
在运行之后,我得到如下错误:
#
回溯(最近调用最后):
文件 "E:\new model\calculate_H_v2.py",第 50 行,位于
out = minimize(fith,params,args=(n1,n2,n,h))
文件 "E:\softwares\python\lib\site-packages\scipy\optimize_minimize.py",第 481 行,最小化
return _minimize_bfgs(乐趣,x0,args,jac,回调,**选项)
文件 "E:\softwares\python\lib\site-packages\scipy\optimize\optimize.py",第 943 行,在 _minimize_bfgs 中
gfk = myfprime(x0)
文件 "E:\softwares\python\lib\site-packages\scipy\optimize\optimize.py",第 292 行,在 function_wrapper 中
return 函数((wrapper_args + args))
文件 "E:\softwares\python\lib\site-packages\scipy\optimize\optimize.py",第 703 行,在 approx_fprime 中
return_approx_fprime_helper(xk, f, epsilon, args=args)
_approx_fprime_helper 中的文件 "E:\softwares\python\lib\site-packages\scipy\optimize\optimize.py",第 637 行
f0 = f(((xk,) + args))
文件 "E:\softwares\python\lib\site-packages\scipy\optimize\optimize.py",第 292 行,在 function_wrapper 中
return 函数(*(wrapper_args + args))
文件 "E:\new model\calculate_H_v2.py",第 35 行,在第五个
a1 = 参数['p1']
IndexError:只有整数、切片(:
)、省略号(...
)、numpy.newaxis(None
)和整数或布尔数组是有效的索引
#
看完题目后,我一直想不通为什么会出现这种错误。你能帮帮我吗?
提前致谢。
静
我认为基本问题是您使用的是 scipy.optimize.minimize()
而不是 lmfit.minimize()
。也就是说,您从 scipy.optimize
import *
,然后从 lmfit
.
Minimizer
即使用from lmfit import minimize, Parameters, report_fit
,或使用
mini = Minimizer(fith,params,args=(n1,n2,n,h))
out = mini.minimize()
应该让你的脚本使用 lmfit.minimize()
,在我看来它应该可以工作。
这就是 import *
痛苦的原因:您很难分辨符号的来源。
作为旁注,您可以使用 numpy.loadtxt()
来简化将数据读取到 numpy 数组的过程。