我有一个巨大的日志,其中包含用户所做的操作(例如,审核内容)。我想找到“大众”动作,这意味着动作太密集(用户可能在没有想太多的情况下做出这些动作:))。
这将转化为按日期(在线性空间中)对动作进行聚类,并标记过于密集的聚类。
我不是聚类算法和方法方面的专家,但我认为k-means 聚类无法解决问题,因为我不知道聚类的数量。此外,理想情况下,我还想“微调”算法。
你有什么建议?
PS 以下是我找到的一些资源(在 Ruby 中):
我有一个巨大的日志,其中包含用户所做的操作(例如,审核内容)。我想找到“大众”动作,这意味着动作太密集(用户可能在没有想太多的情况下做出这些动作:))。
这将转化为按日期(在线性空间中)对动作进行聚类,并标记过于密集的聚类。
我不是聚类算法和方法方面的专家,但我认为k-means 聚类无法解决问题,因为我不知道聚类的数量。此外,理想情况下,我还想“微调”算法。
你有什么建议?
PS 以下是我找到的一些资源(在 Ruby 中):
只要您对先验已知数量的集群感兴趣,K-means 可能会做得很好。既然您不这样做,您可能会考虑阅读有关LBG 算法的信息,该算法基于 k-means,用于矢量量化的数据压缩。它基本上是迭代 k 均值,它在质心收敛后分裂并不断分裂,直到达到可接受的集群数量。
另一方面,由于您的数据是一维的,您可以做一些完全不同的事情。
假设您的动作发生在 5 个时间点:(8、11、15、16、17)。让我们为这些动作中的每一个绘制一个高斯曲线,其中 μ 等于时间且 σ = 3。
现在让我们看看这些高斯值的总和是什么样子的。
它显示了在 16 左右达到峰值的动作密度。
基于这一观察,我提出了以下简单的算法。
请注意,对于每个动作,只有一小部分向量需要更新,因为高斯的值很快收敛到零。
您可以通过调整值来调整算法
请注意,该算法对于动作的数量是线性的。此外,并行化应该不难:将数据拆分到多个进程中,对高斯求和,然后对生成的向量求和。
看看基于密度的聚类。例如DBSCAN和 OPTICS。
这听起来正是您想要的。