Как мне решить проблему Valuerror, возникающую при использовании функции optimize.curve_fit в моем коде?

#python-3.x #scipy #curve-fitting #data-modeling

#python-3.x #scipy #подгонка кривой #моделирование данных

Вопрос:

Что я здесь делаю не так? Я попытался проверить, одинаковы ли формы ydata и t, и они на самом деле одинаковы. Единственное, что работает, — это когда я срезаю выходные данные функции integrate.odeint, используя [:,1], чтобы получить соответствие кривой didt . Но дело в том, что мне нужны все три кривые, потому что я планирую отобразить все три результата. Я очень ценю вашу помощь.

 import pandas as pd 
import numpy as np
from datetime import datetime
from scipy import optimize 
from scipy import integrate
%matplotlib inline 
import matplotlib as mpl
import matplotlib.pyplot as plt
import seaborn as sns


N0=10203134 #susceptible population
ydata=np.array(df_plot.Jordan[253:]) #beginning on 1/10/2020
t=np.arange(len(ydata))
I0=ydata[0]  #initial conditions
R0=4821
S0=N0-I0-R0



def SIR_Model(SIR,t,beta,alpha):
    S,I,R=SIR
    dsdt=-beta*S*I/N0
    didt=beta*S*I/N0 -alpha*I
    drdt=alpha*I
    return dsdt,didt,drdt


def fit_ode(x,beta,alpha):
    return integrate.odeint(SIR_Model,(S0,I0,R0),t,args=(beta,alpha))

print(ydata.shape)
print(t.shape)

popt,pcov=optimize.curve_fit(fit_ode,t,ydata)
perr=np.sqrt(np.diag(pcov))
print("standard deviation errors:",str(perr))
print("Optimal Parameters: Beta=",popt[0], "alpha:",popt[1])

ValueError                                Traceback (most recent call last)
<ipython-input-194-aa1bb286dbba> in <module>
----> 1 popt,pcov=optimize.curve_fit(fit_ode,t,ydata)
      2 perr=np.sqrt(np.diag(pcov))
      3 print("standard deviation errors:",str(perr))
      4 print("Optimal Parameters: Beta=",popt[0], "alpha:",popt[1])
      5 

C:ProgramDataAnaconda3libsite-packagesscipyoptimizeminpack.py in curve_fit(f, xdata, ydata, p0, sigma, absolute_sigma, check_finite, bounds, method, jac, **kwargs)
    782         # Remove full_output from kwargs, otherwise we're passing it in twice.
    783         return_full = kwargs.pop('full_output', False)
--> 784         res = leastsq(func, p0, Dfun=jac, full_output=1, **kwargs)
    785         popt, pcov, infodict, errmsg, ier = res
    786         ysize = len(infodict['fvec'])

C:ProgramDataAnaconda3libsite-packagesscipyoptimizeminpack.py in leastsq(func, x0, args, Dfun, full_output, col_deriv, ftol, xtol, gtol, maxfev, epsfcn, factor, diag)
    408     if not isinstance(args, tuple):
    409         args = (args,)
--> 410     shape, dtype = _check_func('leastsq', 'func', func, x0, args, n)
    411     m = shape[0]
    412 

C:ProgramDataAnaconda3libsite-packagesscipyoptimizeminpack.py in _check_func(checker, argname, thefunc, x0, args, numinputs, output_shape)
     22 def _check_func(checker, argname, thefunc, x0, args, numinputs,
     23                 output_shape=None):
---> 24     res = atleast_1d(thefunc(*((x0[:numinputs],)   args)))
     25     if (output_shape is not None) and (shape(res) != output_shape):
     26         if (output_shape[0] != 1):

C:ProgramDataAnaconda3libsite-packagesscipyoptimizeminpack.py in func_wrapped(params)
    482     if transform is None:
    483         def func_wrapped(params):
--> 484             return func(xdata, *params) - ydata
    485     elif transform.ndim == 1:
    486         def func_wrapped(params):

ValueError: operands could not be broadcast together with shapes (138,3) (138,) 
 

Комментарии:

1. Должно ли это быть def fit_ode(t,beta,alpha): ?

2. @mikuszefski Я тоже это пробовал. Это все еще выдает мне ту же ошибку.

3. Не могли бы вы, пожалуйста, добавить операторы импорта, чтобы мы знали, что представляют собой переменные integrate и другие, предназначенные для представления?

4. @sanitizedUser Я только что добавил операторы импорта. Не все они используются в этой части кода. интеграция является частью библиотеки scipy.

5. Но если у вас единственная проблема с нарезкой, вы выполняете нарезку для подгонки и пересчитываете выходные данные с параметрами наилучшего соответствия для печати без нарезки. Или я что-то упускаю?