时间序列聚类

聚类是将相似对象分组在一起的任务。 因此,这个任务在很大程度上依赖于所依赖的相似性概念。

下图说明了为什么选择一个合适的相似度函数是关键(重现代码可在示例库中找到)。

../_images/kmeans.svg

\(k\)-均值聚类使用欧几里得距离。每个子图代表来自给定聚类的序列及其质心(红色显示)。

该图是使用欧几里得距离作为基础度量的\(k\)-均值聚类的结果。 这种度量的一个问题是它对时间偏移不具有不变性,而所讨论的数据集显然具有这种不变性。

\(k\)-均值和动态时间规整

为了克服前面提到的问题,需要使用专门针对时间序列的距离度量,例如动态时间规整(DTW)。如下图所示,使用这些度量可以产生更有意义的结果。

tslearn 中的 tslearn.clustering 模块提供了一个选项,可以在 \(k\)-means 算法中使用 DTW 作为核心度量,从而获得更好的聚类和质心:

../_images/kmeans_dtw.svg

\(k\)-means 聚类与动态时间规整。每个子图代表来自给定聚类的序列及其质心(红色)。

首先,聚类会聚集形状相似的时间序列,这是由于动态时间规整(DTW)能够处理时间偏移,如上所述。 其次,聚类中心(也称为质心)是相对于DTW计算的重心,因此它们允许检索出无论聚类中的时间偏移如何的合理平均形状(有关如何计算这些重心的更多详细信息,请参见我们的专用用户指南部分)。

tslearn中,使用\(k\)-means和专门的时间序列度量对时间序列数据集进行聚类就像

from tslearn.clustering import TimeSeriesKMeans

model = TimeSeriesKMeans(n_clusters=3, metric="dtw",
                         max_iter=10, random_state=seed)
model.fit(X_train)

其中 X_train 是被考虑的无标签时间序列数据集。 metric 参数也可以设置为 "softdtw" 作为另一种 时间序列度量(参见 我们的用户指南关于软DTW的部分)。

\(k\)-均值和时间序列核

处理这种时间偏移的另一种选择是依赖于核技巧。 事实上,[1] 引入了一种受DTW启发的用于时间序列的半正定核。 然后,可以使用核\(k\)-均值算法[2],该算法等同于在所选核相关的再生核希尔伯特空间中操作的\(k\)-均值算法。

../_images/kernel_kmeans.svg

使用全局对齐核的Kernel \(k\)-means聚类。每个子图表示来自给定聚类的序列。

第一个显著差异(与\(k\)-均值相比)是聚类中心从未被显式计算,因此一旦执行聚类,时间序列分配到聚类是唯一可用的信息。

其次,需要注意的是,由核\(k\)-均值生成的聚类是相位依赖的(参见在相位而非形状上不同的聚类2和3)。 这是因为全局对齐核对于时间偏移不具有不变性,正如在[3]中对于密切相关的软DTW [4]所展示的那样。

使用聚类估计器的示例

k-means

k-means

Kernel k-means

Kernel k-means

参考文献