对不同长度的时间序列数据进行聚类

Posted

技术标签:

【中文标题】对不同长度的时间序列数据进行聚类【英文标题】:Clustering Time Series Data of Different Length 【发布时间】:2019-10-22 00:35:28 【问题描述】:

我有不同长度的时间序列数据。我想根据 DTW 距离进行聚类,但找不到关于它的 ant 库。 sklearn 给出直接错误,而 tslearn kmeans 给出错误答案。

如果我用零填充它,我的问题正在解决,但我不确定在聚类时填充时间序列数据是否正确。

欢迎提出关于时间序列数据的其他聚类技术的建议。

max_length = 0

for i in train_1:
    if(len(i)>max_length):
        max_length = len(i)
print(max_length)

train_1 = sequence.pad_sequences(train_1, maxlen=max_length)
km3 = TimeSeriesKMeans(n_clusters = 4, metric="dtw",verbose = False,random_state = 0).fit(train_1)

print(km3.labels_)

【问题讨论】:

我是被问到分析问题的人,得出的结论是填充不是解决方案,因为它从超过 2 个类数据中给出了不同的答案 【参考方案1】:

您可以尝试定制的 k-means(聚类算法)或其他。源代码可在 sklearn 库中轻松获得。填充确实不是一个很好的选择,因为它会改变问题本身。您也可以使用 tslearn 和 pyclustering(用于优化集群)作为替代方案,但请记住使用 DTW 距离而不是欧几里得距离。

【讨论】:

我可以使用像轮廓索引这样的聚类参数来进行聚类,而不仅仅是找到最优的 K。【参考方案2】:

我遇到了同样的问题,因为我的数据长度不同。我在每个系列的末尾使用零来获得最大长度。我用数据测试了一些集群类型,与其他集群相比,“分区”的效果出奇的好。我不是专家,但这足以满足我的需求。

如果你找到更好的方法,请告诉我。

data_clusters_results <-
  tsclust(
    series = data_ts_,
    type = "partitional", ## options: "partitional", "hierarchical", 'fuzzy'
    k = 2:max_clusters,
    preproc = NULL,
    distance = "gak", ## options: "dtw", "dtw2", "dtw_basic", "gak"
    trace = TRUE
  )

【讨论】:

以上是关于对不同长度的时间序列数据进行聚类的主要内容,如果未能解决你的问题,请参考以下文章

在 Python 中对时间序列数据进行聚类

如何对时间序列数据执行 K-means 聚类?

我们可以在 Python 中对多元时间序列数据集进行聚类吗

如何根据面部特征对人脸进行聚类?

对时间序列事件进行聚类的不同聚类算法

在大型数据集上进行聚类