Educoder-候选生成Apriori算法

任务描述

本关任务:编写一个能实现Apripori算法候选生成的小程序。

相关知识

为了完成本关任务,你需要掌握:1.Apripori 算法候选生成,2.Apripori 算法候选生成代码实现。

Apripori 算法候选生成

Apripori算法利用自连接生成候选集: 自连接:Lk​中的2个k项集l1​l2​,若l1​l2​有且仅有1个项不同,则将l1​l2​加入Ck+1​直观理解:生成可能的(k+1)项集:

上图为频繁3项集L3​生成候选4项集C4​过程示例,可以看到L3​中的2个3项集ABCABD有且仅有1个项不同,则将 ABCABD=ABCD 加入C4​

Apripori 算法候选生成代码实现

Apripori 算法候选1项集生成函数如下:

 
  1. def create_c1(self, dataset): # 遍历整个数据集生成c1候选集
  2. c1 = set()
  3. for i in dataset:
  4. for j in i:
  5. item = frozenset([j])
  6. c1.add(item)
  7. return c1

其中 dataset 为数据集列表。

Apripori 算法候选 k 项集生成函数(无剪枝操作)代码思路如下:

  1. 创建Ck集合。
  2. 获取Lk_1的长度。
  3. 将Lk_1转换为列表。
  4. 两次遍历Lk-1,找出前n-1个元素相同的项。
  5. 只有最后一项不同时,生成下一候选项。
  6. 返回Ck集合。

根据提示,在右侧编辑器补充代码,生成候选3项集C3​

预期输出:4


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): 

                ##########begin##########
                # 两次遍历Lk-1,找出前n-1个元素相同的项
                # 数据集列表里面的lk_list[i]单个元素,不是列表类型转化
                l1 = list(lk_list[i])
                l2 = list(lk_list[j])
                l1.sort()
                l2.sort() #小写英文字母也可以排序
                ##########end##########
                if l1[0:size - 2] == l2[0:size - 2]:  
                    ##########begin##########
                    #只有最后一项不同时,生成下一候选项
                    Ck_item = lk_list[i] | lk_list[j]
                    if Ck_item not in Ck:
                        Ck.add(Ck_item)
                    ##########end##########
        return Ck

    def generate_lk_by_ck_ergodic(self, data_set, ck, min_support, support_data):  
        item_count = {}  
        Lk = set()
       
        for t in data_set:  
            for item in ck:  
                if item.issubset(t):
                    if item not in item_count:
                        item_count[item] = 1
                    else:
                        item_count[item] += 1
        t_num = float(len(data_set))
        for item in item_count:  
            if item_count[item] / t_num >= min_support:
                Lk.add(item)
                support_data[item] = item_count[item]
        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)
    c3 = apriori.create_ck(l2, size=3)
    print(len(c3))

 

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Apriori算法中,候选集指的是可能成为频繁项集的集合。在Apriori算法中,候选集的生成分为两个步骤: 1. 生成大小为1的候选集:扫描数据集,统计每个项的出现次数,将出现次数大于等于最小支持度阈值的项作为大小为1的候选集。 2. 生成大小为k的候选集:通过频繁项集生成候选集。具体做法是,将大小为k-1的频繁项集两两合并,得到大小为k的候选集,然后对候选集进行剪枝,去掉其中不可能成为频繁项集的集合,得到真正的候选集。 例如,假设我们要找到最小支持度为2的频繁项集。首先,扫描数据集,统计每个项的出现次数,得到如下项集及其出现次数: ``` {A}: 4 {B}: 3 {C}: 2 {D}: 3 {E}: 2 ``` 由于{C}和{E}的出现次数小于最小支持度阈值2,因此它们不是频繁项集,无法成为候选集。因此,我们可以将大小为1的频繁项集作为初始候选集: ``` {A}, {B}, {D} ``` 接下来,我们通过频繁项集生成候选集。假设我们已经找到了大小为2的频繁项集: ``` {A, B}, {A, D}, {B, D} ``` 现在,我们希望通过频繁项集{A, B}和{A, D}生成大小为3的候选集。具体做法是将它们合并,得到: ``` {A, B, D} ``` 然后,我们对候选集{A, B, D}进行剪枝,去掉其中不可能成为频繁项集的集合,得到真正的候选集: ``` {A, B, D} ``` 因此,我们得到了大小为3的候选集{A, B, D}。同样的方法可以用于生成更大的候选集。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值