数据挖掘学习------------------2-关联规则-2-Apriori算法

2.2Apriori算法

关联规则的挖掘分为两步:

①找出所有的频繁项集。其总体性能由第一步决定。在搜索频繁项集时,最简单的是Apriori算法。

②由频繁项集产生强关联规则。

1)、基本思想

①Apriori算法的名字基于一个事实:算法使用频繁项集性质的先验知识。

②Apriori算法使用一种称作逐层搜索的迭代方法,k-项集用于探索(k+1)-项集。

(1)基本知识:

③首先通过扫描数据库,累积每个项的计数,并收集满足最小支持度的项,找出1-项集的集合。该集合记作L1。

④L1用于找频繁2-项集的集合L2,L2用于找L3。。。。。

⑤直到不能再找到频繁k-项集。

⑥最后再找Lk需要再一次数据库全扫描。

(2)综上,Apriori算法思想有两步:连接步和剪枝步。

(1、连接步:

①为了找出Lk ( 频繁k-项集 ),通过L(k-1)与自身连接,产生候选k-项集,记作Ck;

②其中L(k-1)的元素是可连接的。

(2、剪枝步:

①Ck是Lk的超集,即它的成员可以是也可以不是频繁的,但所有的频繁项集都包含在Ck中。

②扫描数据库,确定Ck中每个候选的计数,从而确定Lk(计数值不小于最小支持度计数的所有候选是频繁的,从而属于Lk)。

③Ck可能很大,这样涉及的计算量很大,为了压缩Ck,就要使用Apriori性质:任何非频繁的(k-1)-项集都不可能是频繁k-项集的子集(这个很重要,用于剪枝)。

④因此,如果一个候选k-项集的(k-1)-项集不在Lk中,则该候选项也不可能是频繁的,从而可以Ck中删除。

⑤这样子集测试可以使用所有频繁项集的散列树快速完成。

(3)优缺点:

①优点:算法思路简单,以递归为基础,生成频繁项集,易于实现 。       

②缺点:连接步骤需要大量的比较(在后面实例中会更加明白这一点)。

2)、算法步骤

①扫描全部数据,产生候选1-项集的集合C1。

②根据最小支持度,由C1产生频繁1-项集的集合L1。

③对k > 1,重复执行步骤 ④ ⑤ ⑥。

④由Lk执行连接和剪枝操作,产生候选(k+1)-项集的集合C(k+1)。

⑤根据最小支持度,由候选(k+1)-项集的集合C(k+1),产生频繁(k+1)-项集的集合L(k+1)。

⑥若L不为空集,则 k = k+1,跳往步骤 ④,否则到⑦

⑦根据最小置信度,由频繁项集产生强关联规则,结束。

3)、实例

商店的9笔交易,即 |D| = 9;设min_sup = 2

数据库事物列表事例
事物商品ID的列表
T11,2,5

T2

2,4
T32,3
T41,2,4
T51,3
T62,3
T71,3
T81,2,3,5
T91,2,3

(1)第一次扫描

候选项集C1
项集支持度计数
{1}6
{2}7
{3}6
{4}2
{5}2

 

① 由候选项集  比较   候选支持计数  与   最小支持度计数   得到  频繁项集

②由于min_sup = 2,没有删除一项

频繁项集L1
项集支持度计数
{1}6
{2}7
{3}6
{4}2
{5}2

(2)第二次扫描

连接 L2 = L1∞L1(相互握手)产生候选2-项集 C2,因为没有剪枝,所以直接列出来了。

候选项集C2
项集支持度
{1,2,}4
{1,3}4
{1,4}1
{1,5}2
{2,3}4
{2,4}2
{2,5}2
{3,4}0
{3,5}1
{4,5}0

进过和第一步一样的比较大于 min_sup = 2,得到的L2

频繁项集L2
项集支持度计数
{1,2}4
{1,3}4
{1,5}2
{2,3}4
{2,4}2
{2,5}2

(3)第三次扫描

①连接步:C3 = L2 ∞ L2 ={{1,2,3},{1,2,5},{1,3,5,},{2,3,4},{2,3,5},{2,4,5}}

②剪枝步:根据Apriori剪枝属性:频繁项集的所有非空子集也是频繁的。

例如:{1,3,5}的2-项的子集为{1,3},{1,5},{3,5}。但{3,5}不是L2的元素,即它是不频繁的,因此用C3中删去{1,3,5}。以此类推,进行检验。

候选项集C3
项集支持度计数
{1,2,3}2
{1,2,5}2

与 min_sup = 比较,得L3

频繁项集L3
项集支持度计数
{1,2,3}2
{1,2,5}2

(4)第四次扫描

①连接步:C4 = L3 ∞ L3 ={{1,2,3,5}} 

②剪枝步:由于C4的子集{2,3,5}不在L3中,所有该项删除

这样C4 =  Φ ,算法终值,找出了所有的频繁项集。

4)、程序实现(matlab)

(1)数据库

将上面的事物列表转化成为事务矩阵,对于每个事务中含有的物品标记为1,没有的标记为0

事务
 物品1物2物3物4物5
T111001
T201010
T301100
T411010
T510100
T601100
T710100
T811101
T911100

(2)程序实现

(1、读数据代码

参数:

data:表数据,apriori()函数:apriori算法,第一个参数数据,第二个参数最小支持度

(2、apriori()函数代码

参数:

D:数据,min_sup:最小支持度,L:频繁项集和支持度,A:频繁项集,init()函数:对数据集进行初始化。k:第k-频繁项集,A:第k-1次频繁项集,apriori_gen()函数:产生候选项集Ck,C:候选项集,M:带支持度的候选项集,get_k_itemset()函数:产生k-项频繁项集

(3、初始化init()函数代码

参数:

n:列数,size()函数:矩阵行、列大小函数,eye()函数:返回n*n的矩阵,则A = n*n矩阵,sum():求和函数,上面的是列求和,则B矩阵就是实例中候选项集C1的支持度,A ( i , : ):取A矩阵的第 i 行的所有列,[A  B']:B先转置,然后和A拼接,此时L:含有项集和支持度计数。

(4、apriori_gen()函数代码

参数:

zeros()函数:生成m*n的零矩阵,该处是一列n行的零矩阵。A:为初始化中的A = n*n矩阵。

(5、get_k_itemset()函数的代码

     

(6、isExit()函数代码

(3)结果

频繁项集的0-1映射矩阵

前5列表示商品1,2,3,4,5,第六列表示支持度计数

该结果与实例中的频繁项集和支持度计数一样

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值