#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.min_sup = min_sup
self.min_sup_val = min_sup * self.size #這個數值是頻繁演算法的分子整數部分
def find_frequent_1_itemsets(self):
freqdic = {} # 不管頻繁度如何,先計算頻繁度,然後裝到這裡面
for event in self.data: #event表示字典裡的鍵值,比如t100
for item in self.data[event]:
if item in freqdic: #該成員是否出現過,出沒出現過都要對它進行賦值
freqdic[item] += 1 #出現過則+1
else:
freqdic[item] = 1 #沒出現過則初始值為1
l1 =
for itemset in freqdic: #遍歷第一輪「頻繁」的成員
if itemset >= self.min_sup_val: #如果頻繁度大於設定值
return l1
def has_infrequent_subset(self,c,l_last,k):
subsets = list(itertools.combinations(c,k-1)) #return list of tuples of items
for each in subsets:
each = list(each) #change tuple into list
if each not in l_last:
return true
return false
def apriori_gen(self,l_last): #l_last means frequent(k-1) itemsets 難點!!!
k = len(l_last[0]) + 1 #len()對於列表,則返回成員的個數 如['i1','i2']就返回2
ck = #候選項集集合
for itemset1 in l_last: #迴圈遍歷l_last中的成員
for itemset2 in l_last:
#join step
flag = 0
for i in range(k-2):
if itemset1[i] != itemset2[i]:
flag = 1 #the two itemset can't join
break
if flag == 1:
continue
if itemset1[k-2] < itemset2[k-2]:
c = itemset1 + [itemset2[k-2]] #例:['i1']<['i2']成立,則推入乙個['i1','i2'],並且先不計算它的頻繁度
else:
continue
#pruning setp
if self.has_infrequent_subset(c,l_last,k):
continue
else:
return ck
def do(self):
l_last = self.find_frequent_1_itemsets()
l = l_last
i = 0
while l_last != :
ck = self.apriori_gen(l_last)
freqdic = {}
for event in self.data:
#get all suported subsets
for c in ck:
if set(c) <= set(self.data[event]):#is subset
if tuple(c) in freqdic:
freqdic[tuple(c)]+=1
else:
freqdic[tuple(c)]=1
print freqdic
lk =
for c in freqdic:
if freqdic[c] > self.min_sup_val:
l_last = lk
l += lk
return l
#******test******
data =
a=apriori(datadic=data)
print a.do()
頻繁模式挖掘 Apriori演算法
dm實驗,寫的比較二,好多情況還沒有考慮,後續有時間會修改。開始的時候資料結構沒設計好導致寫到後面費了很大的勁 不過還好python的列表有起死回生的功效 資料集 database.txt i1,i2,i5 i2,i4 i2,i3 i1,i2,i4 i1,i3 i2,i3 i1,i3 i1,i2,i...
頻繁模式挖掘Apriori演算法詳解
本資料探勘演算法是本人進入研究生學習階段進行的第一項 比較難 的學習,下文除了源 有參考zealseeker博主之外均為原創手打,如有 寫的不嚴謹,望請諒解。首先頻繁模式 frequent patten 表示頻繁的出現在資料集中的模式,舉個例子,去燒烤攤點串,這種選單上的內容就是一種頻繁模式,因為會...
頻繁項集挖掘之apriori和fp growth
apriori和fp growth是頻繁項集 frequent itemset mining 挖掘中的兩個經典演算法,主要的區別在於乙個是廣度優先的方式,另乙個是深度優先的方式,後一種是基於前一種效率較低的背景下提出來的,雖然都是十幾年前的,但是理解這兩個演算法對資料探勘和學習演算法都有很大好處。在...