SciPy least_squares 的相对平方误差和

Relative sum of squared error with SciPy least_squares

我对模型拟合比较陌生 SciPy;提前为任何无知道歉。

我正在尝试使用 scipy.optimize least_squares 来拟合非线性模型。

函数如下:

def growthfunction(theta, t):
    return (theta[0]*np.exp(-np.exp(-theta[1]*(t-theta[2]))))

和一些数据

t = [1, 2, 3, 4] 观察到 = [3, 10, 14, 17]

我先定义模型

def fun(theta):
    return (myfunction(theta, ts) - observed)

Select下面要优化的一些随​​机启动参数:

theta0 = [1, 1, 1]

然后我利用leas_squares优化

res1 = least_squares(fun, theta0)

这很好用,除了 least_squares 在这里优化了绝对误差。我的数据随时间变化,这意味着时间点 1 处的误差 5 按比例大于时间点 100 处的误差 5。我想更改此设置以便优化相对误差。

我尝试手动进行,但是如果我像这样除以 fun(theta) 中的预测值:

def fun(theta):
    return (myfunction(theta, ts) - observed)/myfunction(theta, ts)

least_squares显示参数过多无法优化的错误

没有 minimal reproducible example 很难帮到你,但你可以尝试更传统的相对最小二乘法,即

def fun(theta):
    return (myfunction(theta, ts) - observed)/observed

或者,也许,为了防止 small/zero 值,

def fun(theta):
    cutoff = 1e-4
    return (myfunction(theta, ts) - observed)/np.maximum(np.abs(observed),cutoff)

这是通过计算相对误差来工作的:

from scipy.optimize import least_squares
import numpy as np

def growthfunction(theta, t):
    return (theta[0]*np.exp(-np.exp(-theta[1]*(t-theta[2]))))

t = [1, 2, 3, 4]
observed = [3, 10, 14, 17]

def fun(theta):
    return (growthfunction(theta, t) - observed)/growthfunction(theta, t)

theta0 = [1,1,1]

res1 = least_squares(fun, theta0)
print(res1)

输出:

>>>  active_mask: array([0., 0., 0.])
        cost: 0.0011991963091748607
         fun: array([ 0.00255037, -0.0175105 ,  0.0397808 , -0.02242228])
        grad: array([ 3.15774533e-13, -2.50283465e-08, -1.46139239e-08])
         jac: array([[ 0.05617851, -0.92486809, -1.94678829],
       [ 0.05730839,  0.28751647, -0.6615416 ],
       [ 0.05408162,  0.27956135, -0.20795969],
       [ 0.05758503,  0.166258  , -0.07376148]])
     message: '`ftol` termination condition is satisfied.'
        nfev: 10
        njev: 10
  optimality: 2.5028346541978996e-08
      status: 2
     success: True
           x: array([17.7550016 ,  1.09927597,  1.52223722])