2

我有一个巨大的日志,其中包含用户所做的操作(例如,审核内容)。我想找到“大众”动作,这意味着动作太密集(用户可能在没有想太多的情况下做出这些动作:))。

这将转化为按日期(在线性空间中)对动作进行聚类,并标记过于密集的聚类。

我不是聚类算法和方法方面的专家,但我认为k-means 聚类无法解决问题,因为我不知道聚类的数量。此外,理想情况下,我还想“微调”算法。

你有什么建议?

PS 以下是我找到的一些资源(在 Ruby 中):

  • hierclust - 一个简单的空间数据层次聚类库
  • AI4R - 实现一些聚类算法的库
4

2 回答 2

4

只要您对先验已知数量的集群感兴趣,K-means 可能会做得很好。既然您不这样做,您可能会考虑阅读有关LBG 算法的信息,该算法基于 k-means,用于矢量量化的数据压缩。它基本上是迭代 k 均值,它在质心收敛后分裂并不断分裂,直到达到可接受的集群数量。

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

假设您的动作发生在 5 个时间点:(8、11、15、16、17)。让我们为这些动作中的每一个绘制一个高斯曲线,其中 μ 等于时间且 σ = 3。

在此处输入图像描述

现在让我们看看这些高斯值的总和是什么样子的。

在此处输入图像描述

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

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

  1. 为感兴趣的时间范围创建一个零向量。
  2. 对于每个动作,计算高斯并将其添加到向量中。
  3. 扫描向量,寻找大于向量中最大值乘以 α 的值。

请注意,对于每个动作,只有一小部分向量需要更新,因为高斯的值很快收敛到零。

您可以通过调整值来调整算法

  1. α ∈ [0,1],表示必须注意活动峰值的重要性,
  2. σ,它影响被认为彼此接近的动作的距离,以及
  3. 每个向量元素的时间段(分钟、秒等)。

请注意,该算法对于动作的数量是线性的。此外,并行化应该不难:将数据拆分到多个进程中,对高斯求和,然后对生成的向量求和。

于 2012-12-08T15:44:53.017 回答
1

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

这听起来正是您想要的。

于 2012-12-09T07:52:32.093 回答