时间序列数据处理2——时间序列聚类算法



 本文主要实现对时间序列聚类算法研究和相关搬运工作

目录

  • 1. 时间序列(Time Series,TS)聚类概述
  • 2. TS聚类应用
    • 2.1 数据简化
    • 2.2 相似性/距离度量
    • 2.3 聚类方法
    • 2.4 评估聚类结果的标准
  • 3. TS特征提取
  • 4. 相似性度量——DTW(动态时间规整)
  • 5. k-shape时间序列聚类实战(tslearn)
  • 参考资料

1. 时间序列(Time Series,TS)聚类概述

时间序列:
时间序列是按照时间排序的一组随机变量,它通常是在相等间隔的时间段内,依照给定的采样率,对某种潜在过程进行观测的结果。是指将同一统计指标的数值按其发生的时间先后顺序排列而成的数列,其中隐藏着一些过去与未来的关系。
时间序列分析试图通过研究过去来预测未来。
时间序列数据是实值型的序列数据,具有数据量大、数据维度高以及数据是不断更新的等特点,高度异质性,即包含噪声、缺失值、异常值,长度、采样率、变化速率不一,不能简单地视为高维向量,传统的基于欧式空间的聚类算法不能被直接利用。。

时间序列聚类方法的分类:
什么是聚类?聚类是一种无监督学习方法,聚类就是按照某个特定标准(如距离)把一个数据集分割成不同的类或簇,使类内差异最小,类间差异最大。其目的是根据某种相似度度量对数据集进行划分,将没有类别的数据样本划分成若干个不同的子集,这样的一个子集称为簇(cluster),聚类使得同一个簇中的数据对象彼此相似,不同簇中的数据对象彼此不同,即通常所说的“物以类聚”。
传统的聚类方法针对静态数据,所谓静态数据就是其特征不随时间变化。
由于时间序列的特征包含随时间变化的值,所以不是静态数据。
对于时间序列的聚类来说,有两种思路

  • 一种是修改现有的聚类方法以适用于时间序列
  • 一种是将时间序列转换为静态数据,然后在使用现有的聚类方法

前一种思路直接作用于原始数据,称为基于原始数据的方法,难点在于要找到适用于时间序列的距离/相似性度量。
第二种思路首先将原始的时间序列数据转换为低维的特征向量或若干模型参数,称为基于特征的或基于模型的方法。

基于模型的方法认为相似的时间序列应该产生相似的模型,所以通过比较模型之间的相似性可以达到时间序列聚类的目的。困难在与模型选择和参数确定两个问题。常用的模型:

  • ARMA模型
  • HMM模型
  • 马尔科夫链

基于特征提取的聚类主要应用于高维时间序列,特别是高频金融时间序列,经过特征提取后可有效降维。针对时间序列的数学特性。对时间序列进行特征提取,用提取的特征项对时间序列进行时间序列的重新描述,然后对重新描述的时间序列聚类。

