按访问时间戳进行聚类

时间:2017-02-16 03:26:49

标签: logging apache-spark machine-learning usage-statistics

假设我们有以下网络访问日志。

timestamp                  page_visted
======================================
2017-01-02 10:00:02         /xxx/a.html
2017-01-02 10:00:06         /xxx/b.html
2017-01-02 10:01:03         /xxx/c.html
2017-01-02 10:02:02         /xxx/d.html
2017-01-02 15:00:02         /xxx/a.html
2017-01-02 15:01:10         /xxx/b.html
2017-01-02 15:03:05         /xxx/c.html

用户访问了我们的网站2次,访问了7页。我的问题是“了解他访问我们网站的次数而不是访问了多少页的最佳方式是什么?”

由于用户可能访问不同数量的页面并为每次访问花费不同的时间,因此很难设置固定的数字或间隔来对这些记录进行分组。是否有任何算法可以根据时间戳对这些记录进行分组(聚类)?感谢。

1 个答案:

答案 0 :(得分:0)

会话开始/结束

一个简单的方法就是选择一个表示会话已结束的数字,我已经看到20分钟的不活动用于显示会话已结束。

更强大的方法是将此视为probabilistic problem,因为会话没有固定长度,或者会话之间有固定的时间。

您需要做的第一件事就是查看数据。特别是到达时间。您有一个page_visited事件列表。您需要以秒为单位绘制到达间隔时间的分布(在页面访问之间经过的时间)。

一个公平的假设是,如果会话间时间确实是聚类的,那么分布将看起来Poisson-like,或者它将是类似泊松但additional humps

如果数据显示不错的Poisson distribution,一种简单的方法是直接使用访问时间的分布。

通过从到达时间的分布中获取适合您的用例的percentile,您可以确定一个非常有用的阈值,超过该阈值,到达时间间隔表明新会话已经开始。< / p>

或者,如果它更有用,您可以使用该分布来获得观察到达间隔时间的概率,其中低概率表示新会话的开始/结束。

更复杂的是,如果分布是双模式的,比如说,因为人们倾向于以类似方式分配会话。如果是这样,可以更简单地探索一个简单的聚类算法,例如k-means,在到达时间间隔,你期望一个集群用于会话内访问,一个集群用于会话间访问。

计算会话次数

一旦您找到了识别不同会话的适当方法,就可以通过用户分组为每个会话分配唯一​​密钥并计算唯一密钥。