《机器学习实战》使用apriori算法进行关联分析,源代码疑问

针对《机器学习实战》中Apriori算法实现存在的疑惑进行探讨,特别是关于如何正确生成候选频繁项集Ck的问题,以及集合顺序对结果的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对《机器学习实战》第11章的apriori算法实现时,发现书中不解之处:

# 入参Lk为频繁项集的list,k为要输出的频繁项集的元素个数
# 比如:[{0},{1},{2}],k=2作为输入,则输出{0,1},{0,2},{1,2}
def aprioriGen(Lk, k):
    retList = []
    lenLk = len(Lk)

    for i in range(lenLk):
        for j in range(i+1, lenLk):
            L1 = list(Lk[i])[:k-2]
            L2 = list(Lk[j])[:k-2]

            L1.sort()
            L2.sort()
            if L1 == L2:
                retList.append(Lk[i] | Lk[j])       
    return retList

这里作者说“当前k-2个项相同时,将两个集合合并”。用作者提供的数据集测试的时候,当k等于3的时候Lk等于[{2,3}, {3,5}, {2,5}, {1,3}]。这时候按照上述规则,生成的Ck就是[{2,3,5}]。那么{1,3,5},{1,2,3}就被筛掉了,为什么?

(我使用的是python3,作者使用的python2)

按理说,集合是无序的,那么按照作者的算法,前k-2个元素做list之后比较的结果肯定就会和集合里面元素顺序有关,进而会影响最终结果。在实践过程中,我是真真确确同一段代码多次执行得到了不同结果,原因就是因为集合内元素的次序问题。

有几个读者也遇到了这个问题:https://ask.youkuaiyun.com/questions/663985 ;https://stackoverflow.com/questions/53956461/creating-itemsets-in-apriori-algorithm?r=SearchResults但是都没有得到解答。国内的apriori算法博客倒是不少,可全是把书上内容照葫芦画瓢写下来,都没有人有这个疑问吗?失望。。。

只破不立不好,我倒是在另一位仁兄的文章里面Apriori算法找到了他自己实现的apriori算法,里面他将集合合并称为自连接,自连接的原则:如果两个k项集可以自连接,必须保证它们有k-1项是相同。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值