#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. Но если у вас единственная проблема с нарезкой, вы выполняете нарезку для подгонки и пересчитываете выходные данные с параметрами наилучшего соответствия для печати без нарезки. Или я что-то упускаю?