从频繁项集中挖掘关联规则
频繁项集有其量化定义,即它满足最小支持度要求。对于关联规则,也有类似的量化方法,这种量化指标称为可信度。一条规则P -> H的可信度定义为。
# 计算可信度
def calcConf(freqSet, H, supportData, brl, minConf = 0.7):
prunedH = []
for conseq in H:
# print('freqSet:', freqSet)
# print('conseq:', conseq)
conf = supportData[freqSet]/supportData[freqSet - conseq]
if conf >= minConf:
# print(freqSet - conseq, '-->', conseq, 'conf:', conf)
brl.append((freqSet - conseq, conseq, conf))
prunedH.append(conseq)
return prunedH
# 合并后计算可信度
def rulesFromConseq(freqSet, H, supportData, brl, minConf = 0.7):
m = len(H[0])
if len(freqSet) > (m + 1):
# 创建Hm+1条新候选规则
Hmp1 = aprioriGen(H, m + 1)
# print('Hmp1:', Hmp1)
Hmp1 = calcConf(freqSet, Hmp1, supportData, brl, minConf)
if len(Hmp1) > 1:
rulesFromConseq(freqSet, Hmp1, supportData, brl, minConf)
# 关联规则生成函数
def generateRules(L, supportData, minConf = 0.7):
bigRuleList = []
for i in range(1, len(L)): # 从包含两个或者更多元素的项集开始
for freqSet in L[I]:
H1 = [frozenset([item]) for item in freqSet]
# 如果频繁项集元素超过2,需要先合并
if i > 1:
rulesFromConseq(freqSet, H1, supportData, bigRuleList, minConf)
else:
calcConf(freqSet, H1, supportData, bigRuleList, minConf)
return bigRuleList
generateRules()
是主函数,调用另外两个函数calcConf()
和rulesFromConseq()
,分别用于对规则进行评估以及生成候选规则集合。
接下来,我们会先生成一个最小支持度为0.5的频繁项集,然后基于此项集,生成最小可信度为0.7的关联规则。
data = createData()
L, supportData = apriori(data, minSupport = 0.5)
rules = generateRules(L, supportData, minConf = 0.7)
后面的输出是我添加的print
语句。可以忽略。从中也可以看出一些关联规则生成的过程。
打印一下rules
,看一下生成的关联规则。
结果中给出三条规则:{1} -> {3}、{2} -> {5}、{5} -> {2}。可以看到,2和5可以互换,但1和3不行。
举个例子,你晚上有约,路过超市去买了个raincoat(小雨衣~),然后会顺便买口香糖(别问我为什么,我不知道,没买过- -),这就构成关联{raincoat} -> {口香糖}。但是买口香糖的时候,就不一定买raincoat了,可能是喜欢吃口香糖的single dog吧。所以反过来是不行的。(这个例子是我朋友提供的。至于他为什么知道。Emmm...)
另一种情况就是,周末想在家当肥宅,你去买了可乐,然后买了零食,构成关联{可乐} -> {零食},但你也可能是先买了零食,然后才想要去买可乐,所以这两者是可以互换的。
下面降低可信度阈值之后看一下结果:
小结
关联分析是用于发现大数据集中元素间有趣关系的一个工具集。有两种方式量化这些关系。一是使用频繁项集;二是关联规则,每条关联规则表示元素项之间“如果······那么”关系。
Apriori原理是说如果一个元素项是不频繁的,那么包含该元素的超集也是不频繁的。