上下观古今,起伏千万途。这篇文章主要讲述时序数据可视化的降采样算法相关的知识,希望能为你提供帮助。
问题描述工业场景中,时序数据的可视化是一个无法回避的话题。时序数据的超大数据量给图形的展示性能带来了挑战,而通过降采样的方式减少图形的展示点数来迎合性能的同时,又会带来算法复杂度、算法可伸缩以及正确性等多方面的权衡。
下面通过几种常用的可视化降采样算法的研究和实践对比,为时序数据的可视化降采样算法选择提供参考。我们使用实际生产中的一个案例作为算法描述的基础:需求将10w的点降采样到4000,以适配页面的展示效果。
直觉分桶算法在一般情况下,面对一个复杂问题最先起作用的往往是我们的直觉。所以在面对大数据集降采样的问题时最先想到的这类算法统一归类于直觉算法。
Mode-Median-Bucket
模式中位数分桶算法,从大类来看是一个分桶算法,从取样方式来看分成了模式取样和中位数取样。
首先确定桶的数量即threshold等于4000,那么被分配到每个桶的数据点就是25。
然后遍历每个桶:
1) 查看桶中是否存在唯一众数,如果存在则应用众数模式,选取众数的最左边点作为桶的代表点
2) 如果不满足众数模式,则选取桶内点的中位数作为桶的代表点?
?特殊考虑,如果是第一个桶则选取第一个点,最后一个桶则选取最后一个点,从而确保整个数据集的完整性。
?Min-Std-Error-Bucket
最小标准误差分桶算法,从大类来看是一个分桶算法,从取样方式来看基于线性回归采用标准误差(SEE - standard error of estimate)公式作为取样的依据。
首先确定桶的数量即threshold等于4000,首尾两个桶都只包含一个点确保数据集的起点和终点被选中,其他点平均分配到桶。
1) 将每个桶中的点和后一个桶的点两两连成线段,每个线段记为一条边。
2) 对于每条边,计算所有x方向穿过的点到边的距离e。
3) 通过这些距离结合SEE公式计算边的标准误差作为边的权重。
至此,我们得到了一组带权重的边构成的DAG有向无环图,只需要使用图的最短路径算法(如Dijkstra’s algorithm)就可以得到构成最短标准误差的那些点了。
算法的主要缺陷在于选取最小标准误差的时候总是将图形变的平滑,所以局部的极值和全局的极值总是被忽略。
?
Longest-Line-Bucket
最长线段分桶算法,相对于MSEB算法保留了局部极值和全局极值,算法过程类似。
1) 将每个桶的点和下一个桶的点两两连线段,每个线段记为一条边
2) 计算每个边的长度,记为边的权重
至此,我们得到了一组带权重的边构成的DAG,需要计算图的最大路径,由于路径的权重都是正值,所以可以简单的取反转换为计算图的最短路径问题。
制图泛化技术上面描述的三个直觉算法一定程度上都能够解决问题,然而又或多或少引入了新的问题。比如MMB可能带来短视的问题,MSEB和LLB引入了额外的复杂度和效率问题。我们参考了几个制图泛化的技术,对直觉分桶算法进行改进。
Douglas-Peucker algorithm
多边形逼近算法,通过递归来逐步逼近原图形效果。
首先定义一个threshold(注意这个threshold和桶没有关系)表示点到线段的最大距离,
1) 连接首尾点构成初始线段AB
2) 计算AB中间的所有点到AB的垂直距离,获取垂直距离最大的点C和垂直距离e
3) 如果e <
threshold
,则AB符合原图趋势,选择AB代表图形,AB中所有点都可以排除
4) 如果e >
threshold
,则AB不符合趋势,分别连接AC,CB,继续步骤2)
5) 如果AB中间已经没有其他点了,则递归结束
Visvalingam–Whyatt algorithm
算法的主要思想是基于点的重要性或者意义来寻找能够代表图形的特征点,而点的重要性是通过有效区域即点构成三角形的面积来识别的。
遍历数据集中的每一个点,将该点和邻近的两个点来构成三角形,三角形的区域即为点的有效区域。当有效区域较小时,认定该点对于图形的重要性较低。
1) 首先计算每个点的有效区域,找出有效区域最小的点,剔除;
2) 重新计算邻接点的有效区域,继续找出有效区域最小的点,剔除;
3) 重复步骤2,知道剩余点的个数满足了绘图要求,算法结束
上面两种绘图泛化技术的特点是比较简单并且在降低数据量方面表现的相当有效。缺点是基于全局的返回可能会损失局部的特点,比如whyatt算法在删除点方面,可能会把一段时间的数据全部删除,这就给人造成了数据缺失的错觉,相应的图形表现力也大打折扣。如下图所示,黑色图形是算法处理后的图形。
文章图片
Largest Triangle Algorithms最大三角形算法是结合了Whytt算法和直觉算法的改良版,通过三角形来形成有效区域从而对数据点的重要性进行量化,再结合直觉算法中分桶思想最大程度的保留图形的特点。
Largest-Triangle-One-Bucket
LTOB最大三角形单桶算法,使用了Whytt算法有效区域的思路,再结合直觉算法中的分桶。
算法步骤:
1) 首先确定桶的大小,并将数据点平分到桶中,注意首尾点各占一个桶确保选中
2) 其次计算每个点和邻接点形成的有效区域,去除无有效区域的点
3) 在每个桶中选取有效区域最大的点代表当前桶
LTOB算法相比原始的Whytt算法,确保了点分布的相对均匀。每个桶都有一个代表点来表示,从而连接成为一个全局的路由。
Largest-Triangle-Three-Buckets
LTTB最大三角形三桶算法,相比于单桶的短视问题,将有效区域的计算延伸到前后两个桶。
算法步骤:
1) 首先确定桶的大小,并将数据点平分到桶中,注意首尾点各占一个桶确保选中
2) 选中第一个点
3) 从第二个桶开始,遍历桶中的点,计算每个点的有效区域,并选取有效区域最大的点作为桶的代表点。三角形的选取为[前一个桶的选中点,当前点,后一个桶的平均点]。
4) 选中最后一个点
LTTB算法相比LTOB算法,一定程度上减轻了短视的问题。同时通过固定三角形的两个点的方式,提升了算法的效率。
Largest-Triangle-Dynamic
LTD动态最大三角形,正如名字所说的那样可以动态的决定桶中的数据点个数。在上面提到的所有分桶算法中,我们都使用了同样的分配算法,即首尾各占一个桶,其他均分。这种分配方法无疑是最简单的,并且大多数情况是有效的。?
但是当我们遇到一些特殊形状的图形,如数据分布不均匀,一部分时间数据变化很平缓,部分时间变化很陡峭,如下图所示。我们的分桶方式就会显得力不从心。?
文章图片
这时候就需要一个动态的的分桶算法,当数据平缓的时候桶中的点相对较多,当数据陡峭的时候桶中的点相对较少,以此来确保在平缓区域分配较少的桶来选取较少的点,而在陡峭区域分配较多的桶来选取较多的点。
算法步骤:
1) 首先确定桶的大小,并将数据点平分到桶中,注意首尾点各占一个桶确保选中
2) 计算每一个桶的SSE(计算当前桶加上两个邻接点的线性回归线,SSE=桶内所有点到回归线的垂直距离平方之和)
3) 循环迭代直至终止条件触发(一般为有限次的迭代total/threshold*10,案例中为250次)
找出最大SSE的桶 F
找出SSE之和最小的相邻桶 A 和 B(AB和F不能相同)
将F均匀拆分成两个桶
将AB合并为一个桶
4) 确定了桶之后即可以采用LTTB算法进行降采样
文章图片
LTD算法相比LTTB算法在不规则图形上有更好的表现力,但是在规则图形上可能还不如LTTB。LTD的效率显然远不如LTTB,同时循环迭代的终止条件并没有比较好的参考数据需要不断尝试,这在某种程度上增加了算法的复杂性。
总结回顾在完成了以上六个算法的研究学习之后,我们可以对各个算法的优劣进行定性的比较,为我们之后的工作提供指导和帮助。
参照的指标有以下几个:
速度(Speed),算法的运行速度无疑是很重要的因素,一般我们页面的的响应需要控制在3s以内,算法的速度也应该参考这个基准。
可伸缩(Scalability),当数据量持续增长的时候,算法的表现不应发生明显变化。
复杂性(Complexity),算法的复杂度在于理解和实现的难度,一个量化的直接就是LOC。
适配能力(Portability),算法在各个环境和语言中支持的程度。
正确性(Correctness),算法的运行结果对于原图形的表现力。
文章图片
从上图可以看出LTTB算法在绝大多数情况下都是表现优异的,当然基于场景的差异可能其他算法会有更好的正确性。所以我们的决策顺序可以是优先LTTB,当LTTB不满足呈现的需求时,我们可以尝试其他算法以获取更好的结果。
最后我们基于我们实际的两组数据进行了测试,一组为单调递增的累积损伤数据,一组为波动的异常诊断数据。参与比较的数据集包含:
1) 原始数据集
2) MMB降采样结果
3) LTOB降采样结果
4) LTTB降采样结果
5) LTD降采样结果
文章图片
各个算法在累积损伤模型上的表现差异
【时序数据可视化的降采样算法】?
文章图片
各个算法在异常诊断模型上的表现差异
文章图片
参考文章:???https://skemman.is/bitstream/1946/15343/3/SS_MSthesis.pdf???
源码地址:???https://gitee.com/luischen/toolbox.git???
推荐阅读
- Java技术指南「并发编程专题」针对于Guava RateLimiter限流器的入门到精通(含实
- k8s____pod调度
- HashMapHashTableTreeMap的底层源码分析和对比
- 这21个网络工程师必备工具,都是老杨的私人珍藏。
- samba服务器安装和配置
- Python数据分析基础-1二元操作符(又全又清晰!)
- 相关行知03--项目类型
- linux之fping命令
- MySQL之Update生命周期最详细的解剖