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

对《机器学习实战》第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.csdn.net/questions/663985 ;https://stackoverflow.com/questions/53956461/creating-itemsets-in-apriori-algorithm?r=SearchResults但是都没有得到解答。国内的apriori算法博客倒是不少,可全是把书上内容照葫芦画瓢写下来,都没有人有这个疑问吗?失望。。。

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

你可能感兴趣的:(读书笔记,apriori,机器学习实战)