【问题标题】:scipy minimize TypeError: unsupported operand type(s) for -: 'tuple' and 'tuple'scipy 最小化 TypeError: 不支持的操作数类型 -: 'tuple' 和 'tuple'
【发布时间】:2020-07-05 07:44:52
【问题描述】:

我正在使用一些 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))

你能帮忙吗? 谢谢

【问题讨论】:

    标签: python optimization scipy valueerror minimize


    【解决方案1】:

    函数 SIR_model 返回一个元组,但 scipy.optimize.minimize 期望函数返回一个标量。

    docs 中的描述说:

    最小化一个或多个变量的标量函数。

    返回元组的函数可能在元组可以通过比较排序的条件下工作。在您的情况下,元组包含无法排序的对象。

    您可能想要包装 SIR_Model 函数,使其返回一个标量并将最小化函数应用于包装器。

    def wrapper(parametros, valores_iniciais, valores_reais):
        res = SIR_Model(parametros, valores_iniciais, valores_reais)
        return res[0]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-13
      • 1970-01-01
      • 2013-06-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多