通过自编Python程序实现ECLAT算法,实现频繁项集挖掘。购物篮数据来自IBM SPSS Modeler软件自带的BASKETS1n数据集。
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]))