7

假设我有如下所述的数据。

11AM user1刷机

上午 11:05 用户 1 准备早餐

11:10 AM user1 吃早餐

上午 11:15 用户 1 洗澡

上午 11:30 用户 1 离开办公室

12PM user2刷机

12:05PM user2 准备早餐

12:10 PM user2 吃早餐

12:15 PM user2 洗澡

12:30 PM user2 离开办公室

11AM user3 洗澡

上午 11:05 用户 3 准备早餐

11:10AM user3刷机

11:15AM user3 吃早餐

上午 11:30 用户 3 离开办公室

12PM 用户4 洗澡

12:05PM user4 准备早餐

12:10PM user4刷机

12:15 PM user4 吃早餐

12:30 PM user4 离开办公室

这些数据告诉我不同​​人的日常生活。从这些数据看来,user1 和 user2 的行为相似(尽管它们执行活动的时间有所不同,但它们遵循相同的顺序)。出于同样的原因,User3 和 User4 的行为相似。现在我必须将这些用户分组到不同的组中。在此示例中,group1- user1 和 USer2 ... 后跟 group2,包括 user3 和 user4

我应该如何处理这种情况。我正在尝试学习数据挖掘,这是一个我认为是数据挖掘问题的例子。我正在尝试找到解决方案的方法,但我想不出一个。我相信这些数据中有规律。但我无法想到可以揭示它的方法。此外,我必须将这种方法映射到我拥有的数据集上,该数据集非常庞大但与此类似:) 数据是关于一次记录事件发生的日志。我想找到代表类似事件序列的组。

任何指针将不胜感激。

4

2 回答 2

2

它看起来像是关联挖掘之上的聚类,更准确地说是Apriori算法。像这样的东西:

  1. 挖掘动作之间所有可能的关联,即序列布什 -> 准备早餐,准备早餐 -> 吃早餐,...,布什 -> 准备早餐 -> 吃早餐等。你可以找到每对、三胞胎、四胞胎等在您的数据中。
  2. 从每个这样的序列中创建单独的属性。为了获得更好的性能,为对属性添加 2 的提升,为三胞胎添加 3 等等。
  3. 此时你必须有一个属性向量和相应的提升向量。您可以为每个用户计算特征向量:如果该序列存在于用户操作中,则在向量中的每个位置设置 1 * boost,否则设置为 0)。您将获得每个用户的矢量表示。
  4. 在此向量上使用更适合您需求的聚类算法。每个找到的类都是您使用的组。

例子:

让我们将所有动作标记为字母:

a - 刷子
b - 准备早餐
c - 东早餐
d - 洗澡
...

你的属性看起来像

a1: a->b
a2: a->c
a3: a->d
...
a10: b->a
a11: b->c
a12: b->d
...
a30: a->b-> c->d
a31: a->b->d->c
...

在这种情况下,用户特征向量将是:

attributes   = a1, a2, a3, a4, ..., a10, a11, a12, ..., a30, a31, ...
user1        =  1,  0,  0,  0, ...,   0,   1,   0, ...,   4,   0, ...
user2        =  1,  0,  0,  0, ...,   0,   1,   0, ...,   4,   0, ...
user3        =  0,  0,  0,  0, ...,   0,   0,   0, ...,   0,   0, ...

为了比较 2 个用户,需要一些距离测量。最简单的是余弦距离,即两个特征向量之间的余弦值。如果 2 个用户具有完全相同的动作序列,他们的相似度将等于 1。如果他们没有共同点 - 他们的相似度将为 0。

使用距离测量使用聚类算法(例如k-means)来创建用户组。

于 2011-09-30T20:43:04.427 回答
0

使用另一个答案中提出的像 Apriori 这样的项集挖掘算法并不是最佳解决方案,因为 Apriori 不考虑时间或顺序。因此,它需要做一个额外的预处理步骤来考虑排序。

更好的解决方案是直接使用顺序模式挖掘算法,如 PrefixSpan、SPADE 或 CM-SPADE。顺序模式挖掘算法将直接找到在一组序列中经常出现的子序列。

然后您仍然可以对找到的顺序模式应用聚类!

于 2015-04-11T22:22:09.320 回答