Apriori算法核心逻辑代码实现

9次阅读

共计 977 个字符,预计需要花费 3 分钟才能阅读完成。

概述
Apriori 算法是生成频繁集的一种算法。Apriori 原理有个重要假设,如果某个项集是频繁的,那么它的所有子集势必也是频繁的。如果一个项集是非频繁项集,那么它所对应的超集就全都是非频繁项集。

实现
从大规模数据集中寻找物品间的隐含关系被称作关联关系,而寻找物品间的不同组合是一项十分耗时的工作,所需计算代价很高,对于包含 N 种物品的数据集共有 2 的 n 次方 - 1 种项集组合,蛮力搜索并不能解决这个问题。
Apriori 能解决这个问题,Apriori 算法是生成频繁集的一种算法。Apriori 原理有个重要假设,如果某个项集是频繁的,那么它的所有子集势必也是频繁的。如果一个项集是非频繁项集,那么它所对应的超集就全都是非频繁项集。如果一个项集是非频繁项集,那么它所对应的超集就全都是非频繁项集,如何实现呢。

代码 (部分伪代码):
#L 指的是数据集 len L[1] 表示的是 {x} L2 表示的是 {x,y} 类似这种数据集,先构建 L1 , 在构建 L2, 一次类推,通过 while 循环实现
#Apriori 的原理体现在 scan 方法会将不满足可信度的数据集删掉,保留满足的,这样如果一个项集是非频繁项集,那么它所对应的超集就全都是非频繁项集。
#代码实现参考自机器学习实战
while (len(L[k-2]) > 0):
Lk, supK = scanD(x,y,z)
supportData.update(supK)
L.append(Lk)
k += 1
return L, supportData

#minSupport 最小支持度
#Ck 候选数据集列表
def scan(D, Ck, minSupport):
ssCnt = {}
#增加字典对应计数器
for tid in D:
for can in Ck:
if can.issubset(tid):
if not ssCnt.has_key(can): 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

正文完
 0