使用ECLAT算法挖掘频繁项集

  • 发布日期:2019-10-29
  • 难度:复杂
  • 类别:关联规则挖掘
  • 标签:Python、购物篮、频繁项集、ECLAT

1. 问题描述

通过自编Python程序实现ECLAT算法,实现频繁项集挖掘。购物篮数据来自IBM SPSS Modeler软件自带的BASKETS1n数据集。

2. 程序实现

In [3]:
import xlrd  #excel文件读取函数
def load_data_set():
    data_set=[]
    data = xlrd.open_workbook('Basket1n.xls')
    table = data.sheets()[0]   #索引到第一个工作表
    card_id = table.col_values(0)[1:]
    for i in range(1,len(card_id)+1):
        one_tran=[]
        for j in range(7,18):  #商品对应的列数
            if table.cell(i,j).value=='T':
                one_tran.append(table.cell(0,j).value)
        data_set.append(one_tran)
    return data_set

def eclat(prefix, items, min_support,data_set_len, freq_items):
    while items:
        # 从第一个元素开始,查看该元素是否为频繁项集
        key, item = items.pop(0)
        key_support = len(item)/data_set_len
        if key_support >= min_support:
            freq_items[frozenset(prefix+[key])] = key_support
            #当某个项集是频繁项集时,需考虑由该项集生成的新项集是否为频繁项集
            suffix = []
            for other_key, other_item in items:
                new_item = item & other_item
                if len(new_item)/data_set_len >= min_support:
                    suffix.append((other_key, new_item))
            eclat(prefix+[key], sorted(suffix,key=lambda item:item[0],reverse=False), min_support,data_set_len,freq_items)
    return freq_items


def eclat_begin(data_set, min_support):
    # 读取事务数据库,转化为倒排事务表
    data = {}
    trans_num = 0
    data_set_len=float(len(data_set))
    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)
    #通过倒排事务表得到频繁1-项集
    L1_data={}
    for item in data:
        if (len(data[item])/data_set_len)>=min_support:
            L1_data[item]=data[item]
    #使用freq_items存储频繁项集及其支持度
    freq_items = {}
    freq_items = eclat([], sorted(L1_data.items(), key=lambda item: item[0], reverse=False), min_support,data_set_len, freq_items)
    return freq_items


#读取数据集
data_set = load_data_set()
#通过事务数据集和最小支持度挖掘频繁项集
support_data = eclat_begin(data_set, min_support=0.1)
#输出频繁项集挖掘结果
print('频繁项集'+'\t'+'支持度')
for i in support_data:
    print(str(i)+':'+str(support_data[i]))
频繁项集	支持度
frozenset({'冷冻食品'}):0.302
frozenset({'冷冻食品', '啤酒'}):0.17
frozenset({'冷冻食品', '啤酒', '灌装蔬菜'}):0.146
frozenset({'冷冻食品', '灌装蔬菜'}):0.173
frozenset({'啤酒'}):0.293
frozenset({'灌装蔬菜', '啤酒'}):0.167
frozenset({'新鲜肉类'}):0.183
frozenset({'水果蔬菜'}):0.299
frozenset({'鱼', '水果蔬菜'}):0.145
frozenset({'汽水'}):0.184
frozenset({'灌装肉品'}):0.204
frozenset({'灌装蔬菜'}):0.303
frozenset({'牛奶'}):0.177
frozenset({'白酒'}):0.287
frozenset({'白酒', '糖果'}):0.144
frozenset({'糖果'}):0.276
frozenset({'鱼'}):0.292
In [ ]: