代碼:
# -*- coding: UTF8 -*-
import sys
# 最小 支持度
sup_min = int(sys.argv[1])
ss = ","
# 交易 數(shù)據(jù) 庫
D=[
'A,B,C,D',
'B,C,E',
'A,B,C,E',
'B,D,E',
'A,B,C,D'
]
print "交易數(shù)據(jù)庫展現(xiàn)"
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 "讀取 文件結(jié)束 BuyMusic.20090722.mob.prodIds !"
'''
#全局 頻繁項(xiàng) 收集
sup_data_map = {}
#全局 最大頻繁項(xiàng) 收集
is_zsup={}
# 遍歷過程 臨時 局部 頻繁項(xiàng) 收集
mapL = {}
# 第一次 頻繁項(xiàng) 收集
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) ])
# 刷選掉 小于 最小支持度 的 頻繁項(xiàng)
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 "第一次 篩選 頻繁項(xiàng) 結(jié)束!"
print mapL
# 裝載 全局 頻繁項(xiàng) 最大頻繁項(xiàng)
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=""
# 根據(jù) 上次 頻繁項(xiàng) ,生成本次 '可能頻繁項(xiàng)' 集合
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])
# '可能頻繁項(xiàng)' 對比 交易數(shù)據(jù)庫 計(jì)數(shù)
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
# 刷選掉 小于 最小支持度 的 頻繁項(xiàng)
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
# 全局 頻繁項(xiàng) ,最大頻繁項(xiàng) 收集
for k,v in mapL2.items() :
sup_data_map[k]=v
is_zsup[k]=v
print "第"+str(dep)+"次 篩選 頻繁項(xiàng) 結(jié)束!"
return mapL2
# 真正 運(yùn)行
ii=1
while mapL :
ii=ii+1
mapL = runL(mapL,ii)
print mapL
# 全局 頻繁項(xiàng) 中 去除 最大頻繁項(xiàng)
for k,v in is_zsup.items() :
if sup_data_map.has_key(k) : del sup_data_map[k]
print "頻繁項(xiàng)"
print sup_data_map
print
print "最大頻繁項(xiàng)"
print is_zsup
print
print "可信度 展現(xiàn)"
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)+"%"
結(jié)果:
-bash-3.00$ python ap.py 2
交易數(shù)據(jù)庫展現(xiàn)
A,B,C,D
B,C,E
A,B,C,E
B,D,E
A,B,C,D
第一次 篩選 頻繁項(xiàng) 結(jié)束!
{'A': 3, 'C': 4, 'B': 5, 'E': 3, 'D': 3}
第2次 篩選 頻繁項(xiàng) 結(jié)束!
{'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次 篩選 頻繁項(xiàng) 結(jié)束!
{'A,B,D': 2, 'A,B,C': 3, 'B,C,D': 2, 'B,C,E': 2, 'A,C,D': 2}
第4次 篩選 頻繁項(xiàng) 結(jié)束!
{'A,B,C,D': 2}
第5次 篩選 頻繁項(xiàng) 結(jié)束!
{}
頻繁項(xiàng)
{'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}
最大頻繁項(xiàng)
{'B,C,E': 2, 'A,B,C,D': 2}
可信度 展現(xiàn)
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%
整理 m.tkk7.com/Good-Game
|