关联规则挖掘

来源:互联网 发布:软件项目问题清单 编辑:程序博客网 时间:2024/05/17 21:48

关联规则挖掘

关联规则反映事物之间的相互依存性和关联性。如果事物之间存在一定的关联,那么我们就可以通过一个事物去预测另一个事物。我们要挖掘大量数据中人们感兴趣的,有价值的信息,包括概念,规则,规律等。

关联规则:发现数据中的规律
- 超市中什么产品会⼀起购买? (组合推荐)
- 顾客在买了⼀台PC之后下⼀步会购买?(搭配推荐)
- 哪种DNA对这种药物敏感?
- 我们如何⾃动对Web⽂档进⾏分类?
- 论⽂查重?

关联规则的基本概念:

设I={i1, i2,…, im}为所有项目的集合, D为事务数据库, 事务T是⼀个项目⼦集(T⊆I)。 每⼀个事务具有唯⼀的事务标识TID。 设A是⼀个由项目构成的集合, 称为项集。 事务T包含项集A, 当且仅当A⊆T。 如果项集A中包含k个项目, 则称其为k项集。
项集A在事务数据库D中出现的次数占D中总事务的百分⽐叫做项集的⽀持度。 如果项集的⽀持度超过⽤户给定的最⼩⽀持度阈值, 就称该项集是频繁项集(或频集)。

关联规则是形如X⇒Y的逻辑蕴含式, 其中X⊂I, Y⊂I, 且X∩Y=∅
如果事务数据库D中有s%的事务包含X∪Y, 则称关联规则X⇒Y的⽀持度为s%
关联规则的信任度为support (X∪Y)/support (X)
也就是:
support (X⇒Y)=P (X ∪Y)
confidence (X⇒Y)=P (Y | X)

强关联规则:⽀持度和信任度分别满⾜⽤户给定阈值的规则。
例:
ID  购买的商品
2000 A,B,C
1000 A,C
4000 A,D
5000 B,E,F

设最⼩⽀持度为50%, 最⼩可信度为 50%, 则可得到
解:
如上有四个事物,其中有两个事物同时包含AC,则
support (A⇒C)=support (C⇒A)=P(A∪C)=2/4 * 100% = 50%
confidence(A⇒C) = P (C| A)=support (A∪C)/support (A)=2/3 * 100% = 66.6%
confidence(C⇒A) = P (A| C)=support (C∪A)/support (C)=2/2 * 100% = 100%
  A ⇒ C (50%, 66.6%)
C ⇒ A (50%, 100%)

关联规则挖掘算法:

Apriori算法:Apriori算法命名源于算法使⽤了频繁项集性质的先验(Prior) 知识。
Apriori算法将发现关联规则的过程分为两个步骤:
通过迭代, 检索出事务数据库中的所有频繁项集, 即⽀持度不低于⽤户设定的阈值的项集;
利⽤频繁项集构造出满⾜⽤户最⼩信任度的规则。
挖掘或识别出所有频繁项集是该算法的核⼼, 占整个计算量的⼤部分。

Apriori的性质:
性质1: 频繁项集的所有⾮空⼦集必为频繁项集。(频繁项集{a,b,c}的子集{a}在项目集中所占比例一定大于等于{a,b,c})
性质2: ⾮频繁项集的超集⼀定是⾮频繁的。(非频繁项集{a,b,c}的超集{a,b,c,d}在项目集中所占比例一定小于等于{a,b,c})

Apriori的步骤:
连接步: 为找Lk,通过将Lk-1与⾃⾝连接产⽣候选k项集的集合
剪枝步: Ck是Lk 的超集, 也就是说, Ck的成员可以是也可以不是频繁的, 但所有的频繁k项集都包含在Ck中。任何⾮频繁的(k-1) 项集都不是频繁k项集的⼦集。

伪代码:
L1={频繁1项集};
for(k=2;Lk-1≠∅;k++) do begin
Ck=apriori_gen(Lk-1); //新的候选频繁项集
for all transactions t∈D do begin //扫描计数
Ct=subset(Ck,t); //得到t的⼦集, 它们是候选
for all candidates c∈Ct do
c.count++;
end;
Lk={c∈Ck|c.count≥minsup}
end;
Answer= Uk Lk

例:
现有A、 B、 C、 D、 E五种商品的交易记录表, 试找出三种商品关联销售情况(k=3), 最小支持度=50%。
 交易号 商品代码
100 A C D
200 B C E
300 A B C E
400 B E

解:
K=1 时 C1
项集 支持度
{A} 50%
{B} 75%
{ C } 75%
{D} 25%
{E} 75%

去掉支持度小于50%的 得到L1
项集 支持度
{A} 50%
{B} 75%
{ C } 75%
{E} 75%

k=2时 C2
项集 支持度
{A,B} 25%
{A,C} 50%
{ A, E} 25%
{B,C} 50%
{B,E} 75%
{C,E} 50%

去掉支持度小于50%得到L2
项集 支持度
{A,C} 50%
{B,C} 50%
{B,E} 75%
{C,E} 50%

k=3时 从K2中求可用来计算的三项集
{A,C} +{B,C} {A,B,C}
{A,C} +{B,E} 超过三项
{A,C} +{C,E} {A,C, E}
{B,C} +{B,E} {B,C, E}
{B,C} +{C,E} {B,C, E}
{B,E} +{C,E} {B,C, E}

C3
{A,B,C} 25%
{A,C,,E} 25%
{B,C,E} 50%

所以L3 {B,C,E} 50%

Apriori算法的不⾜:
Ck中的项集是⽤来产⽣频集的候选集.
最后的频集Lk必须是Ck的⼀个⼦集。
Ck中的每个元素需在交易数据库中进⾏验证来决定其是否加⼊Lk
验证过程是性能瓶颈
交易数据库可能⾮常⼤
⽐如频集最多包含10个项, 那么就需要扫描交易数据库10遍
需要很⼤的I/O负载。

原创粉丝点击