Educoder-基于遍历的支持度计算Apriori算法

任务描述

本关任务:编写一个能实现基于遍历的支持度计算的小程序。

相关知识

为了完成本关任务,你需要掌握:1.基于遍历的支持度计算,2.基于遍历的支持度计算代码实现。

基于遍历的支持度计算

经过候选生成与候选剪枝我们利用频繁 k 项集 Lk​ 得到了候选 k+1 项集 Ck+1​ ,接下来我们通过计算 Ck+1​ 中各项集支持度,确定 Lk+1​ 。 支持度计算公式:

常见的做法就是遍历数据集,检查候选项集中的每一项是否出现在数据集的事物当中。计算出各项支持度以后,人为设定一个最小支持度,当候选项集中某一项支持度大于等于最小支持度就添加到频繁项集中。

基于遍历的支持度计算函数如下:

其中 data_set 为数据集,ck 为候选 k 项集,min_support为最小支持度, support_data 为各项的支持度记录字典。遍历数据集for循环中检查候选集ck中的每一项是否出现在事务t中请同学自行完成。

编程要求

根据提示,在右侧编辑器补充代码,使用遍历计算支持度。

测试说明

平台会对你编写的代码进行测试:

预期输出:6


class Apriori():
    def create_c1(self, dataset):  # 遍历整个数据集生成c1候选集
        c1 = set()
        for i in dataset:
            for j in i:
                item = frozenset([j])
                c1.add(item)
        return c1

    def create_ck(self, Lk_1, size):  # 通过频繁项集Lk-1创建ck候选项集
        Ck = set()
        l = len(Lk_1)
        lk_list = list(Lk_1)
        for i in range(l):
            for j in range(i + 1, l):  # 两次遍历Lk-1,找出前n-1个元素相同的项
                l1 = list(lk_list[i])
                l2 = list(lk_list[j])
                l1.sort()
                l2.sort()
                if l1[0:size - 2] == l2[0:size - 2]:  # 只有最后一项不同时,生成下一候选项
                    Ck_item = lk_list[i] | lk_list[j]
                    if self.has_infrequent_subset(Ck_item, Lk_1):  # 检查该候选项的子集是否都在Lk-1中
                        Ck.add(Ck_item)
        return Ck

    def has_infrequent_subset(self, Ck_item, Lk_1):  # 检查候选项Ck_item的子集是否都在Lk-1中
        for item in Ck_item:
            sub_Ck = Ck_item - frozenset([item])
            if sub_Ck not in Lk_1:
                return False
        return True

    def generate_lk_by_ck_ergodic(self, data_set, ck, min_support, support_data):  # 通过候选项ck生成lk,基于遍历的支持度计算并将各频繁项的支持度保存到support_data字典中
        item_count = {}  # 用于标记各候选项在数据集出现的次数
        Lk = set()
        # 基于遍历的支持度计算
        for t in data_set:  # 遍历数据集
            for item in ck:
                ##########begin##########
                # 检查候选集ck中的每一项是否出现在事务t中
                if item.issubset(t):
                    #x.issubset(y)表示x是否包含在y中
                    if item not in item_count:
                        item_count[item] = 1
                    else:
                        item_count[item] += 1
                ##########end##########
        t_num = float(len(data_set))
        for item in item_count:
            ##########begin##########
            # 将满足支持度的候选项添加到频繁项集中  
            if item_count[item] / t_num >= min_support:
                Lk.add(item)
                support_data[item] = item_count[item]  
            ##########end##########
        return Lk


if __name__ == "__main__":

    data = [['a','c','e'],['b','d'],['b','c'],['a','b','c','d'],['a','b'],['b','c'],['a','b'],
            ['a','b','c','e'],['a','b','c'],['a','c','e']]
    apriori = Apriori()
    support_data = {}
    c1 = apriori.create_c1(data)
    l1 = apriori.generate_lk_by_ck_ergodic(data_set=data, ck=c1, min_support=0.2, support_data=support_data)
    c2 = apriori.create_ck(l1,size=2)
    l2 = apriori.generate_lk_by_ck_ergodic(data_set=data,ck=c2,min_support=0.2,support_data=support_data)
    print(len(l2))

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FP-Growth算法是一种基于频繁项集的挖掘方法,它通过将事务数据库压缩成一棵FP树,然后在该树上进行挖掘,相比于Apriori算法,其主要优势在于减少了候选项集的生成和多次对数据库的扫描,从而提高了挖掘效率。 下面是FP-Growth算法实现步骤: 1. 构建FP树:遍历所有事务,统计每个元素项出现的频数,只保留那些频数大于或等于最小支持的元素项,将原始事务映射为一个项集,并按照支持降序排列。然后遍历每个项集,按照降序排列的顺序,将每个项插入到FP树中。如果某个元素已经存在于树中,就增加它的计数值,否则就添加一个新的节点。最终的FP树中,每个节点都表示一个元素项,而每个节点的计数值表示该元素项在事务数据库中的出现次数。 2. 构建条件模式基:对于每个元素项,找到所有包含该元素项的路径,这些路径构成了该元素项的条件模式基。条件模式基可以看作是原始事务中所有包含该元素项的子集,它们的支持相同,因此可以用来构建子FP树。 3. 递归挖掘FP树:对于每个元素项,以其为根节点,构建一个子FP树,并对该子树递归进行挖掘。具体地,在子FP树上找到所有频繁项集,然后将它们合并成更大的频繁项集。这个过程不断递归进行,直到找不到更多的频繁项集为止。 FP-Growth算法的主要思想是通过FP树来压缩事务数据库,并且避免了由Apriori算法引入的生成候选项集和扫描数据库的瓶颈,从而提高了挖掘效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值