【问题标题】:Clustering by date (by distance) in Ruby在 Ruby 中按日期(按距离)聚类
【发布时间】:2012-11-26 13:17:45
【问题描述】:
我有一个巨大的日志,其中包含用户执行的操作(例如,审核内容)。
我想找到“大众”动作,即过于密集的动作(用户可能在没有想太多的情况下做出这些动作:))。
这将转化为按日期对动作进行聚类(在线性空间中),并标记过于密集的聚类。
我不是聚类算法和方法方面的专家,但我认为k-means clustering 不会成功,因为我不知道聚类的数量。
此外,理想情况下,我还想“微调”算法。
你有什么建议?
附:以下是我找到的一些资源(在 Ruby 中):
【问题讨论】:
标签:
ruby
algorithm
cluster-analysis
【解决方案1】:
只要您对
先验已知数量的集群感兴趣,
K-means 可能会做得很好。既然你不知道,你可能会考虑阅读LBG algorithm,它基于 k-means,用于矢量量化的数据压缩。它基本上是迭代 k-means,它在质心收敛后分裂并不断分裂,直到达到可接受的集群数量。
另一方面,由于您的数据是一维的,您可以做一些完全不同的事情。
假设您的动作发生在 5 个时间点:(8、11、15、16、17)。让我们为这些动作中的每一个绘制一个高斯曲线,其中 μ 等于时间,σ = 3。
现在让我们看看这些高斯值的总和是什么样子的。
它显示了在 16 左右达到峰值的动作密度。
基于这一观察,我提出了以下简单算法。
- 为感兴趣的时间范围创建一个零向量。
- 为每个动作计算高斯并将其添加到向量中。
- 扫描向量,寻找大于向量中最大值乘以 α 的值。
请注意,对于每个动作,只有一小部分向量需要更新,因为高斯的值会很快收敛到零。
您可以通过调整值来调整算法
- α ∈ [0,1],表示必须注意活动峰值的重要性,
- σ,影响被认为彼此靠近的动作的距离,以及
- 每个向量元素的时间段(分钟、秒等)。
请注意,该算法与动作数量呈线性关系。此外,并行化应该不难:将数据拆分到多个进程中,对高斯求和,然后对生成的向量求和。
【解决方案2】:
了解基于密度的聚类。例如。 DBSCAN 和光学。
这听起来正是你想要的。