关联分析——频繁项集的产生之Apriori算法
频繁项集的产生—Apriori算法
Apriori算法用于从数据集中提取频繁项集,以购物篮事务为例说明其过程:
提取频繁项集的过程如下:
Apriori算法的伪码如下:
Apriori算法的Python实现
给出数据集:
data = [[1, 3, 4], [2, 3, 5], [1, 2, 3, 5], [2, 5]]
提取1-项集
# 生成候选1-项集
def createC1(data):
c1 = []
for task in data:
for item in task:
if [item] not in c1:
c1.append([item])
# 排序是因为之后生产频繁k-项集是采用F(k-1)*F(k-1)方法
c1.sort()
# frozenset()返回一个冻结的集合,冻结后集合不能再添加或删除任何元素。
return list(map(frozenset, c1))
# 候选1-项集的结果如下
c1 = createC1(data)
c1
[frozenset({
1}),
frozenset({
2}),
frozenset({
3}),
frozenset({
4}),
frozenset({
5})]
提取频繁k-项集
基于支持度的剪枝原理可用下图表示:
其原理在于如果一个项集是频繁的,则它的所有子集一定也是频繁的。根据逆否命题可得:如果一个项集的某个子集是非频繁的,则该项集一定是非频繁的。
# 提取频繁k-项集
def scanData(data, C_k, minSupport):
# 记录候选k-项集中项的支持度计数
ssCnt = {
}
for task in data:
for can in C_k:
if can.issubset(task):
ssCnt[can] = ssCnt.get(can, 0) + 1
# 根据最小支持度计数提取频繁项集
retlist = []
F_k = {
}
for key in ssCnt:
support = ssCnt[key] / len(data)
if support >= minSupport:
retlist.insert(0, key)
F_k[key] = support
return retlist, F_k
# F1_l记录频繁1-项集
# F_1记录频繁1-项集中各项集的支持度
F1_l, F_1 = scanData(data, c1, 0.5)
print(F1_l)
[frozenset({
5}), frozenset({
2}), fro