dm實驗,寫的比較二,好多情況還沒有考慮,後續有時間會修改。
開始的時候資料結構沒設計好導致寫到後面費了很大的勁、不過還好python的列表有起死回生的功效、、、
資料集:database.txt
i1,i2,i5
i2,i4
i2,i3
i1,i2,i4
i1,i3
i2,i3
i1,i3
i1,i2,i3,i5
i1,i2,i3
apriori.py
#coding=utf-8
""" author:messiandzcy
apriori.py
date:2014.12.3
"""#申請存資料庫的矩陣,方便以後遍歷
def matrix(num_of_transactions,num_of_items):
mat = [['#' for y in range (num_of_items+1)]
for x in range(num_of_transactions+1)]
return mat
#輸出資料庫矩陣除錯
def printf(mat,rows,cols):
for i in range(rows):
for j in range(cols):
print mat[i][j],
print
#讀入檔案,將資料庫存到列表data裡,並格式化輸出
def readfile():
filename = r'database.txt'
try:
fp = open(filename,"r")
print "reading file '%s'..." % filename
print "%-10s%-10s" % ("tid","items")
pos = 1 #pos記錄事務數(行數)
max_j = 0 #記錄項的最大寬度(列數)
data = matrix(15,10) #最多15個事務,10個項
for line in fp:
string=line.strip("\n")
print "%-10d%-10s" % (pos,string)
j = 1 #記錄項的寬度(列數)
for items in string.split(","):
data[pos][j]=items #向資料庫插入資料
j += 1
if j>max_j:max_j=j
pos += 1
fp.close()
#print "pos=%d,j=%d" % (pos,max_j)
#printf(data,pos,max_j)
print "read file success!\n"
return (data,pos,max_j)
except ioerror:
print "read file -->'%s' failed!" % filename
print "file --> '%s' does not exist!" % filename
except:#other exceptions
print "other exceptions!"
#將資料庫轉換成垂直格式的,計數時會很方便
def vertical(mat,rows,cols):
#掃瞄一遍資料庫並去掉重複的項
lst = #項與整數的一一對應
for i in range(rows):
for j in range(cols):
lst=list(set(lst)) #去重
#print len(lst)
#再掃瞄一遍資料庫,生成新的vertical資料庫
i = [,,,,,,,,,] #最多支援10個項,每個項對應乙個列表
for i in range(rows):
for j in range(cols):
#print lst
#print i
return (lst,i)
#根據項集列表掃瞄資料庫並返回支援計數
def count(itemset,lst,i):
if len(itemset)==1:return len(i[lst.index(itemset[0])]) #1-項集的情況
x = itemset[0]
ggg =i[lst.index(x)] #獲得首元素對應的資料庫i的列表
#求多個集合的交
for y in itemset:
ggg = list(set(ggg)&set(i[lst.index(y)]))
#print ggg
return len(ggg) #最後交集元素的個數即是支援度計數
#執行apriori演算法,lst-->記錄去重後的項集列表,i-->記錄與lst對應索引的vertical資料庫
def apriori(lst,i,min_sup):
print "start to run apriori!"
#print lst
#print i
d=[ for i in range(15)] #假定每次自連線產生的項集個數不超過15
num = 0 #記錄項集個數
for x in lst:
if x!='#':
num += 1
#print count(["i1","i2"],lst,i)
#格式化輸出初始候選項c1,單獨處理,不進迴圈
print "\ncandidate:#1"
print "%-10s%-10s" % ("items","count")
for i in range(15): #i是項集的序號
if d[i]!=:
print "%-10s%-10d" % ("".join(d[i]),count(d[i],lst,i))
#print d
iters=1 #迭代次數
while iters<=7:
#開始迭代,第一步,ck-->lk,根據最小閾值min_sup來剪枝
print "\n#l%d" %iters
print "%-10s%-10s" % ("items","count")
for i in range(15):
if len(d[i])==iters: #在頻繁k項集中查詢
if count(d[i],lst,i)>=min_sup:
print "%-10s%-10d" % (",".join(d[i]),count(d[i],lst,i))
else:d[i]= #否則剪枝
#print d
#迭代第二步,自連線lk-->ck+1
new =
for i in d:
#print "new="
#print new
if len(new)==0:break #若已經找不到符合條件的頻繁k項集,終止迴圈!
if iters==1: #第一次執行完全連線操作
num = 0
for i in range(len(new)): #i,j是下標序號
for j in range(i+1,len(new)):
d[num]=[new[i][0],new[j][0]] #自連線後更新項集列表d
num += 1
else: #否則執行真正的自連線操作
tmp =
for i in range(len(new)): #對於每個項集
#print new[i][0:iters-1]
if new[i][0:iters-1] not in tmp: #去重
#print "tmp="
#print tmp
num = 0
for j in range(len(tmp)): #對於每個前k-1項
hehe =
for i in range(len(new)): #掃瞄項集,提取出字首和前k-1項一致的項集,後面部分-->hehe
#得到hehe之後,開始做完全連線
#print "hehe="
#print hehe
for m in range(len(hehe)): #i,j是下標序號
for n in range(m+1,len(hehe)):
#print tmp[j]+[hehe[m],hehe[n]]
d[num]=tmp[j]+[hehe[m],hehe[n]] #自連線後更新項集列表d
num += 1
#print "d="
#print d
#return
print "\ncandidate:#%d" % (iters+1)
print "%-10s%-10s" % ("items","count")
for i in range(15): #i是項集的序號
if len(d[i])==iters+1:
print "%-10s%-10d" % (",".join(d[i]),count(d[i],lst,i))
#print d
iters += 1
#主函式
(data,pos,max_j)=readfile()
#printf(data,pos,max_j)
#print "pos=%d,j=%d" % (pos,max_j)
(lst,i)=vertical(data,pos,max_j) #轉換
#print lst
#print vertical
min_sup = 2 #設定最小支援度
apriori(lst,i,min_sup)
頻繁模式挖掘Apriori演算法詳解
本資料探勘演算法是本人進入研究生學習階段進行的第一項 比較難 的學習,下文除了源 有參考zealseeker博主之外均為原創手打,如有 寫的不嚴謹,望請諒解。首先頻繁模式 frequent patten 表示頻繁的出現在資料集中的模式,舉個例子,去燒烤攤點串,這種選單上的內容就是一種頻繁模式,因為會...
頻繁模式挖掘Apriori初學詳解
coding utf 8 import itertools class apriori def init self,min sup 0.2,datadic self.data datadic self.size len datadic get the number of events self.mi...
資料探勘 Apriori演算法
今日資料探勘課學習了apriori演算法,特意總結下,因為自己是大三弱雞,很多地方參考了下面dalao的博文 非常感謝!apriori演算法是一種挖掘關聯規則的頻繁項集演算法,其核心思想是通過候選集生成和情節的向下封閉檢測兩個階段來挖掘頻繁項集。而且演算法已經被廣泛的應用到商業 網路安全等各個領域。...