检测数据的重大变化
Detecting significant changes in data
我有一个图形输入,其中 X 轴是时间(向前)。 Y轴总体稳定,但在不同点有较大的下降和上升(如下图红色箭头所示)
视觉上很明显,但我如何从代码中有效地检测到这一点?我不确定应该使用哪种算法,但我希望它尽可能简单。
一个简单的方法是计算每两个相邻样本之间的差异,例如diff= abs(y[x point 1] - y[x point 0]) 并计算所有差异的标准偏差。这将为您按顺序对差异进行排序,并且还有助于消除随机噪声,如果您仅对最大差异值进行采样,就会得到这种随机噪声。
如果您的 up/down 值跨越几个 x 周期(例如每分钟绘制一次温度),则计算 N 个样本的差异,从 N 个样本中获取最大值和最小值。如果你想要 5 个样本作为检测周期,那么获取样本 0、1、2、3、4 并提取 min/max,将它们用于 diff。重复样本 1、2、3、4、5 等。您可能需要尝试一下,因为太多样本开始影响 stddev。
另一种方法是通过子采样和选择感兴趣的斜率和长度来计算图表 up/down 部分的斜率。虽然这对于自动检测来说可能更准确,但更难深入描述算法。
我曾处理过类似的问题并构建了一个图表分类器,但我真的很想参考这个领域的研究。
当你开始这样做时,你可能还想看看 'control charts' 运筹学,他们确定了几种可能也值得检测的模式,具体取决于你的图表。
我有一个图形输入,其中 X 轴是时间(向前)。 Y轴总体稳定,但在不同点有较大的下降和上升(如下图红色箭头所示)
视觉上很明显,但我如何从代码中有效地检测到这一点?我不确定应该使用哪种算法,但我希望它尽可能简单。
一个简单的方法是计算每两个相邻样本之间的差异,例如diff= abs(y[x point 1] - y[x point 0]) 并计算所有差异的标准偏差。这将为您按顺序对差异进行排序,并且还有助于消除随机噪声,如果您仅对最大差异值进行采样,就会得到这种随机噪声。
如果您的 up/down 值跨越几个 x 周期(例如每分钟绘制一次温度),则计算 N 个样本的差异,从 N 个样本中获取最大值和最小值。如果你想要 5 个样本作为检测周期,那么获取样本 0、1、2、3、4 并提取 min/max,将它们用于 diff。重复样本 1、2、3、4、5 等。您可能需要尝试一下,因为太多样本开始影响 stddev。
另一种方法是通过子采样和选择感兴趣的斜率和长度来计算图表 up/down 部分的斜率。虽然这对于自动检测来说可能更准确,但更难深入描述算法。
我曾处理过类似的问题并构建了一个图表分类器,但我真的很想参考这个领域的研究。
当你开始这样做时,你可能还想看看 'control charts' 运筹学,他们确定了几种可能也值得检测的模式,具体取决于你的图表。