用于聚类时间序列事件的不同聚类算法

时间:2015-02-03 08:39:09

标签: algorithm cluster-analysis k-means hierarchical-clustering

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

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

状态列限制为包含小写字母a,s,i或大写字母A,S,I或两者的混合(状态col中的样本元素:a,si,I,asi,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可能也不起作用,因为我事先并不知道我需要多少个簇。

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

提前多多感谢。

1 个答案:

答案 0 :(得分:4)

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

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

Here就是一个例子。

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