Eclat算法

2019-01-24  本文已影响11人  曦宝
1、核心思想:倒排序
2、只能用来发现频繁项集。
3、只扫描一次数据集

我发现了一个很好的博客

http://www.cnblogs.com/infaraway/p/6774521.html

里面详细对比了三种算法的思想以及python实现。

代码的实现也是来自那篇博客。

# -*- coding: utf-8 -*-


def eclat(prefix, items, min_support, freq_items):
    while items:
        # 初始遍历单个的元素是否是频繁
        key, item = items.pop()
        key_support = len(item)
        if key_support >= min_support:
            # print frozenset(sorted(prefix+[key]))
            freq_items[frozenset(sorted(prefix+[key]))] = key_support
            suffix = []  # 存储当前长度的项集
            for other_key, other_item in items:
                new_item = item & other_item  # 求和其他集合求交集
                if len(new_item) >= min_support:
                    suffix.append((other_key, new_item))
            eclat(prefix+[key], sorted(suffix, key=lambda item: len(item[1]), reverse=True), min_support, freq_items)
    return freq_items


def eclat_zc(data_set, min_support=1):
    """
    Eclat方法
    :param data_set:
    :param min_support:
    :return:
    """
    # 将数据倒排
    data = {}
    trans_num = 0
    for trans in data_set:
        trans_num += 1
        for item in trans:
            if item not in data:
                data[item] = set()
            data[item].add(trans_num)
    freq_items = {}
    freq_items = eclat([], sorted(data.items(), key=lambda item: len(item[1]), reverse=True), min_support, freq_items)
    return freq_items


if __name__ == '__main__':
    data_set = [['A', 'B', 'D', 'H'], ['A', 'B', 'E', 'I'], ['A', 'B', 'E', 'J'], ['A', 'C', 'F', 'G']]
    freq_items = eclat_zc(data_set, 2)
    print(freq_items)

这里只有一点要唠叨一下,如果你看了三篇文章,你仔细看了代码就会发现,三个实现代码里面对最小支持度的定义不一样。Apriori算法里面计算的是一个比例(在0~1之间,数字越大表示出现越频繁),FP-growth和Eclat算法里最小支持度指的是出现次数(大于等于1,数字越大表示出现次数越多)。
补充一个网址
https://blog.csdn.net/sanqima/article/details/51559120

上一篇 下一篇

猜你喜欢

热点阅读