【问题标题】:Python: optimization solvers return initial guess for a nonlinear regression problemPython:优化求解器返回非线性回归问题的初始猜测
【发布时间】:2019-02-08 03:37:34
【问题描述】:

下面是用于 ODE 参数的最小二乘拟合的代码。 Python“最小化”以及“最小二乘”函数已被使用。已经尝试了不同的方法和 ODE 求解器/步骤(scipy ode/odeint)。这是一个在 MATLAB 中很容易解决的问题,但 Python 不断返回初始猜测。我希望你发现一个编码错误,否则我会对 Python 优化函数感到失望。 Obj 显示目标(残差平方和),ode 函数(一阶)显示具有未知参数的方程。附上数据集。

import numpy as np

from scipy.integrate import ode

from scipy.optimize import least_squares

from scipy.optimize import minimize

from scipy.optimize import SR1

import matplotlib.pyplot as plt

import math


Minput=np.loadtxt('C:\\Users\\Ladan\\Documents\\Python Scripts\\Python\\moisturesmoothopt.txt') 


Minput=Minput.flatten()

time=np.linspace(0,1800,901) 

A=np.zeros(3)

XC,RC,alpha=A

#bnds=([0,0,0],[Minput[0],math.inf,math.inf])

bnds=((0,Minput[0]),(0,math.inf),(0,math.inf))

def firstorder(X,time,A):


     if X>=XC:


        dX=-RC


     if X<XC:


        dX=-RC*(X/XC)**alpha

     return dX


def obj(A):


    X0=Minput[0]

   # Xpred=odeint(firstorder,X0,time,args=(A,))

    Xpred=ode(firstorder).set_integrator('vode', method='bdf', 
    order=15).set_initial_value(Minput[0],0).set_f_params(A)

    #Xpred=ode(firstorder).set_integrator('lsoda').set_initial_value(Minput[0],0).set_f_params(A)

    EPR=Xpred

    EPR2=EPR.y.flatten()

    ERRone=np.sum(np.power((EPR2-Minput),2))


    ERR=ERRone/((901-3))    # residual sum of squares deivided by dof


    return ERR


XC=1
RC=0.005
alpha=1.5

A0=[XC,RC,alpha]


Parameters=minimize(obj,A0,method='SLSQP',bounds=bnds,options={'ftol':1e-10, 
'maxiter': 1000}) 


print('parameters',Parameters)   

Minput 数组的数据在线共享:

https://1drv.ms/t/s!AoVu1vtlAOiLasJxR7rzubDr8YE

【问题讨论】:

    标签: python optimization minimize non-linear-regression


    【解决方案1】:

    虽然我在 scipy 中使用了较新的 ode 求解器,但我倾向于使用更好的 ol'odeint 函数,它有点旧,但仍然相当可靠,并且在许多情况下提供更好的性能,原因是我没有完全明白。无论如何,我在很大程度上重组了您的分析代码以同时使用scipy.optimize.least_squaresscipy.integrate.odeint。取得了进展,但我确实收到了关于权力中无效值的某种警告。您将不得不进一步调查,但这应该会让您走上正轨

    %matplotlib inline
    import matplotlib.pyplot as plt
    import numpy as np
    from scipy.integrate import odeint
    from scipy.optimize import least_squares
    
    Minput=np.loadtxt('Data.txt').T
    time=np.linspace(0,1800,901)
    bnds=([0,0,0],[Minput[0],np.inf,np.inf])
    
    
    def firstorder(X,time, XC, RC, alpha):
         if X >= XC:
            dX = -RC
         else:
            dX = -RC * (X/XC)**alpha
         return dX
    
    XC=1
    RC=0.005
    alpha=1.5
    A0=(XC, RC, alpha) 
    
    
    def residuals(x0):
        Mcalc = odeint(firstorder, y0=Minput[0], t=time, args=tuple(x0))[:,0]
        return Mcalc - Minput
    
    Mcalc = odeint(firstorder, y0=Minput[0], t=time, args=A0)[:,0]
    result = least_squares(residuals, x0=A0, bounds=bnds)
    print(result)
    Mfit = odeint(firstorder, y0=Minput[0], t=time, args=tuple(result.x))[:,0]
    
    plt.plot(time, Minput, label='data')
    plt.plot(time, Mcalc, label='initial values')
    plt.plot(time, Mfit, label='fit')
    plt.legend()
    

    打印出来:

        /---/python3.6/site-packages/ipykernel_launcher.py:20: RuntimeWarning: invalid value encountered in power
    
     active_mask: array([0, 0, 0])
            cost: 50.571520689865935
             fun: array([ 0.00000000e+00,  8.14148814e-03,  1.61829763e-02,  2.44244644e-02,
            ...])
            grad: array([-1.18907831,         nan, -7.75389712])
             jac: array([[ 0.        ,  0.        ,  0.        ],
           [ 0.        , -2.        ,  0.        ],
           [ 0.        , -3.99999994,  0.        ],
           ...,
           [ 0.07146036,         nan,  0.1084222 ],
           [ 0.07130456,         nan,  0.10827456],
           [ 0.07114924,         nan,  0.1081272 ]])
         message: '`xtol` termination condition is satisfied.'
            nfev: 30
            njev: 12
      optimality: nan
          status: 3
         success: True
               x: array([1.0000002 , 0.00717926, 1.50000032])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-16
      • 2020-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-08
      • 2019-10-09
      相关资源
      最近更新 更多