【原创】保留时序数据波动细节的一种采样算法

2020-08-31  本文已影响0人  小清新同学

1,为什么要对时序数据进行采样?

首先复习一下时序数据的概念,随着时间的变化而不断产生新的数据的数列被称为时序数据,时序数据常见于监控场景,例如服务器的CPU使用率、内存使用率等指标数据。
时序数据的一大特点就是数据随着时间往往会快速的跳动,例如下图:


原始时序数据

从图中可以看到,由于数据点数太密,且波动非常频繁,将所有数据点通过折线依次连接后已经重叠在了一次,可视化效果很差,这就需要对原始的数据点进行采样,比如将10000个原始数据点采样为200个数据点。

2,传统时序数据采样算法的缺陷

简单的数据采样算法是求平均、最大、最小等统计值,比如上面举到的10000个原始数据点采样为200个数据点的例子,可以将原始数据点划分为200个小组,每个小组包含50个原始数据点(200*50=10000),然后每个小组中对所有原始数据点求平均值,这样就获得了采样后的200个数据点。
这种算法很简单,但存在一个问题,就是丢失了很多原始数据波动变化的细节,如下图:


传统采样算法效果

图中灰色线条为原始数据,很色线条为采样后数据,可以看到数据采样后变的更加平滑,很多细节都丢失了。尤其是红框中原始数据的一个非常明显的峰值直接被抹掉了,而这个峰值很可能代表了业务异常。

3,一种可以保留时序数据波动细节的算法

论文Downsampling Time Series for Visual Representation中提到了一种数据采样算法LTTB(还有其它几种类似的算法,详见论文),可以在采样的同时保留原始数据的波动细节,具体原理不展开,这里展示下算法效果。

未采样的原始数据
使用LTTB算法采样后的数据(7500->500)
可以看到经过采样后,原始数据整体的波动情况被完整保留下来,只丢失了个别细小的波动,远远优于传统的采样算法。
这里有一个在线demo,能够更直观的体验这种算法:https://www.base.is/flot/

4,算法应用场景

可以广泛应用与监控类产品,能够很好的解决如下两类问题:

上一篇下一篇

猜你喜欢

热点阅读