scipy минимизировать TypeError: неподдерживаемые типы операндов для -: 'tuple' и 'tuple' - PullRequest
1 голос
/ 24 марта 2020

Я немного играю с некоторыми моделями SIR и пытаюсь свести к минимуму функцию с помощью scipy.

def SIR_Model(parametros, valores_iniciais, valores_reais):

    Dias = len(valores_reais)-1
    Dia=[0]

    N=valores_iniciais[0]

    S=[]
    E=[]
    A=[]
    I=[]
    H=[]
    R=[]

    S.append(valores_iniciais[1])
    E.append(valores_iniciais[2])
    A.append(valores_iniciais[3])
    I.append(valores_iniciais[4])
    H.append(valores_iniciais[5])
    R.append(valores_iniciais[6])


    sigma=valores_iniciais[7]
    lambda_model=valores_iniciais[8]
    k1=valores_iniciais[9]
    k2=valores_iniciais[10]
    delta=valores_iniciais[11]

    beta1=parametros[0]
    beta2=parametros[1]
    beta3=parametros[2]
    gamma=parametros[3]

    for i in range(0,Dias):
        Dia.append(i+1)
        S.append(S[i]*(1-beta1*A[i]/N-beta2*I[i]/N-beta3*H[i]/N))
        E.append(E[i]*(1-sigma)+S[i]/N*(beta1*A[i]+beta2*I[i]+beta3*H[i]))
        A.append(A[i]*(1-k1)+(1-gamma)*sigma*E[i])
        I.append(sigma*gamma*E[i]-lambda_model*I[i])
        H.append(H[i]*(1-k2-delta)+lambda_model*I[i])
        R.append(R[i]+k1*A[i]+(k2+delta)*H[i])

    df_model=pd.DataFrame(np.column_stack([S, E, A, I, H, R, Dia, valores_reais]), columns=['Susceptible','Exposed','Asymptomatic','Infected','Hospitalized','Removed','Dia', 'Infected Portugal'])

    RMSE = ((df_model["Infected"] - df_model["Infected Portugal"]) ** 2).mean() ** .5
    R_0 = ((1-gamma)*beta1*S[0])/(k1*N) + (gamma*beta2*S[0])/(lambda_model*N) + (gamma*beta3*S[0])/((k2+delta)*N)

    return RMSE, df_model, R_0

При вызове функции с некоторыми значениями она работает нормально, например, RMSE_Model, df_Model, R_0_Model = SIR_Model(parametros_x0, valores_inicio, infected_portugal)

Когда я пытаюсь минимизировать, я получаю ошибку: TypeError: неподдерживаемый тип (типы) операндов для -: 'tuple' и 'tuple'

from scipy.optimize import minimize
res = minimize(SIR_Model,x0=parametros, args=(valores_inicio, infected_portugal))

Можете ли вы помочь, пожалуйста? Спасибо

1 Ответ

0 голосов
/ 25 марта 2020

Функция SIR_model возвращает кортеж, но scipy.optimize.minimize ожидает, что функция вернет скаляр.

Описание в документах говорит:

Минимизация скалярной функции одной или нескольких переменных.

Функция, которая возвращает кортеж, вероятно, может работать при условии, что кортежи можно упорядочить с помощью сравнения. В вашем случае кортеж содержит объекты, которые нельзя упорядочить.

Возможно, вы захотите обернуть функцию SIR_Model, чтобы она возвращала скаляр и применила функцию минимизации к оболочке.

def wrapper(parametros, valores_iniciais, valores_reais):
    res = SIR_Model(parametros, valores_iniciais, valores_reais)
    return res[0]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...