时间序列聚类
Posted 数字背后的奥秘
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了时间序列聚类相关的知识,希望对你有一定的参考价值。
在日常的数据处理过程中,我们一般会处理大量的时间序列数据。而海量的时间序列有着各种各样的形状和走势。因此,有学者提出对时间序列进行分类,然后根据不同的类使用不同的模型进行分析与挖掘。如果要做时间序列的分类,就先需要做聚类的操作,当然聚类算法有很多,比如K-Means、DBSCAN、层次聚类等。使用过聚类算法的同学应该知道,在数据量非常大的情况下,聚类算法的运算时间消耗也比较大。但是,由于工作需求,我们不得不选择聚类算法。除了聚类方法外,我们还有其他时间序列的分类方法吗?有的,比如相似度分析。
在介绍分类方法之前,我们先对数据预处理阶段进行说明:
1、缺失值:缺失值指的是数据中的NAN数据。数据处于确实状态,通常的办法就是把数据补齐,当然数据补齐的方法有很多种,最简单的就是使用线性插值的方式来补齐(df.interpolate()——python中pandas模块的使用方法)。
2、归一化:对于一个时间序列而言,也许它们的均值相差很大,但是走势一致,它们也有着较强的相关性。此时,我们可以选择将数据归一化。常见的归一化方法有:标准化,最大最小值归一化。
数据预处理完成,接下来需要对时间序列进行降噪处理。降噪的方式有很多种,移动平均降噪、小波降噪、卡尔曼滤波降噪等,由于本人知识有限,在接下来的数据我们就选择时间窗移动平均降噪的方式。在清华大学裴丹教授的论文《Robust and Rapid Clustering of KPIs for Large-Scale Anomaly Detection》中提出了“基线”的概念,我认为降噪后的时间序列在某种意义上可以说使原时间序列的基线。
下图,是笔者课程作业中所用的某地铁站进站数据的基线提取图示,因为以5分钟作为时间粒度,我在这选择windows=3(15min)作为时间窗口。
基线提取完毕,我们需要对时间序列进行分类,在前文中,我们提到可以采用聚类的方式,也可以进行相关性分析。虽然,笔者采用了第二种方式,但为了对知识点更全面的说明,在此处我们对聚类方法也进行相关介绍。
熟悉聚类算法的同学应该了解到,聚类的前提是有聚类特征。对于时间序列,只有一个随着时间变化的数据该如何聚类呢?其实,如果知道Kaggle的人,应该会知道“特征工程”这个名词。我们可以对时间序列数据进行特征提取,然会根据提取的特征进行聚类。
特征工程到底提取的是什么呢?对于时间序列数据,我们可以求其均值、方差、偏度等等,python拥有强大的第三方库,它为我们提供了时间序列特征提取的方法(from tsfresh import extract_features)。因为笔者没有深入研究,在这就不多赘述。
接下来,我们介绍时间序列相关性判断的方法。
前文提到的裴丹教授的论文中使用的方如下:对于两条时间序列X=[]和Y=[]而言,为了解决左右平移的问题,需要考虑一个偏移量|s|,然后计算它们的内积。
对于新的数据经过预处理,基线提取等步骤后,可以计算它与之前每一个质心的距离。进行在线分类。
最后,介绍笔者偷懒的做法。做过数据处理的人,一定听说过Spearman秩相关系数,而且,python更是有它的相关函数。
采用上面提到的数据,笔者对三月份不同日期的相关性做了判断,并进行了热力图的绘制。
我们发现,工作日是强相关的,这也符合我们的主观认识。所以,如果我们想要预测四月份工作日的客流量时,训练数据可以选用三月份全部的工作日数据。(笔者想要预测2019.4.1的早高峰客流量,首先假设周一之间一定存在强相关,但是一个月中只有4个周一,数据量较少,所以,如何找到其他可以用作周一客流量数据,就采用了以上方法,验证了工作日数据都是可用的。)
References:
[1] 张戎《两篇关于时间序列的论文》——知乎
[2] 裴丹《Robust and Rapid Clustering of KPIs for Large-Scale Anomaly Detection》——清华大学
以上是关于时间序列聚类的主要内容,如果未能解决你的问题,请参考以下文章