版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/love_image_xie/article/details/84666574
原理:
根据频繁项集找关联规则,如有一个频繁项集{豆奶,莴苣},那么可能有一条关联规则是豆奶->莴苣,即一个人购买了豆奶,则大可能他会购买莴苣,但反过来一个人购买了莴苣,不一定他会购买豆奶,频繁项集使用支持度量化,关联规则使用可信度或置信度量化。一条规则P->H的可信度定义为支持度(P|H)/支持度(P)。(注意:python中'|'表示并集,数学中'U'表示并集)
网络示意图:
该图为频繁项集{0,1,2,3}的关联规则网络示意图,阴影区域是第可信度的规则,如果发现0,1,2->3是低可信度的,则以3为后件的规则可信度也会低。因此,先从一个频繁项集出发(单个元素是没有关联规则的,因此从两个元素的频繁项集出发),创建一个规则列表,该规则右边只包含一个元素,然后对这些规则测试;然后合并所有规则创建新的关联列表,该规则右边包含两个元素,以此类推。
代码:
def generateRules(L,supportData,minConf=0.5):
bigRuleList=[]
for i in range(1,len(L)):
for freqSet in L[i]:
H1=[frozenset([item]) for item in freqSet] #H1是单个元素集合
if(i>1):
#pdb.set_trace()
rulesFromConseq(freqSet,H1,supportData,bigRuleList,minConf)
else:
calcConf(freqSet,H1,supportData,bigRuleList,minConf)
return bigRuleList
#对于两个元素的集合计算置信度
def calcConf(freqSet,H,supportData,br1,minConf=0.5): #freqSet频繁项集
prunedH=[]
for conseq in H:
conf=supportData[freqSet]/supportData[freqSet-conseq]
if conf>=minConf:
#pdb.set_trace()
print(freqSet-conseq,"-->",conseq,'conf: %3.f'%conf)
br1.append((freqSet-conseq,conseq,conf))
prunedH.append(conseq)
return prunedH
#对于多于两个元素的集合,先将元素分为两两结合的,然后对于两两结合的计算置信度
def rulesFromConseq(freqSet,H,supportData,br1,minConf=0.5):
m=len(H[0])
if(len(freqSet)>(m+1)):
Hmp1=aprioriGen(H,m+1)
Hmp1=calcConf(freqSet,Hmp1,supportData,br1,minConf)
if len(Hmp1)>1:
rulesFromConseq(freqSet, Hmp1, supportData, br1, minConf)