stumpy.stump行为突变原因:为何无法匹配恒定时间序列区间?
问题:Stumpy库相似形状匹配中数值特殊处理异常的原因
问题描述
使用Stumpy库的stump函数查找时间序列相似形状时,遇到如下异常:
- 构造时间序列:前50个元素为100,其余750个元素为105,总长度800
- 设置窗口长度
m=210,运行后输出的距离曲线(橙色线)未在全105的完美匹配区间显示0值 - 将前50个元素改为101后,距离曲线在完美匹配区间正常显示0值
复现代码
import numpy as np import matplotlib.pyplot as plt import stumpy # 构造时间序列 ssss = 105 * np.ones(800) ssss[:50] = 100 # 修改为101时结果符合预期 m = 210 mp = stumpy.stump(ssss, m=m) plt.plot(ssss, color="blue") plt.plot(mp[:,0], color="orange") plt.show()
原因分析
该异常由Stumpy对零方差子序列的归一化距离计算逻辑,结合数值精度特性共同导致:
零方差子序列的产生
当窗口长度m=210时,从索引50开始的子序列完全由105组成,这类子序列的方差为0;而前50个索引对应的子序列包含100和105,方差不为0。归一化距离的计算逻辑
Stumpy默认计算归一化欧氏距离,核心是消除序列幅值和偏移的影响。当子序列方差为0时,会触发特殊处理:- 若两个子序列均为零方差且均值相等,理论上距离应为0(完全匹配)。
- 若零方差子序列与非零方差子序列对比,距离会基于均值差和非零方差子序列的标准差计算。
数值精度与最近邻选择
- 当前50个元素为100时,非零方差子序列与零方差子序列的均值差较大(约1.19),结合旧版本Stumpy的计算bug,零方差子序列之间的距离被错误计算为非0值,导致最近邻被选为非零方差子序列,距离曲线显示非0。
- 当改为101时,均值差缩小(约0.95),浮点数计算的精度问题消失,Stumpy正确识别零方差子序列之间的匹配关系,距离曲线显示0值。
此外,Stumpy默认开启ignore_trivial=True,会排除与当前子序列索引间距小于m/2的子序列。当使用100时,未被排除的非零方差子序列距离反而小于零方差子序列的错误计算距离,进一步导致最近邻选择异常;改为101后,非零方差子序列距离大于零方差子序列的正确距离(0),因此正确选择零方差子序列作为最近邻。
内容的提问来源于stack exchange,提问作者Noskario
相关产品推荐
相关产品推荐

