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

Posted

技术标签:

【中文标题】对时间序列事件进行聚类的不同聚类算法【英文标题】:Different clustering algorithms to cluster timeseries events 【发布时间】:2015-04-02 09:21:51 【问题描述】:

我有一个非常大的输入文件,格式如下:

ID \t time \t duration \t Description \t status

状态列仅限于包含小写 a,s,i 或大写 A,S,I 或两者的混合(状态列中的示例元素:a,si,I,asi,ASI,aSI ,阿西...)

最终目的是将在“足够接近”的时间开始和结束的事件聚集在一起,以便识别这些事件对更大的事件有贡献。这里足够接近可以由 theta 确定,假设现在是 1小时(或者可能是 2 小时或更长时间,等等)。如果两个事件的开始时间在 1 小时内,结束时间在 1 小时内,我们将它们聚集在一起并说它们是大事件的一部分。

另一件事是我只关心状态中所有小写字母的事件

所以下面是我的初始输入处理:

I filter the input file so that it only contains rows that have all lower case letters
This task is already done in Python using MapReduce and Hadoop

Then I take the output file and split it into "boxes" where each box represents a time range (ex: 11am-12pm - box1, 12pm-1pm - box2, 1pm-2pm - box 3, etc...)

Then use MapReduce again to sort each box based on start time (ascending order)

The final output is an ordered list of start time

现在我想开发一种算法,在上面的输出中将“相似事件”组合在一起。类似事件由开始和结束时间决定。

我目前的算法是:

pick the first item in the list

find any event in the list that has start time is within 1 hour with first event start time and duration is +/- 1 hour with first item duration (duration determines the end time). 

Then cluster them together (basically I want to cluster events that happen at the same time frame)

If no other event found, move to the next available event (the one that has not been clustered).

Keep doing this until no more events to be clustered.

我不确定我的算法是否有效或是否有效。我正在尝试做一个比 O (n^2) 更好的算法,所以层次聚类不起作用。 K-means 可能也不起作用,因为我不提前知道我需要多少个集群。

可能还有一些其他聚类算法可能更适合我的情况。我想我的算法中可能需要一些方程来计算集群中的距离以确定相似性。我对这个领域还很陌生,因此非常感谢任何能指引我走上正确道路的帮助。

非常感谢。

【问题讨论】:

也许以下链接可能会有所帮助(但无论如何都必须单独估计集群的数量)***.com/questions/7869609/… a: 10:10 - 10:30; b: 10:14 - 10:34; c: 10:18 - 10:38。你会把 a、b 和 c 聚集在一起吗? @AlexeyBirukov 根据我的算法,我会聚类 a 和 b,但不会聚类 c。为简单起见,我声明 theta = 5 分钟,但实际上它可能是 1 小时,如果更有意义的话,可能会更长。我想将相似的事件聚集在一起,以识别所有事件都发生在其中的大事件。 【参考方案1】:

您可以尝试DBSCAN 基于密度的聚类算法,该算法为 O(n log n)(仅在使用 kd-tree、ball-tree 等索引数据结构的情况下才保证,否则为 O(n^2) )。作为更大事件的一部分的事件应该在高密度区域。它似乎非常适合您的问题。

您可能需要实现自己的距离函数才能执行邻域查询(查找最近的事件)。 此外,最好以 POSIX 时间格式表示事件时间。

Here 就是一个例子。

根据您使用的环境,DBSCAN 实现采用 Java (ELKI)、Python (scikit-learn)、R (fpc)。

【讨论】:

@lurii 感谢您的建议。我仍然有点困惑,DBSCAN 是否需要一个距离函数,我必须根据我上面描述的算法来实现它?我对使用索引数据结构的 DBSCAN 还是很陌生,你能指出我可以在哪里了解更多信息吗?我打算用 Python 做这个项目。顺便说一句,我在查找 DBSCAN 时阅读了有关 OPTIC 的信息,在这种情况下,OPTIC 是否比 DBSCAN 更好? 需要注意的是,实现质量参差不齐。例如,fpc 版本非常慢。 ELKI 版本似乎是最快的。 (ELKI 也有 OPTICS,所以你可以尝试两者。)

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

层次聚类算法的原理及实现Hierarchical Clustering

时间序列聚类

聊聊聚类算法

凝聚型层次聚类算法对数据集进行分类时,如何对合并的新簇计算簇间距离?

聚类-层次聚类(谱系聚类)算法

机器学习——层次聚类算法