2011-09-30 135 views
7

假设我有如下所述的数据。数据挖掘情况

上午11时user1的刷

11:05 AM user1的准备Brakfast

11:10 AM USER1吃早餐

11:15 AM USER1洗浴

11:30为user1办公室

离开

12PM user2 Brush

1 2:05 PM user2的准备Brakfast

12:10 PM user2的吃早餐

12:15 PM user2的洗浴

12:30 PM user2的离开办公室

11AM用户3洗浴

11 :05AM user3 Prep Brakfast

11:10 AM user3 Brush

11:15 AM用户3吃早餐办公

11:30 AM用户3离开

12PM USER4洗浴

12:05 PM USER4准备Brakfast

12:10 PM USER4刷

12:15 PM user4吃早餐

12:30 PM user4离职

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

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

任何指针,将不胜感激。

回答

2

它看起来像上的顶部关联挖掘,更确切地说Apriori算法集群。事情是这样的:

  1. 矿行为之间的所有可能的关联,即序列布什 - >准备早餐,准备早餐 - >吃早饭,...,布什 - >准备早餐 - >吃早饭,等每对,三元组,四元组等,你可以在你的数据中找到。
  2. 从每个这样的序列中分离出属性。为了获得更好的性能,对pair属性添加2,对三元组添加3,等等。
  3. 在这一刻你必须有一个属性向量与相应的助推向量。您可以计算每个用户的特征向量:如果该序列存在于用户操作中,则在矢量中的每个位置设置1 * boost,否则为0)。您将获得每个用户的矢量表示。
  4. 在此向量上使用更适合您的需求的聚类算法。每个找到的类都是您使用的组。

例子:

让我们纪念所有行动字母:

一个 - 刷
b - 准备早餐
Ç - 东早餐
d - 洗浴
.. 。

您的属性将看起来像

A1:A-> B
A2:A->Ç
A3:A-> d
...
A10:B-> A
A11:B-> ç
A12:B-> d
...
A30:A-> B-> C-> d
A31:A-> B-> D->ç
...

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

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个用户需要某种距离量度。最简单的是cosine distance,这就是2个特征向量之间的余弦值。如果2个用户具有完全相同的动作序列,则它们的相似性将等于1.如果它们没有共同之处 - 它们的相似性将为0.

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

+0

谢谢..我想我得到了你所解释的。按照您解释的方式进行聚类应该是一个好主意。我会努力的。非常感谢你的帮助:) – user722856

0

因为Apriori没有考虑时间或顺序排序,所以使用像Apriori这样的项目集挖掘算法并不是最好的解决方案。因此,它需要执行额外的预处理步骤来考虑订购。

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

然后你仍然可以在找到的顺序模式上应用聚类。