使用curve_fit拟合第二种Logistic函数时系数求解异常的原因排查
问题原因分析
1. 参数冗余导致模型不可识别
你的logistic_2函数可以化简:
def logistic_2(t, beta_0, beta_1, beta_2, t_0): # 指数部分合并:-beta_2*t + beta_2*t_0 = beta_2*(t_0 - t) return beta_0 / (1 + beta_1 * np.exp(beta_2*(t_0 - t)))
进一步拆分指数项:np.exp(beta_2*(t_0 - t)) = np.exp(beta_2*t_0) * np.exp(-beta_2*t),代入后函数变为:beta_0 / (1 + (beta_1 * np.exp(beta_2*t_0)) * np.exp(-beta_2*t))
这和logistic_1的形式完全一致——logistic_1中的beta_1等价于logistic_2中beta_1 * np.exp(beta_2*t_0)的乘积。也就是说,logistic_2的beta_1和t_0参数是冗余的,无法通过数据唯一确定这两个参数的值,优化器在求解时会陷入参数空间的平坦区域,最终得到无意义的解(比如beta_2趋近于0,函数退化为水平线)。
2. 未提供合理的初始参数
curve_fit默认所有参数的初始值为1,但Logistic模型对初始值非常敏感,尤其是多参数的情况:
beta_0是函数的渐近最大值,你的数据最终趋近于2562,初始值应接近这个数值;beta_2是增长率,从数据增长速度看,初始值应设为1左右;t_0是增长拐点对应的t值,数据在2-3之间增长最快,初始值可设为2.5。
默认初始值和真实值偏差过大,加上参数冗余,会导致优化器收敛到错误的局部最优解。
解决办法
方法一:移除冗余参数,使用等价的logistic_1模型
既然logistic_2和logistic_1本质是同一个模型,直接使用logistic_1即可,它的参数更少,更容易拟合。
方法二:如果必须保留logistic_2形式,指定合理初始参数
给curve_fit传入p0参数设置初始值:
# 基于数据特征设置初始参数:beta0≈2600, beta1≈1, beta2≈1, t0≈2.5 p0 = [2600, 1, 1, 2.5] args1, _ = curve_fit(logistic_2, t, y, method='trf', p0=p0)
这样优化器能从更接近真实解的起点开始搜索,避免收敛到错误解。
另外,关于“无法估计参数协方差”的警告,本质也是因为参数冗余,导致优化后的Hessian矩阵奇异,无法计算协方差矩阵。
内容的提问来源于stack exchange,提问作者Yur1709
相关产品推荐
相关产品推荐

