代码:
-bash-3.00$ python ap.py 2
交易数据库展现
A,B,C,D
B,C,E
A,B,C,E
B,D,E
A,B,C,D
第一次 筛选 频繁项 结束!
{'A': 3, 'C': 4, 'B': 5, 'E': 3, 'D': 3}
第2次 筛选 频繁项 结束!
{'C,D': 2, 'C,E': 2, 'A,D': 2, 'A,B': 3, 'A,C': 3, 'B,E': 3, 'B,D': 3, 'B,C': 4}
第3次 筛选 频繁项 结束!
{'A,B,D': 2, 'A,B,C': 3, 'B,C,D': 2, 'B,C,E': 2, 'A,C,D': 2}
第4次 筛选 频繁项 结束!
{'A,B,C,D': 2}
第5次 筛选 频繁项 结束!
{}
频繁项
{'A': 3, 'C': 4, 'B': 5, 'E': 3, 'D': 3, 'C,D': 2, 'C,E': 2, 'A,D': 2, 'A,B': 3, 'A,C': 3, 'A,B,D': 2, 'B,C,D': 2, 'A,C,D': 2, 'B,E': 3, 'B,D': 3, 'B,C': 4, 'A,B,C': 3}
最大频繁项
{'B,C,E': 2, 'A,B,C,D': 2}
可信度 展现
A -> A,B,C,D 66.7%
C -> B,C,E 50.0%
C -> A,B,C,D 50.0%
B -> B,C,E 40.0%
B -> A,B,C,D 40.0%
E -> B,C,E 66.7%
D -> A,B,C,D 66.7%
C,D -> A,B,C,D 100.0%
C,E -> B,C,E 100.0%
A,D -> A,B,C,D 100.0%
A,B -> A,B,C,D 66.7%
A,C -> A,B,C,D 66.7%
A,B,D -> A,B,C,D 100.0%
B,C,D -> A,B,C,D 100.0%
A,C,D -> A,B,C,D 100.0%
B,E -> B,C,E 66.7%
B,D -> A,B,C,D 66.7%
B,C -> B,C,E 50.0%
B,C -> A,B,C,D 50.0%
#
-*- coding: UTF8 -*-
import sys
# 最小 支持度
sup_min = int(sys.argv[ 1 ])
ss = " , "
# 交易 数据 库
D = [
' A,B,C,D ' ,
' B,C,E ' ,
' A,B,C,E ' ,
' B,D,E ' ,
' A,B,C,D '
]
print " 交易数据库展现 "
for arr in D : print arr
print
'''
rows = int(sys.argv[ 1 ])
D=[]
for tid in open('BuyMusic.20090722.mob.prodIds').readlines()[:rows] :
D.append(tid.split("\n")[0].split("\t")[1])
print "读取 文件结束 BuyMusic.20090722.mob.prodIds !"
'''
# 全局 频繁项 收集
sup_data_map = {}
# 全局 最大频繁项 收集
is_zsup = {}
# 遍历过程 临时 局部 频繁项 收集
mapL = {}
# 第一次 频繁项 收集
def find_frequent_1_itemset(I):
if I == ' null ' or I == '' : return
if mapL.has_key(I): mapL[I] += 1
else : mapL[I] = 1
map(find_frequent_1_itemset,[ I for TID in D for I in TID.split(ss) ])
# 刷选掉 小于 最小支持度 的 频繁项
def remove_not_sup_min(map,supmin = sup_min):
for k in [k for k,v in map.items() if v < supmin] :
del map[k]
remove_not_sup_min(mapL)
print " 第一次 筛选 频繁项 结束! "
print mapL
# 装载 全局 频繁项 最大频繁项
for k,v in mapL.items() :
sup_data_map[k] = v
is_zsup[k] = v
# 判定 是否 'BD' 属于 'BCD' 中
isInTid = lambda I,TID : len(I.split(ss)) == len([i for i in I if i in TID.split(ss)])
# 组合 [A,B] + [A,C] = [A,B.C]
def comb(arr1,arr2):
tmap = {}
for v in arr1 + arr2 : tmap[v] = ""
return tmap.keys()
# apriori 迭代核心
def runL(mapL,dep):
mapL2 = {}
C = {}
keys = mapL.keys()
iik = ""
jjk = ""
# 根据 上次 频繁项 ,生成本次 '可能频繁项' 集合
for ii in range(len(keys)) :
for jj in range(ii + 1 ,len(keys)) :
keystr = comb([ch for ch in keys[ii].split(ss)],[ch for ch in keys[jj].split(ss)])
if not len(keystr) == dep : continue
keystr.sort()
tk = ss.join(keystr)
if not tk in C : C[tk] = (keys[ii],keys[jj])
# '可能频繁项' 对比 交易数据库 计数
for tk,z in C.items():
for TID in D:
if isInTid(tk,TID) :
if mapL2.has_key(tk): mapL2[tk] += 1
else : mapL2[tk] = 1
# 刷选掉 小于 最小支持度 的 频繁项
remove_not_sup_min(mapL2)
for k,v in is_zsup.items() :
for k1,v1 in mapL2.items() :
if isInTid(k,k1) :
del is_zsup[k]
break
# 全局 频繁项 ,最大频繁项 收集
for k,v in mapL2.items() :
sup_data_map[k] = v
is_zsup[k] = v
print " 第 " + str(dep) + " 次 筛选 频繁项 结束! "
return mapL2
# 真正 运行
ii = 1
while mapL :
ii = ii + 1
mapL = runL(mapL,ii)
print mapL
# 全局 频繁项 中 去除 最大频繁项
for k,v in is_zsup.items() :
if sup_data_map.has_key(k) : del sup_data_map[k]
print " 频繁项 "
print sup_data_map
print
print " 最大频繁项 "
print is_zsup
print
print " 可信度 展现 "
for k,v in sup_data_map.items() :
for k1,v1 in is_zsup.items() :
if isInTid(k,k1) :
print k, " -> " ,k1, " \t%.1f " % ((float(is_zsup[k1]) / float(sup_data_map[k])) * 100 ) + " % "
结果:
import sys
# 最小 支持度
sup_min = int(sys.argv[ 1 ])
ss = " , "
# 交易 数据 库
D = [
' A,B,C,D ' ,
' B,C,E ' ,
' A,B,C,E ' ,
' B,D,E ' ,
' A,B,C,D '
]
print " 交易数据库展现 "
for arr in D : print arr
'''
rows = int(sys.argv[ 1 ])
D=[]
for tid in open('BuyMusic.20090722.mob.prodIds').readlines()[:rows] :
D.append(tid.split("\n")[0].split("\t")[1])
print "读取 文件结束 BuyMusic.20090722.mob.prodIds !"
'''
# 全局 频繁项 收集
sup_data_map = {}
# 全局 最大频繁项 收集
is_zsup = {}
# 遍历过程 临时 局部 频繁项 收集
mapL = {}
# 第一次 频繁项 收集
def find_frequent_1_itemset(I):
if I == ' null ' or I == '' : return
if mapL.has_key(I): mapL[I] += 1
else : mapL[I] = 1
map(find_frequent_1_itemset,[ I for TID in D for I in TID.split(ss) ])
# 刷选掉 小于 最小支持度 的 频繁项
def remove_not_sup_min(map,supmin = sup_min):
for k in [k for k,v in map.items() if v < supmin] :
del map[k]
remove_not_sup_min(mapL)
print " 第一次 筛选 频繁项 结束! "
print mapL
# 装载 全局 频繁项 最大频繁项
for k,v in mapL.items() :
sup_data_map[k] = v
is_zsup[k] = v
# 判定 是否 'BD' 属于 'BCD' 中
isInTid = lambda I,TID : len(I.split(ss)) == len([i for i in I if i in TID.split(ss)])
# 组合 [A,B] + [A,C] = [A,B.C]
def comb(arr1,arr2):
tmap = {}
for v in arr1 + arr2 : tmap[v] = ""
return tmap.keys()
# apriori 迭代核心
def runL(mapL,dep):
mapL2 = {}
C = {}
keys = mapL.keys()
iik = ""
jjk = ""
# 根据 上次 频繁项 ,生成本次 '可能频繁项' 集合
for ii in range(len(keys)) :
for jj in range(ii + 1 ,len(keys)) :
keystr = comb([ch for ch in keys[ii].split(ss)],[ch for ch in keys[jj].split(ss)])
if not len(keystr) == dep : continue
keystr.sort()
tk = ss.join(keystr)
if not tk in C : C[tk] = (keys[ii],keys[jj])
# '可能频繁项' 对比 交易数据库 计数
for tk,z in C.items():
for TID in D:
if isInTid(tk,TID) :
if mapL2.has_key(tk): mapL2[tk] += 1
else : mapL2[tk] = 1
# 刷选掉 小于 最小支持度 的 频繁项
remove_not_sup_min(mapL2)
for k,v in is_zsup.items() :
for k1,v1 in mapL2.items() :
if isInTid(k,k1) :
del is_zsup[k]
break
# 全局 频繁项 ,最大频繁项 收集
for k,v in mapL2.items() :
sup_data_map[k] = v
is_zsup[k] = v
print " 第 " + str(dep) + " 次 筛选 频繁项 结束! "
return mapL2
# 真正 运行
ii = 1
while mapL :
ii = ii + 1
mapL = runL(mapL,ii)
print mapL
# 全局 频繁项 中 去除 最大频繁项
for k,v in is_zsup.items() :
if sup_data_map.has_key(k) : del sup_data_map[k]
print " 频繁项 "
print sup_data_map
print " 最大频繁项 "
print is_zsup
print " 可信度 展现 "
for k,v in sup_data_map.items() :
for k1,v1 in is_zsup.items() :
if isInTid(k,k1) :
print k, " -> " ,k1, " \t%.1f " % ((float(is_zsup[k1]) / float(sup_data_map[k])) * 100 ) + " % "
-bash-3.00$ python ap.py 2
交易数据库展现
A,B,C,D
B,C,E
A,B,C,E
B,D,E
A,B,C,D
第一次 筛选 频繁项 结束!
{'A': 3, 'C': 4, 'B': 5, 'E': 3, 'D': 3}
第2次 筛选 频繁项 结束!
{'C,D': 2, 'C,E': 2, 'A,D': 2, 'A,B': 3, 'A,C': 3, 'B,E': 3, 'B,D': 3, 'B,C': 4}
第3次 筛选 频繁项 结束!
{'A,B,D': 2, 'A,B,C': 3, 'B,C,D': 2, 'B,C,E': 2, 'A,C,D': 2}
第4次 筛选 频繁项 结束!
{'A,B,C,D': 2}
第5次 筛选 频繁项 结束!
{}
频繁项
{'A': 3, 'C': 4, 'B': 5, 'E': 3, 'D': 3, 'C,D': 2, 'C,E': 2, 'A,D': 2, 'A,B': 3, 'A,C': 3, 'A,B,D': 2, 'B,C,D': 2, 'A,C,D': 2, 'B,E': 3, 'B,D': 3, 'B,C': 4, 'A,B,C': 3}
最大频繁项
{'B,C,E': 2, 'A,B,C,D': 2}
可信度 展现
A -> A,B,C,D 66.7%
C -> B,C,E 50.0%
C -> A,B,C,D 50.0%
B -> B,C,E 40.0%
B -> A,B,C,D 40.0%
E -> B,C,E 66.7%
D -> A,B,C,D 66.7%
C,D -> A,B,C,D 100.0%
C,E -> B,C,E 100.0%
A,D -> A,B,C,D 100.0%
A,B -> A,B,C,D 66.7%
A,C -> A,B,C,D 66.7%
A,B,D -> A,B,C,D 100.0%
B,C,D -> A,B,C,D 100.0%
A,C,D -> A,B,C,D 100.0%
B,E -> B,C,E 66.7%
B,D -> A,B,C,D 66.7%
B,C -> B,C,E 50.0%
B,C -> A,B,C,D 50.0%
A,B,C -> A,B,C,D 66.7%
本文转自博客园刘凯毅的博客,原文链接:apriori 算法(py),如需转载请自行联系原博主。