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])
我对模型拟合比较陌生 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])