为何scipy的weibull_min返回的拟合参数存在微小偏差?
Weibull分布拟合微小偏差的原因分析
我先通过已知参数生成Weibull分布模拟数据,再用Weibull函数拟合数据尝试还原参数(后续计划用于真实数据拟合),但在基础测试中发现拟合参数和已知参数存在微小偏差。
测试代码
from scipy.stats import weibull_min from scipy.optimize import curve_fit import numpy as np # 注:原代码遗漏numpy导入,此处补充 def weibull(x, shape, loc, scale): return weibull_min.pdf(x, shape, loc, scale) # 生成3秒时间序列 t_start = 0 t_end = 3 samples = t_end * 100 # 每秒模拟100个样本 t = np.linspace(t_start, t_end, samples) # 设置Weibull分布的已知参数 kn_shape, kn_loc, kn_scale = 1.5, 0, 1 # 基于已知参数生成模拟数据 sim_data = weibull(t, kn_shape, kn_loc, kn_scale) # 拟合模拟数据并返回参数 params, _ = curve_fit(weibull, t, sim_data) # 注:原代码中sim_data_noisy未定义,此处修正为sim_data
拟合结果
shape = 1.4999999989589334, loc = 4.399587587206362e-10, scale = 0.9999999997072269
偏差原因
- 浮点数精度限制:Python采用64位双精度浮点数存储数值,有效位数约15-17位。在生成模拟数据、计算PDF值、拟合优化的每一步中,都会产生微小舍入误差,累积后导致拟合结果与真实参数出现极细微偏差。
- 优化算法的收敛特性:
curve_fit默认使用的Levenberg-Marquardt算法通过迭代最小化残差寻找最优参数,当残差变化低于预设收敛阈值时就会停止迭代,不会无限逼近真实参数,因此会留下微小误差空间。 - 离散样本的固有误差:模拟数据是基于
np.linspace生成的离散样本点,而非连续的Weibull分布曲线,离散化过程本身会引入极微小的误差,影响拟合结果的绝对精准度。
内容的提问来源于stack exchange,提问作者Lyam
相关产品推荐
相关产品推荐

