1. 什么是Apriori算法
Apriori算法是一种用于在大规模数据集中查找频繁项集的算法。频繁项集指的是在数据集中经常出现的集合。Apriori算法的核心思想是基于数据集中的频繁项集性质,通过连接操作产生候选项集,再通过剪枝操作去掉不满足支持度要求的项集,最终得到全部满足要求的频繁项集。
2. Apriori算法流程
2.1 数据集预处理
在使用Apriori算法之前,需要对数据集进行预处理,保证数据集的格式符合算法的要求。通常需要将数据集转化为二进制形式,以便对项集进行操作。
数据集样例:
dataset = [['A', 'B', 'C'], ['A', 'C'], ['B', 'D'], ['A', 'B', 'C', 'D'], ['B', 'D']]
数据集处理:
def createC1(dataset):
C1 = []
for transaction in dataset:
for item in transaction:
if not [item] in C1:
C1.append([item])
C1.sort()
return list(map(frozenset, C1))
2.2 构建初始的频繁项集
在初始阶段,需要构建包含所有单个项的频繁项集,即C1,然后根据支持度对C1进行筛选,得到L1。
C1样例:
C1 = createC1(dataset)
L1样例:
def scanD(D, Ck, minSupport):
ssCnt = {}
for tid in D:
for can in Ck:
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
L1, supportData = scanD(dataset, C1, minSupport)
2.3 基于初始频繁项集生成更多的频繁项集
在这一步骤中,需要根据L1生成包含两个项的候选项集C2,再通过剪枝操作得到L2,以此类推,直到无法生成更多的频繁项集。
C2样例:
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]
L1.sort()
L2.sort()
if L1 == L2:
retList.append(Lk[i] | Lk[j])
return retList
C2 = aprioriGen(L1, 2)
L2样例:
L2, supportData = scanD(dataset, C2, minSupport)
3. Apriori算法实现
下面是完整的Apriori算法实现代码:
def apriori(dataset, minSupport=0.5):
C1 = createC1(dataset)
D = list(map(set, dataset))
L1, supportData = scanD(D, C1, minSupport)
L = [L1]
k = 2
while len(L[k - 2]) > 0:
Ck = aprioriGen(L[k - 2], k)
Lk, supK = scanD(D, Ck, minSupport)
supportData.update(supK)
L.append(Lk)
k += 1
return L, supportData
L, supportData = apriori(dataset, minSupport=0.5)
通过调用apriori函数,可以得到频繁项集L和支持度信息supportData。
4. 结论
Apriori算法是一种常用的关联规则挖掘算法,通过遍历数据集进行频繁项集的搜索,旨在找到经常同时出现的项集。通过合理设置支持度阈值,可以得到满足要求的频繁项集。
Apriori算法的优点是简单易懂,实现较为直观。但随着数据集的增大,算法的性能会受到较大影响。为了提高算法的运行效率,可以采用优化策略,如改进Apriori算法的剪枝操作和对候选项集的排序等。
总之,Apriori算法是一种重要的数据挖掘算法,对于挖掘大规模数据中的关联关系具有重要的应用价值。