You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Scipy curve_fit拟合失败,报参数协方差无法估计错误

问题原因分析
  • 数值量级过大导致优化失效:当数据处于1E10级别时,线性拟合的损失函数计算会出现数值稳定性问题,优化器难以找到有效的参数更新方向,最终只能收敛到近似水平线的结果。
  • 协方差矩阵计算失败:大数值会让拟合过程中的矩阵运算出现奇异或数值溢出,无法正确估计参数的协方差,从而触发OptimizeWarning: Covariance of the parameters could not be estimated警告。
解决方法

方法1:数据标准化/归一化

将大尺度数据压缩到合理区间(如[-1,1]),消除量级差异带来的数值问题,拟合后再还原参数到原始尺度。示例代码:

import numpy as np
from scipy.optimize import curve_fit

# 假设原始数据为x_data、y_data(1E10级别)
# 计算均值和标准差用于标准化
x_mean, x_std = np.mean(x_data), np.std(x_data)
y_mean, y_std = np.mean(y_data), np.std(y_data)

# 标准化数据
x_scaled = (x_data - x_mean) / x_std
y_scaled = (y_data - y_mean) / y_std

# 定义线性模型
def linear_func(x, a, b):
    return a * x + b

# 拟合标准化后的数据
popt_scaled, _ = curve_fit(linear_func, x_scaled, y_scaled)

# 将拟合参数转换回原始数据尺度
a = popt_scaled[0] * (y_std / x_std)
b = popt_scaled[1] * y_std + y_mean - a * x_mean

# 生成原始数据的拟合曲线
y_fit = a * x_data + b

方法2:指定初始参数猜测

给curve_fit提供接近真实值的初始参数,帮助优化器快速找到收敛方向。示例代码:

# 根据数据趋势手动设置初始参数,比如斜率设为1,截距设为y的均值
p0 = [1, np.mean(y_data)]
popt, pcov = curve_fit(linear_func, x_data, y_data, p0=p0)

方法3:使用加权最小二乘法

通过权重降低大数值点对拟合的过度影响,提升拟合稳定性。示例代码:

# 以数据绝对值的倒数作为权重(可根据实际情况调整)
weights = 1 / np.abs(y_data)
popt, pcov = curve_fit(linear_func, x_data, y_data, sigma=weights)

内容的提问来源于stack exchange,提问作者Mark

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 19:01:17