指数平滑函数参数设置问题:自定义实现与statsmodels结果偏移的对齐方法
指数平滑函数参数设置问题:自定义实现与statsmodels结果偏移的对齐方法
这个问题我之前也碰到过,本质是你自定义的平滑值和statsmodels默认输出的fittedvalues定义不一样~
差异原因
你的自定义函数计算的是每个时刻的平滑值,严格遵循公式:
s_t = α * y_t + (1-α) * s_{t-1}
其中s_t是t时刻的平滑值,用当前观测值y_t和上一个平滑值s_{t-1}计算得到。
而statsmodels的fittedvalues返回的是一步向前预测值——也就是用t-1时刻的平滑值来预测t时刻的观测值,公式是:
ŷ_t = s_{t-1}
这就导致了结果整体向后偏移一步。
解决方法
要让statsmodels的结果和你的自定义实现完全对齐,只需要获取拟合模型的level属性即可,它存储的就是每个时刻的平滑水平值,完全匹配你的公式:
修改你的代码:
# 替换原来的fittedvalues调用 smoothed_statsmodels = model.level.tolist()
用你的示例数据测试,修改后的输出会和手动实现的结果完全一致:
Manual: [10, 11.0, 12.0, 13.5, 15.75, 18.375, 21.6875] Statsmodels: [10, 11.0, 12.0, 13.5, 15.75, 18.375, 21.6875]
补充说明
如果你非要使用fittedvalues,也可以手动调整序列(比如去掉第一个值,再用最后一个平滑值补一个预测值),但这种方式既麻烦又容易出错,直接使用level属性是最简洁可靠的方案。
备注:内容来源于stack exchange,提问作者Чорны Бусел
相关产品推荐
相关产品推荐

