在寻找频繁项集时,我们知道如果一个项集不满足最小支持度,这这个项集的所有超集都不满足最小支持度;在挖掘关联规则时,也有类似的属性:如果某条规则不满足最小置信度要求,那么该规则的所有子集也不会满足最小置信度要求;例如{A,B}->C这条规则不满足最小置信度,则support(A|B|C}/support(A|B){B,C}这条规则的置信度support{A|B|C}/support(A)也小于support(A|B));
def generateRules(L,supportData, minConf=0.7):
#L和supportData是上述apriori()产生的频繁项集和支持度
bigRuleList = []
for i in range(1, len(L)):
#从1而不是0开始是因为单个元素的集合不能产生规则,例如[[1],[2],[3]]之间并没有什么关联性
for freqSet in L[i]:
H1 = [frozenset([item])for item in freqSet]
#H1是出现在频繁项集集合中的所有元素,可以作为初始的只有一个元素的规则后件(即A->B中的B,如果是A->B|C,后续还需要合并)
if (i>1):
rulesFromConseq(freqSet, H1,supportData,bigRuleList,minConf)
else :
#项集中只有两个元素时,直接调用calcConf()函数
calcConf(freqSet, H1, supportData,bigRuleList, minConf)
return bigRuleList
calcConf()计算规则规则置信度:
def calcConf(freqSet, H, supportData, bigRuleList1, minConf=0.7):
prunedH =[]
for conseq in H :
conf = supportData[freqSet]/supportData[freqSet-conseq]
#参照公式:A->B_conf = support(A|B)/support(A)
if conf >= minConf:
print (freqSet - conseq, '-->', conseq, 'conf:',conf)
bigRuleList1.append((freqSet-conseq, conseq, conf))
prunedH.append(conseq)
return prunedH
def rulesFromConseq(freqSet, H, supportData, bigRuleList1, minConf=0.7):
#这里的H是generateRules()中产生的频繁项集集合中包含两个元素以上的集合元素H1,作为初始规则后件
m = len(H[0])
if (len(freqSet) > (m+1)):
#m+1是作为规则后件的元素个数,所以产生该规则的频繁项集中的集合元素个数肯定要大于规则后件的元素个数
Hmp1 = apriorigen(H, m+1) #利用apriorigen()来生成含有元素H的且含有m+1个元素的无重复集合
Hmp1 = calcConf(freqSet,Hmp1, supportData, bigRuleList1, minConf)
#然后调用calcConf()计算Hmp1能够满足最小支持度来做规则后件的元素
#如果Hmp1中有值存在,则递归调用
if (len(Hmp1)>1):
rulesFromConseq(freqSet, Hmp1, supportData, bigRuleList1, minConf)