Eclat算法流程+ Python代码实现

前言

​ 网上的对于该算法的讲解已经很好了,因此此处只给出流程和代码完事儿。不懂得原理的读者请去其他博文康康。

流程

​ ①扫描数据集,将数据由水平格式进行垂直翻转。
​ ②计算项集的支持度(等于TID,也就是标号的数量)
​ ③从k=1开始,保留支持度大于最小支持度的项集。
​ ④通过取频繁k项集的两两相交,得到k+1项集。再计算出频繁项集,
​ ⑤重复第④步,直到频繁项集<=1。

代码实现

def Vertical_data(x):
    '''
    作用:构造垂直数据
    :param x: 数据
    :return: 返回字典
    '''
    Vertical_dict={} #生成用于储存 垂直数据 的字典
    for index,items in enumerate(x): #循环每一行数据
        for item in items: #循环一行中的每一个数据。
            Vertical_dict[item]=Vertical_dict.get(item,[])+[index] #构造数据
    return Vertical_dict #返回字典
def main(data,support_per):
    '''
    :param data: 数据
    :param support_per: 最小支持度
    '''
    Vertical_dict=Vertical_data(data) #构造垂直字典
    Vertical_dict={ k:v for k,v in Vertical_dict.items() if len(v)>support_per} #计算频繁1项集
    a=Vertical_dict #将频繁项集赋给a。因为Vertical_dict在本文将用于储存所有的频繁项集
    while True: #作死循环
        a_len=len(a) #求k项集的字典的长度
        a_list=list(a) #将字典的键作为列表
        a={} #将a重新洗白,因为要更新a的项集了
        for i in range(a_len-1): #循环从1到n-1项(索引)
            for j in range(i+1,a_len): #每次都选取i以后的项与i组合(索引)
                key_i=a_list[i] #取出对应的i的键
                key_j=a_list[j] #取出对应的j的键
                inter=sorted(set(Vertical_dict[key_i]) & set(Vertical_dict[key_j]))#计算交集
                if len(inter)>support_per: #保留支持度大于最小支持度的项
                    key_list=sorted(set(key_i.split()+key_j.split())) #对两组数据以空格切开形成列表并去重然后排序得到组合项
                    key_str=" ".join(key_list) #对该组合项变成字符串,两两数据之间用空格隔开。因为字典不能将可变列表作为键保存。
                    a[key_str]=inter #生成组合项和对应的交集
        Vertical_dict={**Vertical_dict,**a}#将得到的频繁k项集和原始频繁(1,k-1)项集合并.
        if len(a)<=1: #打破循环并输出
            print(Vertical_dict)
            break
if __name__ == '__main__':
    data=[["l1","l2","l5"],
          ["l2","l4"],
          ["l2","l3"],
          ["l1","l2","l4"],
          ["l1", "l3"],
          ["l2","l3"],
          ["l1","l3"],
          ["l1","l2","l3","l5"],
          ["l1","l2","l3"]]
    main(data,support_per=1)

结束语

​ 如有错误,还望指出。阿里嘎多。
在这里插入图片描述

Eclat算法是一种基于频繁项集的挖掘算法,可以用于发现数据集中的频繁项集。它的基本思想是利用垂直数据格式(vertical data format)来构建候选项集,然后通过对候选项集的计数来发现频繁项集。 下面是Eclat算法Python实现: ```python def eclat(dataset, min_support): # 转换数据格式为字典 dataset = {frozenset(trans): 1 for trans in dataset} # 获取所有项集 items = set([item for trans in dataset for item in trans]) # 初始化频繁项集 freq_items = {} # 递归查找频繁项集 find_frequent_items(items, dataset, min_support, set(), freq_items) return freq_items def find_frequent_items(items, dataset, min_support, prefix, freq_items): while items: # 取出一个项 item = items.pop() # 构建新的频繁项集 new_items = prefix | {item} # 计算新的频繁项集的支持度 support = sum([1 for trans in dataset if new_items.issubset(trans)]) # 如果支持度大于等于最小支持度,则把频繁项集加入结果集中 if support >= min_support: freq_items[new_items] = support # 递归查找新的频繁项集 find_frequent_items(items, dataset, min_support, new_items, freq_items) ``` 其中,`dataset`是一个列表,其中每个元素表示一个事务,每个事务是一个由项组成的集合。`min_support`表示最小支持度,`prefix`表示已经构建的频繁项集,`freq_items`表示最终的频繁项集。 调用方法如下: ```python dataset = [ ['A', 'B', 'C'], ['A', 'B'], ['A', 'C'], ['B', 'C'], ['A', 'B', 'D'], ['B', 'D'], ['C', 'D'], ['B', 'C', 'D'] ] min_support = 3 freq_items = eclat(dataset, min_support) print(freq_items) ``` 输出结果为: ``` {frozenset({'C', 'B', 'D'}): 3, frozenset({'A', 'B', 'C'}): 3, frozenset({'B', 'D'}): 4, frozenset({'B', 'C'}): 4, frozenset({'A', 'B'}): 3, frozenset({'C', 'D'}): 3, frozenset({'A', 'C'}): 3, frozenset({'A', 'B', 'D'}): 3} ``` 可以看到,算法输出了所有支持度大于等于3的频繁项集。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值