запутанная ошибка при использовании минимизации lmfit в 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, вход = минимизация (fith, params, args = (n1, n2, n, h)) Файл "E:\ softwares\python\lib\site-packages\scipy\optimize_minimize.py", строка 481, в минимизации return _minimize_bfgs(fun, x0, args, jac, callback, **options) Файл "E:\softwares\python\lib\ site-packages\scipy\optimize\optimize.py", строка 943, в _minimize_bfgs gfk = myfprime(x0) File "E:\softwares\python\lib\site-packages\scipy\optimize\optimize.py", строка 292 , в function_wrapper return function((wrapper_args + args)) File "E:\softwares\python\lib\site-packages\scipy\optimize\optimize.py", строка 703, в proc_fprime return _ приблизительно_fprime_helper(xk, f , epsilon, args=args) Файл "E:\softwares\python\lib\site-packages\scipy\optimize\optimize.py", строка 637, в _ приблизительно_fprime_helper f0 = f(((xk,) + args)) Файл "E:\softwares\python\lib\site-packages\scipy\optimize\optimize.py", строка 292, в возврате function_wrapper function(*(wrapper_args + args)) Файл "E:\new model\calculate_H_v2.py", строка 35, в пятой a1 = params['p1'] IndexError: только целые числа, срезы (:), многоточие (...), numpy.newaxis (None) и целые или логические массивы являются допустимыми индексами

#

Я не мог понять, почему я получил такую ​​​​ошибку после прочтения вопросов. Можете ли вы помочь мне?

Заранее спасибо.

Цзин


person jing li    schedule 15.04.2018    source источник


Ответы (1)


Я думаю, основная проблема в том, что вы используете scipy.optimize.minimize() вместо lmfit.minimize(). То есть вы import * из scipy.optimize, потом импортируете Minimizer из lmfit.

То есть с помощью 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.

person M Newville    schedule 15.04.2018
comment
Большое спасибо за ваш совет! Это работает очень хорошо. - person jing li; 18.04.2018