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

5
我正在尝试使用不同的聚类技术在Python中对时间序列数据进行聚类。K-means算法没有给出好的结果。下面的图片是我使用凝聚聚类算法进行聚类后得到的结果。我还尝试了动态时间规整。这两种方法似乎给出了相似的结果。
理想情况下,我希望第二张图片中的时间序列有两个不同的簇。第一张图片是一个快速增长的簇。第二张图片是一种无增长的、稳定的簇,第三张图片是一个下降趋势的簇。我想知道哪些时间序列是稳定的且受欢迎的(这里的“受欢迎”指的是高计数)。我尝试了分层聚类,但结果显示出太多的层次,我不确定如何选择层次的级别。是否有人能够说明如何将第二张图片中的时间序列分成两个不同的簇,一个是低计数,另一个是高计数?这是否可能?或者我应该只是直观地选择一个阈值来将它们分成两部分?
快速增长的簇:
https://istack.dev59.com/MKYI0.webp 稳定计数的簇:
https://istack.dev59.com/YF0TA.webp 下降趋势的簇:
https://istack.dev59.com/TUTnI.webp 这是我分层聚类的结果,非常模糊。
https://istack.dev59.com/iItd4.webp 总的来说,如果您想区分趋势,例如YouTube视频,如何只选择一些视频进入“流行”栏目,而其他视频进入“本周流行”栏目?我知道在YouTube的情况下,除了观看次数之外还考虑了许多其他因素。对于第二张图片,我试图做的与“本周流行”栏目类似。我想挑选那些有很高计数的时间序列。在这种情况下,我该如何分割时间序列?

我知道DTW可以捕捉趋势。 DTW与上面的图像给出了相同的结果。它已经识别出第二张图像中的趋势是“稳定”的。但它没有捕捉到这里的“计数”元素。在这种情况下,我希望同时捕捉到趋势和计数,即稳定和高计数。

上述图像是基于计数的时间序列聚类。我是否错过了其他可以实现此目标的聚类技术?即使只考虑计数,如何根据我的需要进行不同的聚类?

如果有任何想法,请不吝赐教。提前致谢!


2
这不是关于缺少任何聚类技术的问题。如果你将原始数据输入K-means(或任何其他算法),那么结果不会很好。你需要从时间序列中构建特征(如平均每日增长率、下一个观察值高于上一个观察值的次数等)。关于高计数,我认为你应该自己定义一个阈值。没有算法会为你做这件事。 - Stergios
你能否编辑你的问题,说明你尝试了哪些基于DTW距离的聚类技术,以及除欧几里得距离之外,你还尝试了哪些距离度量方法用于K-Means聚类? - nth-attempt
K-Means算法使用欧几里得距离并不能充分利用时间序列的特性。你可以尝试打乱时间序列,但由于距离仍然是欧几里得距离,所以聚类结果应该是相同的。@Stergios,你实际上是在尝试构建基于时间的特征来输入到K-Means中。你知道有哪些其他聚类方法可以直接对原始时间序列进行聚类吗?我知道一种方法是使用DTW作为距离度量,并使用层次聚类算法。 - nth-attempt
@ultramarine 我不知道有任何算法可以将原始时间序列进行聚类。 - Stergios
提高您的预处理和特征提取! - Has QUIT--Anony-Mousse
2个回答

0

你可以做的最好的事情就是从你的时间序列中提取一些特征。 在你的情况下,第一个要提取的特征是趋势线性趋势估计

另一件你可以做的事情是像建议和解释在这篇文章中那样聚类你的时间序列的累积版本时间序列距离度量


0

您可以使用DTW通过计算总最小距离来聚类趋势,另外一个类似的问题请参考这里。我曾经遇到过一个非常接近这个问题的情况,最终我部署了自己的Python包来解决它。详情请查看这里。您也可以在这里看到演示。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接