一步步教你轻松学关联规则Apriori算法 (4)

5、比较候选项支持度计数与最小支持度minSupport,产生2维最大项目集L2:

项集 支持度计数
{l1,l3}   2  
{l2,l3}   2  
{l2,l5}   3  
{l3,l5}   2  

6、由L2产生候选项集C3:

项集
{l2,l3,l5}  

7、比较候选项支持度计数与最小支持度minSupport,产生3维最大项目集L3:

项集 支持度计数
{l2,l3,l5}   2  

算法终止。

从整体同样的能说明此过程

一步步教你轻松学关联规则Apriori算法

首先我们收集所有数据集(可以理解为商品清单),经过数据预处理后如Database TDB所示。我们扫描数据集,经过第一步对每个候选项进行支持度计数得到表C1,比较候选项支持度计数与最小支持度minSupport(假设最小支持度为2),产生1维最大项目集L1。再对L1进行组合产生候选项集C2。第二步我们对C2进行支持度计数,比较候选项支持度计数与最小支持度minSupport,产生2维最大项目集L2。由L2产生候选项集C3,对C3进行支持度计数,使用Apriori性质剪枝:频繁项集的所有子集必须是频繁的,对候选项C3,我们可以删除其子集为非频繁的选项,{A,B,C}的2项子集是{A,B},{A,C},{B,C},其中{A,B}不是L2的元素,所以删除这个选项;{A,C,E}的2项子集是{A,C},{A,E},{C,E},其中{A,E} 不是L2的元素,所以删除这个选项;{B,C,E}的2项子集是{B,C},{B,E},{C,E},它的所有2-项子集都是L2的元素,因此保留这个选项。这样,剪枝后得到{B,C,E},比较候选项支持度计数与最小支持度minSupport,产生3维最大项目集L3:继续进行没有满足条件,算法终止。

Apriori 算法实现

关联分析的目标包括两项:发现频繁项集和发现关联规则。Apriori算法是发现频繁项集的一种方法。 Apriori 算法的两个输入参数分别是最小支持度和数据集。该算法首先会生成所有单个物品的项集列表。接着扫描交易记录来查看哪些项集满足最小支持度要求,那些不满足最小支持度要求的集合会被去掉。然后对剩下来的集合进行组合以生成包含两个元素的项集。接下来再重新扫描交易记录,去掉不满足最小支持度的项集。该过程重复进行直到所有项集被去掉。

生成候选项集

下面会创建一个用于构建初始集合的函数,也会创建一个通过扫描数据集以寻找交易记录子集的函数, 数据扫描的伪代码如下:

- 对数据集中的每条交易记录 tran - 对每个候选项集 can - 检查一下 can 是否是 tran 的子集: 如果是则增加 can 的计数值 - 对每个候选项集 - 如果其支持度不低于最小值,则保留该项集 - 返回所有频繁项集列表 以下是一些辅助函数。 第一步加载数据集, # 加载数据集 def loadDataSet(): return [[1, 3, 4], [2, 3, 5], [1, 2, 3, 5], [2, 5]]

运行结果如下:

[[1, 3, 4], [2, 3, 5], [1, 2, 3, 5], [2, 5]] 第二步创建集合 C1。

对 dataSet 进行去重,排序,放入 list 中,然后转换所有的元素为 frozenset

'''创建集合C1即对dataSet去重排序''' def createC1(dataSet): C1 = [] for transaction in dataSet: for item in transaction: if not [item] in C1: C1.append([item]) C1.sort() # frozenset表示冻结的set 集合,元素无改变把它当字典的 key 来使用 return C1 # return map(frozenset, C1)

运行结果如下,注意map(frozenset, C1)在后面会用到,注意便于计数处理:

[[1], [2], [3], [4], [5]] 第三步计算候选数据集CK在数据集D中的支持度。 ''' 计算候选数据集CK在数据集D中的支持度,返回大于最小支持度的数据''' def scanD(D,Ck,minSupport): # ssCnt 临时存放所有候选项集和频率. ssCnt = {} for tid in D: # print('1:',tid) for can in map(frozenset,Ck): #每个候选项集can # print('2:',can.issubset(tid),can,tid) if can.issubset(tid): if not can in ssCnt: ssCnt[can] = 1 else: ssCnt[can] +=1 numItems = float(len(D)) # 所有项集数目 # 满足最小支持度的频繁项集 retList = [] # 满足最小支持度的频繁项集和频率 supportData = {} for key in ssCnt: support = ssCnt[key]/numItems #除以总的记录条数,即为其支持度 if support >= minSupport: retList.insert(0,key) #超过最小支持度的项集,将其记录下来。 supportData[key] = support return retList, supportData

运行结果如下:

满足最小支持度的频繁项集是: [frozenset({1}), frozenset({3}), frozenset({2}), frozenset({5})] 频繁项集的支持度 {frozenset({4}): 0.25, frozenset({5}): 0.75, frozenset({2}): 0.75, frozenset({3}): 0.75, frozenset({1}): 0.5} 第四步 根据上步Lk计算可能的候选项集 Ck ''' Apriori算法:输入频繁项集列表Lk,输出所有可能的候选项集 Ck''' def aprioriGen(Lk, k): retList = [] # 满足条件的频繁项集 lenLk = len(Lk) for i in range(lenLk): for j in range(i+1, lenLk): L1 = list(Lk[i])[: k-2] L2 = list(Lk[j])[: k-2] # print '-----i=', i, k-2, Lk, Lk[i], list(Lk[i])[: k-2] # print '-----j=', j, k-2, Lk, Lk[j], list(Lk[j])[: k-2] L1.sort() L2.sort() if L1 == L2: retList.append(Lk[i] | Lk[j]) return retList

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyszpj.html