Apriori算法的一般流程
(1)收集数据:可以使用任何方法收集数据
(2)准备数据:任何数据类型都可以,因为我们只保存集合
(3)分析数据: 使用任意方法
(4)训练算法:使用Apriori算法来找到频繁项
(5)测试算法:不需要测试过程
(6)使用算法:可以用于发现频繁项集以及物品之间的关联规则
数据集扫描的伪代码
对数据集中的每条交易记录tran
对每个候选相集can:
检查一下can是否是tran的子集:
如果是,则增加can的计数值:
对每个候选项集:
如果其支持度不低于最小值,则保留该项集
返回所有频繁项集列表
程序清单11-1 Apriori算法中的辅助函数
def loadDataSet():
return [[1,3,4], [2,3,5], [1,2,3,5], [2,5]]
"""
函数说明:生成大小为1的所有候选项集的集合C1
Parameters:
dataSet:数据集
Returns:
项集C1的列表
"""
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))
def scanD(D, Ck, minSupport):
"""
scanD(计算候选数据集 CK 在数据集 D 中的支持度,并返回支持度大于最小支持度 minSupport 的数据)
Args:
D 数据集
Ck 候选项集列表
minSupport 最小支持度
Returns:
retList 支持度大于 minSupport 的集合
supportData 候选项集支持度数据
"""
ssCnt = {
}
for tid in D:
for can in Ck:
if can.issubset(tid):
if can not 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
dataSet = loadDataSet()
dataSet
[[1, 3, 4], [2, 3, 5], [1, 2, 3, 5], [2, 5]]
C1=createC1(dataSet)
D = list(map(set,dataSet))
D
[{1, 3, 4}, {2, 3, 5}, {1, 2, 3, 5}, {2, 5}]
L1,suppData0 = scanD(D,C1,0.5)
L1
[frozenset({5}), frozenset({2}), frozenset({3}), frozenset({1})]
</