现有的聚类方法大致可以分为以下三类:

  1. 基于统计的聚类
    这类方法从时序数据中抽取统计特征,如平均值、方差、倾斜度,以及一些高阶特征等,如ARIMA模型的系数、分形度量(fractal measures)等。或是划分窗口,在每个窗口内计算这些统计特征,再进行汇总。

  2. 基于形状的聚类
    许多时序数据往往具有相同的变化模式(如上升、下降、上升等),因此可以根据这些时序数据的形状相似性将变化模式相似的序列聚在同一个类,可以忽略数据在整幅、时间尺度等的差异。
    一些人工定义的距离(如DTW)具有尺度和平移不变性,因此被广泛用于基于形状的聚类。由于人工定义的距离是数据无关的,方便利用到各种领域的数据上,一个研究方向是定义新的距离度量,然后结合一个现成的聚类算法(k-means或层次化聚类等)。

    这类方法中最先进的是[1], 该方法利用现有的距离度量的特性(scale-, translate-, and shift-invariant),提出了一种计算聚类中心的算法。

    现有方法主要有两方面的缺点:
    (1)时间复杂度高;
    (2)易受到异常值、噪声的干扰

    另一类是基于shapelets的方法[2,3],shapelets即一些短的序列,这些序列能够体现出整条序列的局部变化模式。

    基于形状的聚类方法基本都有开源实现,python包tslearn中基本都包含了。

  3. 基于深度学习的聚类
    该类方法主要基于autoencoder模型将时序数据转换为低维的隐空间,现有的变分自编码器(variational autoencoder)等虽然能够在一定程度上容忍噪声、异常值等。但目前存在两方面的不足:

    缺乏一种通用的方法来捕获时序数据的特性,从而得到有效的隐空间。
    在得到的隐空间中需要一种合适的相似性度量考虑时间上的特性。
    目前最先进的方法是[4],该方法同时训练一个autoencoder和k-mean(基于KL散度的loss)。autoencoder模型中先用1D卷积,然后接一个双向的LSTM,因此考虑了时序数据的局部和时间上的特征,但这也是时序数据常用的处理套路。

    目前基于静态数据(向量数据)的聚类算法也有一定的发展,主要可分为以下几类:

    (1)联合优化stacked autoencoder和k-means目标[5-7]。其中k-mean目标是基于KL散度计算的。(论文[6]和[7]貌似发生了撞车 )

    (2)将变分自编码器(VAE)和高斯混合模型(K个聚类对应K个高斯分量)结合[8]。

    (3) 同时训练K个autoencoders,每条数据根据哪个autoencoder得到的重建误差最小,该数据就属于哪个类[9,10]。(论文[9]和[10]貌似也发生了撞车 )

    总结:基于深度学习的时序数据聚类还有较大的发展空间,目前基于静态数据的方法不能很好的考虑到时间序列在时间上的平移、伸缩等特性。
    更多信息见参考资料6.

2. TS聚类应用

如果关注不同序列在统计特性上的差异,那么可以提取时序的统计特征,基于提取的统计等特征进行计算欧式距离的KMeans的聚类,如果关注形状的相似,那么可以使用执行SBD计算距离的k-shape聚类。另外,如果想要捕捉时序的动态特性,也是可以使用深度学习的seq2seq对隐式向量进行聚类。

聚类的步骤:

  1. 数据简化
  2. 两个时间序列相似性的度量
  3. 时间序列聚类的通用算法
  4. 评估聚类结果的标准

2.1 数据简化

  • DFT 离散傅里叶变换
  • DWT 离散小波变换
  • SVD 奇异值分解
  • PLA 分段线性估计
  • PAA 分段聚合近似
  • SAX 符号化聚合近似

2.2 相似性/距离度量

  • 欧氏距离、Minkovski距离
  • Pearson相关系数
  • DTW(Dynamic time warping)
    时间序列数据处理2——时间序列聚类算法_第1张图片

2.3 聚类方法

常用于时间序列的聚类算法可以划分为如下几类:

  • 距离聚类 例如k-means算法:是一种典型的划分聚类算法,它用一个聚类的中心来代表一个簇,即在迭代过程中选择的聚点不一定是聚类中的一个点,该算法只能处理数值型数据
  • 层次聚类 例如CRUE算法:采用抽样技术先对数据集D随机抽取样本,再采用分区技术对样本进行分区,然后对每个分区局部聚类,最后对局部聚类进行全局聚类
  • 基于模型的方法 主要是指基于概率模型的方法和基于神经网络模型的方法,例如SOM神经网络

2.4 评估聚类结果的标准

  • 有ground truth 将聚类结果与ground truth比较
    Rand Index
    Mutual Information
    Cluster Similarity Measure (CSM)
    Cluster purity
    Jaccard Score
    ……
  • 无ground truth 用于比较不同聚类方法得到的结果
    SSE(均方误差):对每个时间序列来说,就是到最近的集群的距离
    Silhouette Coefficient(轮廓系数) 
    ……
    更多信息见参考资料1.

