關聯規則方法之apriori演算法

2021-08-25 14:19:50 字數 3576 閱讀 4154

apriori algorithm是關聯規則裡一項基本演算法,是由rakesh agrawal和ramakrishnan srikant兩位博士在2023年提出的關聯規則挖掘演算法。關聯規則的目的就是在乙個資料集中找出項與項之間的關係,也被稱為購物藍分析 (market basket analysis),因為「購物藍分析」很貼切的表達了適用該演算法情景中的乙個場景。 

#! -*- coding:utf-8 -*-

#code write by guohao

import itertools

class apriori(object):

def __init__(self,min_sup=0.2,datadic={}):

self.data = datadic #構建資料記錄詞典

self.size = len(datadic) #統計事務個數

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為每一條記錄

for item in self.data[event]: #item為項

if item in freqdic:

freqdic[item] += 1

else:

freqdic[item] = 1

l1 =

for itemset in freqdic:

if freqdic[itemset] >=self.min_sup_val: #過濾掉小於最小支援度計數的1-項集

return l1

def has_infrequent_subset(self,c,l_last,k):

#c為當前集合,l_last為上乙個頻繁項集的集合,k為當前頻繁項集內的元素個數

#該函式用於檢查當前子集是否都為頻繁項集

subsets = list(itertools.combinations(c,k-1))

for each in subsets:

each = list(each)

if each not in l_last:

return true

return false

def apriori_gen(self,l_last): #連線步實現

k = len(l_last[0]) + 1

ck =

for itemset1 in l_last:

for itemset2 in l_last:

flag = 0

for i in range(k-2):

if itemset1[i] != itemset2[i]: #如果前k-2項中有一項不相等,則合併的項集必定不為頻繁項集

flag = 1

break

if flag == 1:continue

if itemset1[k-2] < itemset2[k-2]:

c = itemset1 + [itemset2[k-2]] #合成待定k項集

else:

continue

if self.has_infrequent_subset(c,l_last,k): #判斷是否為1-項集

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:

for c in ck:

if set(c) <= set(self.data[event]): #判斷新合成的頻繁集是否是事務記錄的子集

if tuple(c) in freqdic:

freqdic[tuple(c)] += 1

else:

freqdic[tuple(c)] = 1

lk =

for c in freqdic:

if freqdic[c] > self.min_sup_val: #判斷新形成的待定頻繁項集是否為為真正的頻繁項集

l_last = lk

l += lk

return l

#*****************************test*****************************

print('********************==test***************====')

data =

a = apriori(datadic = data)

print(a.do())

這裡解釋一下**中比較難理解的一段**:

for itemset1 in l_last:

for itemset2 in l_last:

flag = 0

for i in range(k-2):

if itemset1[i] != itemset2[i]: #如果前k-2項中有一項不相等,則合併的項集必定不為頻繁項集

flag = 1

break

if flag == 1:continue

if itemset1[k-2] < itemset2[k-2]:

c = itemset1 + [itemset2[k-2]] #合成待定k項集

else:

continue

對於項集l_last中包含k-1個項的任意兩個頻繁項集itemset1,itemset2,要使其合成為包含k個項的待定頻繁項集,要完成這樣的事,即就是給itemset1新增itemset2中其不存在的項;但為什麼要在合成的時候保證itemset1和itemset2中的前k-2個項相同呢?

我們這樣來思考,合成的待定頻繁項集lk可以看做為lk-1與l1連線而成,這裡連線的時候保證連線時的l1的項要大於lk-1的項,因為如果不大於的話,可能會出現這樣的無序項集['i1','i2','i5','i3'],由於頻繁項集的子集也是頻繁項集,故而['i1','i2','i3']是頻繁項集,故而其與l1連線可生成['i1','i2','i3','i5'],它與['i1','i2','i5','i3']是等價的,故而我們不妨將項集的格式都設為有序的,其並不影響我們的頻繁項集的合成過程。新頻繁項集lk是建立在lk-1上的,直接用lk-1與l1連線有時在我們看來有點大材小用,因為對於一些l1中的元素,其與lk-1連線後形成的lk的子集,有可能不在lk-1中,l1的範圍有點大,為簡化期間,我們可以直接讓lk-1中的項集與lk-1中其他項集中該項集不具備的項連線,這樣就簡化了問題,在廣度上降低演算法的複雜度。

關聯規則之apriori

import sys db 1,3,4 2,3,5 1,2,3,5 2,5 db1 l1 l2 l5 l2 l4 l2 l3 l1 l2 l4 l1 l3 l2 l3 l1 l3 l1 l2 l3 l5 l1 l2 l3 def convert db db return list map froze...

資料探勘之關聯規則挖掘之Apriori演算法實現

演算法細節見 fast algorithm for mining association rules 控制台版本c 如下 include include include include include include include using namespace std 讀取檔案獲取整個資料庫儲存...

關聯規則Apriori

首先介紹的是啤酒和尿布的故事 上網自查 這是學習關聯規則必須知道的乙個故事。頻繁項集,關聯規則,支援度,置信度這四個概念貫穿apriori演算法的始終。如果乙個集合不是頻繁相集,那它的超集比然也不是頻繁相集。機器學習實戰例子 coding utf 8 from numpy import def lo...