【问题标题】:Clustering by date (by distance) in Ruby在 Ruby 中按日期(按距离)聚类
【发布时间】:2012-11-26 13:17:45
【问题描述】:

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

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

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

你有什么建议?

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

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

【问题讨论】:

    标签: ruby algorithm cluster-analysis


    【解决方案1】:
    只要您对先验已知数量的集群感兴趣,

    K-means 可能会做得很好。既然你不知道,你可能会考虑阅读LBG algorithm,它基于 k-means,用于矢量量化的数据压缩。它基本上是迭代 k-means,它在质心收敛后分裂并不断分裂,直到达到可接受的集群数量。

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

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

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

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

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

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

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

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

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

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

    【讨论】:

      【解决方案2】:

      了解基于密度的聚类。例如。 DBSCAN 和光学。

      这听起来正是你想要的。

      【讨论】:

        猜你喜欢
        • 2016-01-10
        • 2015-07-03
        • 1970-01-01
        • 1970-01-01
        • 2012-05-20
        • 1970-01-01
        • 1970-01-01
        • 2018-07-23
        • 2017-04-08
        相关资源
        最近更新 更多