tg1671028
tg1671028
采纳率25%
2017-10-20 12:01

对于《机器学习实战》Apriori源码的疑问

源码参考:
http://blog.csdn.net/namelessml/article/details/52718628
我有疑问的代码如下:

 # 创建候选项集Ck
# Lk,频繁项集列表
# k,项集元素的个数
def aprioriGen(Lk, k) : # create Ck
    # 创建一个空列表
    retList = []
    # 计算Lk中的元素
    lenLk = len(Lk)
    for i in range(lenLk) :
        for j in range(i+1, lenLk) :
            # 当前k-2个项相同时,将两个集合合并
            L1 = list(Lk[i])[:k-2]
            L2 = list(Lk[j])[:k-2]
            L1.sort()
            L2.sort()
            if L1==L2 :
                # python中集合的并操作对应的操作符为|
                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}就被筛掉了,为什么?难道不应该是[{2,3,5},{1,3,5}]吗?

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

4条回答

  • donyzh donyzh 4年前

    经过研究,有了新的答案,先按照代码规则,{1,3,,5}可以出现在合并后的集合中,但是{1,3,5}需有{1,3}和{1,5}两个二项频繁项集合并而成。但是,{1,5}并没有
    出现在二项频繁项集中,说明{1,5}并非频繁项集。然后,根据Apriori原理,说如果某个项集是频繁的,那么它的所有子集也是频繁的。其逆否命题则为
    (这是重点啊,说三遍,重点,重点,重点):
    某个子项集不是频繁的,那么它的超集也不是频繁的。
    所以,根据apriori算法,楼主的超集{1,3,5}直接被筛掉了。
    望采纳!

    点赞 评论 复制链接分享
  • donyzh donyzh 4年前

    我有完全相同的疑问,楼主有答案了麻烦告知一声,共同学习、共同进步,先谢过了!

    点赞 评论 复制链接分享
  • zyxingzou zyxingzou 2年前

    图片说明

    点赞 评论 复制链接分享
  • weixin_35335605 IMDale 2年前

    同样遇到这个问题,百思不得其解。既然是frozenset,是集合,就是无序的。那么按照源代码的逻辑,集合每次的排序都不固定,list转化之后取前k-2个元素就不会得到固定结果。
    使用['A','B'], ['B','C','D','E'], ['A','C','D','F'], ['B','A','C','D'], ['B','A','C','F'] 5组数据测试,k=3。python3版本。发现aprioriGen函数每次
    输出结果不同,完全就是跟集合内元素顺序有关。。。不知道是python版本问题还是说原书真的有bug。https://stackoverflow.com/questions/53956461/creating-itemsets-in-apriori-algorithm?r=SearchResults 这个人也遇到了。。。题外话,国内各种写博客的人,就是把书誊写一遍,太失望了。

    点赞 评论 复制链接分享