本文章内容:
- Apriori算法
- 频繁项集生成
- 关联规则生成
忠诚度计划是指顾客使用会员卡可以获得一定的折扣,利用这种计划,商店可以了解顾客所购买的商品。
关联关系(associate analysis)(关联规则学习association rule learning): 从大规模数据集中寻找物品间的隐含关系。
本博文:
- 首先讨论关联分析
- 然后讨论Apriori原理,Apriori算法正是基于该原理得到的。
- 接下来创建函数频繁项集高效发现的函数
- 然后从频繁集中抽取出关联规则。
11.1 关联分析
关联分析: 在大规模数据集中寻找有趣关系的任务。
存在两种关系的形式:
- 频繁项集(frequent item sets): 经常性出现在一块的物品的集合
- 关联规则(association rules):暗示物品间存在强关系。
一个项集的支持度(support):数据集中包含该项集的记录所占的比例。
可信度或置信度(confidence): 对其中75%的记录都适用。
支持度和可信度:用来量化关联分析是否成功的方法。
11.2Apriori 原理
11.3使用Apriori算法来发现频繁集
Apriori算法是发现频繁项集的一种方法。Apriori算法的两个输入参数分别是最小支持度和数 据集。该算法首先会生成所有单个物品的项集列表。接着扫描交易记录来查看哪些项集满足最小 支持度要求,那些不满足最小支持度的集合会被去掉。然后,对剩下来的集合进行组合以生成包 含两个元素的项集。接下来,再重新扫描交易记录,去掉不满足最小支持度的项集。该过程重复 进行直到所有项集都被去掉。
11.3.1 生成候选项集
'''
Author: Maxwell Pan
Date: 2022-04-30 17:53:48
LastEditTime: 2022-05-02 10:22:54
FilePath: \cp11\apriori.py
Description:
Software:VSCode,env:
'''
# 创建了用于测试的简单数据集
def loadDataSet():
return [[1, 3, 4],[2, 3, 5],[1, 2, 3, 5],[2, 5]]
def createC1(dataSet):
C1 = [] # C1是大小为1的所有候选项集的集合。
for transaction in dataSet:
for item in transaction:
if not [item] in C1:
C1.append([item])
C1.sort()
return map(frozenset,C1)
def scanD(D, Ck, minSupport):
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
11.3.2 组织完整的Apriori算法
'''
Author: Maxwell Pan
Date: 2022-04-30 17:53:48
LastEditTime: 2022-05-02 13:49:07
FilePath: \cp11\apriori.py
Description:
Software:VSCode,env:
'''
# 创建了用于测试的简单数据集
def loadDataSet():
return [[1, 3, 4],[2, 3, 5],[1, 2, 3, 5],[2, 5]]
def createC1(dataSet):
C1 = [] # C1是大小为1的所有候选项集的集合。
for transaction in dataSet:
for item in transaction:
if not [item] in C1:
C1.append([item])
C1.sort()
return list(map(frozenset,C1)) # use frozen set so we can use it as a key in a dict
def scanD(D, Ck, minSupport):
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
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
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
11.4 从频繁项集中挖掘关联规则
对于关联规则,我们也有类 似的量化方法,这种量化指标称为可信度。一条规则P ➞ H的可信度定义为support(P | H)/support(P)。记住,在Python中,操作符|表示集合的并操作,而数学上集合并的符号是 。 P | H是指所有出现在集合P或者集合H中的元素。