在 Python 中对时间序列数据进行聚类
Posted
技术标签:
【中文标题】在 Python 中对时间序列数据进行聚类【英文标题】:Clustering time series data in Python 【发布时间】:2018-01-18 03:18:57 【问题描述】:我正在尝试使用不同的聚类技术。 K-means 没有给出好的结果。以下图像是我使用凝聚聚类聚类后的图像。我还尝试了动态时间扭曲。这两个似乎给出了相似的结果。
理想情况下,我希望第二张图片中的时间序列有两个不同的集群。第一个图像是一个快速增长的集群。第二个是没有增加的类似稳定的,第三个是下降趋势的集群。我想知道哪些时间序列既稳定又流行(这里的流行是指高计数)。我尝试了层次聚类,但结果显示层次结构太多,我不确定如何选择层次结构级别。有人可以阐明如何将第二张图像中的时间序列分成两个不同的集群,一个具有低计数,另一个具有高计数?有可能做到吗?还是我应该只是在视觉上选择一个阈值将它们一分为二?
快速增长的集群:
数量稳定的集群:
呈下降趋势的集群:
这是非常非常模糊的,但这是我的层次聚类的结果。
我知道这个特定的图像根本没有用,但这对我来说也是一个死胡同。
一般来说,如果您想区分趋势,例如 YouTube 视频,如何在“趋势”部分只挑选一些,而在“本周趋势”部分挑选另一些?我了解“趋势”部分的视频与第一张图片具有相似的特征。 “本周趋势”部分包含一系列视频,这些视频的观看次数非常高,但在计数方面非常稳定(即没有显示出快速增长)。我知道在 YouTube 的情况下,除了观看次数之外,还有许多其他因素需要考虑。对于第二张图片,我想做的类似于“本周趋势”部分。我想挑选那些计数很高的。在这种情况下如何拆分时间序列?
我知道 DTW 捕捉趋势。 DTW 给出了与上图相同的结果。它已经确定了第二幅图像中“稳定”的趋势。但它没有在这里捕获“计数”元素。我希望同时捕获趋势和计数,在这种情况下,计数稳定且高。
以上图像是基于计数聚类的时间序列。我是否错过了可以实现这一目标的任何其他聚类技术?即使只有计数,我如何根据需要进行不同的聚类?
任何想法将不胜感激。提前致谢!
【问题讨论】:
这不是缺少任何聚类技术。如果您使用原始数据提供 K-means(或任何其他算法),那么结果将不会很好。您需要从时间序列中构建特征(如平均每日增长、下一次观察高于前一次的次数等)。关于高计数,我认为您应该自己定义一个阈值。没有算法会为您执行此操作。 您能否编辑您的问题,说明您使用 DTW 作为距离尝试了哪些聚类技术,以及您尝试了除欧几里得之外的 K-Means 聚类的所有距离指标吗? 具有欧几里得距离的 K-Means 本身并不利用时间序列。要看到你可以打乱时间序列,你应该得到相同的集群,因为距离是欧几里得。 @Stergios您实际上是在尝试构建基于时间的功能以将其提供给K-Means。您是否知道任何其他可以直接对原始时间序列进行聚类的聚类方法?我知道的一件事是使用 DTW 作为距离并使用层次聚类。 @ultramarine 我不知道有任何算法会采用原始时间序列并将它们聚类。 改进您的预处理和特征提取! 【参考方案1】:您能做的最好的事情是从您的时间序列中提取一些特征。 在您的案例中要提取的第一个特征是趋势linear trend estimation
您可以做的另一件事是对您的时间序列的累积版本进行聚类,就像在另一篇文章中建议和解释的那样:Time series distance metrics
【讨论】:
【参考方案2】:您可以使用 DTW 通过计算总最小距离来聚类趋势,请参阅 my answer here 了解另一个类似问题。我遇到了一个非常接近这个问题的问题,我最终为此部署了我自己的 python 包。详情请查看this。也可以看演示here。
【讨论】:
以上是关于在 Python 中对时间序列数据进行聚类的主要内容,如果未能解决你的问题,请参考以下文章
如何在 python 中对 14 列数据框中的 8 列进行 KMeans 聚类?
是否可以在 Python(Scikit-Learn)中对 KMeans 中的非浮点数据进行聚类?
你将如何在 python 的数组中对这三个区域进行分组/聚类?
如何使用 KNN /K-means 在数据框中对时间序列进行聚类