在Ruby中按日期(按距离)聚类

时间:2012-12-08 15:05:11

标签: ruby algorithm cluster-analysis

我有一个巨大的日记,其中包含用户完成的操作(例如,审核内容)。 我想找到'大众'动作,意思是行动过于密集(用户可能在不考虑太多的情况下做出这些动作:)。

这将转化为按日期(在线性空间中)聚类动作,以及标记太密集的聚类。

我不是聚类算法和方法的专家,但我认为k-means clustering不会起作用,因为我不知道聚类的数量。 另外,理想情况下,我还想“微调”算法。

你有什么建议?

P.S。以下是我发现的一些资源(在Ruby中):

  • hierclust - 一个用于空间数据的简单分层聚类库
  • AI4R - 实现某些聚类算法的库

2 个答案:

答案 0 :(得分:4)

只要您对先验已知数量的集群感兴趣,K-means可能会做得很好。既然你不这样做,你可以考虑阅读LBG algorithm,它基于k-means,用于数据压缩以进行矢量量化。它基本上是迭代的k-means,它们在收敛后分割质心并保持分裂,直到达到可接受数量的聚类。

另一方面,由于您的数据是一维的,您可以做一些完全不同的事情。

假设您已经在5个时间点采取了行动:(8,11,15,16,17)。让我们为每个动作绘制一个高斯,其中μ等于时间,σ= 3。

enter image description here

现在让我们看看这些高斯人的价值总和是怎样的。

enter image description here

它显示了一个峰值在16左右的动作密度。

基于这种观察,我提出了一个简单的算法。

  1. 为感兴趣的时间范围创建一个零向量。
  2. 对于每个动作,计算高斯并将其添加到向量。
  3. 扫描向量,查找大于向量中的最大值乘以α的值。
  4. 请注意,对于每个动作,只有一小部分向量需要更新,因为高斯的值会非常快地收敛到零。

    您可以通过调整

    的值来调整算法
    1. α∈[0,1],表示必须注意到活动高峰的重要程度,
    2. σ,它会影响被认为彼此接近的动作的距离,并且
    3. 每个向量元素的时间段(分钟,秒等)。
    4. 请注意,算法在操作数方面是线性的。此外,并行化并不困难:将数据分成多个进程,对高斯进行求和,然后对生成的向量求和。

答案 1 :(得分:1)

查看基于密度的聚类。例如。 DBSCAN和OPTICS。

这听起来就像你想要的那样。