使用Scipy curve_fit拟合双曲正切函数仅返回两个值的问题排查
问题解决:Scipy curve_fit 返回值处理错误
你的核心问题不是自定义tanh函数的问题,而是完全误解了curve_fit的返回结构:
curve_fit返回的是一个包含两个元素的元组:
- 第一个元素
popt:形状为(N,)的数组,N是你拟合函数的参数个数(这里是4个),也就是你需要的A、B、C、To的拟合值 - 第二个元素
pcov:形状为(N,N)的协方差矩阵,用于评估拟合参数的不确定性
你之前的所有错误都是直接把整个元组当成参数数组来拆分或索引,导致取到的是协方差矩阵或者错误的元素。
正确代码写法
基础版本(无初始猜测)
import numpy as np from scipy.optimize import curve_fit def tanh(x, A, B, C, To): y = ((A+B)/2) + ((A-B)/2)*np.tanh((x - To)/C) return y # 执行拟合,拆分返回值 popt, pcov = curve_fit(tanh, df5.iloc[:,0], df5.iloc[:,1]) # 从popt中提取四个参数 Afit, Bfit, Cfit, Tofit = popt
带初始猜测的版本
import numpy as np from scipy.optimize import curve_fit def tanh(x, A, B, C, To): y = ((A+B)/2) + ((A-B)/2)*np.tanh((x - To)/C) return y # 初始猜测值(根据你的数据范围合理设置) initialguess = [intA, intB, intC, intTo] # 拆分返回值 popt, pcov = curve_fit(tanh, df5.iloc[:,0], df5.iloc[:,1], p0=initialguess) Afit, Bfit, Cfit, Tofit = popt
额外说明
- 你的自定义tanh函数形式完全正确,这是用于拟合S型曲线的标准带参数tanh表达式,无需修改。
- 如果拟合仍然失败(比如popt值不合理),需要确保
initialguess的数值接近真实参数范围,tanh拟合对初始值比较敏感,尤其是C(斜率相关参数)和To(拐点位置)。 - 可以通过打印
popt和pcov来验证拟合结果:print("拟合参数:", popt),协方差矩阵对角线元素的平方根是参数的标准差。
内容的提问来源于stack exchange,提问作者Caleb Minasian
相关产品推荐
相关产品推荐