3. TS特征提取

  1. 时间序列的统计特征
    提到时间序列的统计特征,一般都能够想到最大值(max),最小值(min),均值(mean),中位数(median),方差(variance),标准差(standard variance)等指标,不过一般的统计书上还会介绍两个指标,那就是偏度(skewness)和峰度(kuriosis)。

  2. 时间序列的熵特征
    为什么要研究时间序列的熵呢?请看下面两个时间序列:

    时间序列(1):(1,2,1,2,1,2,1,2,1,2,…)

    时间序列(2):(1,1,2,1,2,2,2,2,1,1,…)

    在时间序列(1)中,1 和 2 是交替出现的,而在时间序列(2)中,1 和 2 是随机出现的。在这种情况下,时间序列(1)则更加确定,时间序列(2)则更加随机。并且在这种情况下,两个时间序列的统计特征,例如均值,方差,中位数等等则是几乎一致的,说明用之前的统计特征并不足以精准的区分这两种时间序列。

    通常来说,要想描述一种确定性与不确定性,熵(entropy)是一种不错的指标。对于离散空间而言,一个系统的熵(entropy)可以这样来表示:
    在这里插入图片描述
    如果一个系统的熵(entropy)越大,说明这个系统就越混乱;如果一个系统的熵越小,那么说明这个系统就更加确定。

    提到时间序列的熵特征,一般来说有几个经典的例子,那就是 binned entropy,approximate entropy,sample entropy。下面来一一介绍时间序列中这几个经典的熵。

  3. 时间序列的分段特征

更多信息见参考资料8.

4. 相似性度量——DTW(动态时间规整)

如下图所示,实线和虚线分别是两个时间序列,但在时间轴上却是不对齐的。例如在第20个时间点的时候,实线波形的a点会对应于虚线波形的b’点,这样传统的通过比较距离来计算相似性很明显不靠谱。因为很明显,实线的a点对应虚线的b点才是正确的:
时间序列数据处理2——时间序列聚类算法_第2张图片

DTW是一种将时间规整和距离测度相结合的一种非线性规整技术。主要思想是把未知量均匀地伸长或者缩短,直到与参考模式的长度一致,在这一过程中,未知量的时间轴要不均匀地扭曲或弯折,以使其特征与参考模式特征对正。DTW距离可以帮助我们找到更多序列之间的形状相似。
时间序列数据处理2——时间序列聚类算法_第3张图片
具体计算过程如下:
时间序列数据处理2——时间序列聚类算法_第4张图片
更多信息见参考资料2、7.

总结:

(1)时间序列的聚类和普通的横截面数据聚类不一样;

(2)时间序列聚类的难点在于如何衡量两个时间序列之间的距离(相似性);

(3)使用欧式距离等传统的距离衡量方式去衡量时间序列之间的距离是不可靠的;

(4)可以使用DTW(动态时间规整)的方法去衡量时间序列的距离(相似性);

(5)当求出了时间序列之间的距离矩阵后,用啥聚类方法就问题不大了,层次聚类都行。

更多信息见参考资料3.

5. k-shape时间序列聚类实战(tslearn)

k-shape算法的核心是迭代增强过程,可以生成同质且较好分离的聚类。该算法采用标准的互相关距离衡量方法,基于此距离衡量方法的特性,提出了一个计算簇心的方法,在每一次迭代中都用它来更新时间序列的聚类分配。
优点就是针对形状计算距离,优点很鲜明,同时不得不说的是计算复杂度很高,且我们使用tslearn包进行聚类,是需要不同的序列长度一致的。
不同形状的时序聚类效果:
时间序列数据处理2——时间序列聚类算法_第5张图片
实现步骤:

  1. 数据读取与预处理(序列填充,使每条序列等长)
  2. 计算轮廓系数,求出轮廓系数最大时的聚类个数k
  3. 使用最佳聚类个数,得到序列聚类标签
  4. 可视化,绘制elbow线图辅助检验聚类个数是否合理,同时绘制不同序列的聚类效果图。

参考数据和代码 , 更多详细介绍见参考资料9.

安装依赖:

pip install tslearn

tslearn和sklearn一样,是一款优秀的机器学习框架,tslearn更偏向于处理时间序列问题,如其聚类模块就包含了DTW(Dynamic Time Warping)等算法及变种,也提供了轮廓系数对聚类效果评估,十分方便,使用文档。

更多信息见参考资料2.

参考资料

  1. 时间序列的聚类方法
  2. 【TS技术课堂】时间序列聚类
  3. 聊一聊时间序列聚类
  4. 时间序列知识整理
  5. 时间序列
  6. 时序数据聚类
  7. 时间序列的搜索
  8. 时间序列的表示与信息提取
  9. k-shape时间序列聚类(tslearn)
  10. tslearn使用轮廓系数(silhouette_score)评估KShape聚类效果

你可能感兴趣的:(聚类,python,机器学习)