《Machine Learning in Action》Chapter 11 Apriori(勘误)

本章除了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)

以上内容若有不足之处,欢迎各位读者指正,谢谢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值