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
网友评论