本章除了python版本不兼容问题外,原书的代码在关联规则生成部分,也有很大的问题。
首先给出一个频繁项集{0,1,2,3}的关联规则生成图:
因为第一层没有用,排除第一层后,其他各层规则的右端项个数为1~3,假设频繁项集有n个项,那么规则右端的项个数为1至n-1。
下面看原书的代码:
def rulesFromConseq(freqSet, H, supportData, brl, minConf=0.7):
m = len(H[0])
if (len(freqSet) > (m + 1)): #try further merging
Hmp1 = aprioriGen(H, m+1)#create Hm+1 new candidates
Hmp1 = calcConf(freqSet, Hmp1, supportData, brl, minConf)
if (len(Hmp1) > 1): #need at least two sets to merge
rulesFromConseq(freqSet, Hmp1, supportData, brl, minConf)
freqSet是频繁项集,假设项数是n,H是规则的右端,可能包含1至n-1个项。
程序的执行顺序是先合并,再计算,但是这样会漏掉一部分规则,即规则右端项数为1的情况。
因此正确的执行顺序是先计算可信度,在可信度的基础上,合并可信规则的右端,再递归调用,计算规则的可信度。
如果n=5,m=4,那么按照第一张图,是可以计算可信度的。但是此时代码的第一个if判断条件不成立,因此需要改为>=。
修改完之后的程序,第一个if判断就可以判断递归过程的终止了,因此第二个if条件也就么有用了。
正确的代码应该是:
# 从序列中提取规则
def rules_from_consequence(freq_item, H, support_data, big_rules_list, min_conf=0.5):
m = len(H[0])
if len(freq_item) >= (m+1):
hmp1 = calculate_conf(freq_item, H, support_data, big_rules_list, min_conf)
hmp1 = apriori_gen(hmp1, m - 1)
# 此处m-1与原书不一致,是因为作者修改了自己的apriori_gen函数,读者可根据自己的情况修改
rules_from_consequence(freq_item, hmp1, support_data, big_rules_list, min_conf)
以上内容若有不足之处,欢迎各位读者指正,谢谢!