Python實現Apriori演算法

2021-10-01 11:34:48 字數 4116 閱讀 5150

整體流程如下圖所示:

如上圖所示,整個**分為以下幾個模組:

1)createc1(dataset)

說明:該函式根據輸入的資料集dataset來生成候選1項集。

2)get_lk(dataset, ck, min_sup)

說明:該函式根據候選項集ck,從資料集中搜尋,判斷ck中每個項集在資料集中的支援度(這裡用出現次數表示)是否 >= min_sup。min_sup為手動指定的最小支援度閾值,**中以出現次數作為支援度的表示,因此min_sup應該為乙個整數。

3)createck(lk, k)

說明:該函式根據頻繁項集lk

-1 ,建立候選項集ck。引數中的k表示將要構造的ck中每一項的長度。

4)apriori(dataset, min_sup=2)

說明:該函式是最終的函式,將前三個函式模組整合到一起,根據輸入的資料集獲取所有的頻繁項集。這裡預設最小支援度min_sup=2。

#!/usr/bin/env python

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

""" @author : sword

@date : 2019/12/14

@time : 下午 22:13

@version : v1.0

@file : apriori.py

@describe :關聯規則 -- 經驗演算法

"""def

createc1

(dataset)

:"""

根據輸入的資料集dataset生成候選1項集

"""# c1:存放候選1項集的列表

c1 =

# 從資料集中取出乙個事物記錄

# 每個事物記錄都是由多個項組成的列表

for t in dataset:

for item in t:

# 判斷c1中是否有這個項

# 因為是1項集,所以每個項都應該是乙個集合

# **中用list表示集合

if[item]

notin c1:

[item]

)# 使用frozenset來凍結c1中的每個元素,方便後續建立字典(key -> value)

return

list

(map

(frozenset

, c1)

)def

get_lk

(dataset, ck, min_sup)

:"""

根據候選項集ck,從資料集中搜尋ck中每個項集在資料集中支援度是否 >= min_sup

根據候選項集ck,得到頻繁項集lk

"""# 建立乙個字典,用於存放各項集及其出現次數.key => item_name, value => count

frequent_dict =

for ck in ck:

for t in dataset:

if ck.issubset(t)

:# 判斷frequent_dict中是否包含當前的項

# 如果沒有,則新增該項,並令該項的計數為1

# 否則,令該項的計數+1

ifnot frequent_dict.__contains__(ck)

: frequent_dict[ck]=1

else

: frequent_dict[ck]+=1

# 建立乙個字典,用於存放項集與支援度的關係

# key => item_name, value => sup(支援度)

item_sup =

# frequent_item:用於存放頻繁項集

frequent_item =

for f_item, value in frequent_dict.items():

if value >= min_sup:

item_sup[f_item]

= value

return frequent_item, item_sup

defcreateck

(lk, k)

:"""

根據頻繁項集l(k-1),建立候選項集ck,這裡用lk表示l(k-1)

k:表示將要構造的ck中每一項的長度

"""# 建立乙個列表,存放ck

get_ck =

for i in

range

(len

(lk)):

for j in

range

(i +1,

len(lk)):

iflen

(lk[i]

| lk[j]

)== k:

| lk[j]

)return

list

(set

(get_ck)

)def

apriori

(dataset, min_sup=2)

:"""

apriori演算法:生成所有頻繁項集

"""# 獲取候選1項集

c1 = createc1(dataset)

# 建立乙個列表all_fre_item:存放所有頻繁項集

# 獲取頻繁1項集

l1, item_sup = get_lk(dataset, c1, min_sup)

# 預設初始有頻繁1項集l1

all_fre_item =

[l1]

# k=2:k從2開始迴圈

k =2# 迴圈獲取頻繁項集

# 終止條件:新生成的頻繁項集不為空

while

(len

(all_fre_item[k-2]

)>0)

: ck = createck(all_fre_item[k-2]

, k)

iflen

(ck)==0

:break

lk, item_sup_k = get_lk(dataset, ck, min_sup)

# item_sup為字典,每次迴圈呼叫update進行更新,存放所有頻繁項集與其支援度

item_sup.update(item_sup_k)

k +=

1return all_fre_item, item_sup

if __name__ ==

"__main__"

: dataset =[[

1,3,

4],[

1,3,

4],[

2,3,

5],[

1,2,

3,5]

,[2,

5]] fre_item, item_sup = apriori(dataset)

print

('fre_item:\n'

, fre_item)

print

('item_sup:\n'

, item_sup)

輸出結果如下所示:

fre_item:

[[frozenset(), frozenset(), frozenset(), frozenset(), frozenset()], [frozenset(), frozenset(), frozenset(), frozenset(), frozenset(), frozenset()], [frozenset(), frozenset()]]

item_sup:

): 3, frozenset(): 4, frozenset(): 2, frozenset(): 3, frozenset(): 3, frozenset(): 2, frozenset(): 2, frozenset(): 2, frozenset(): 2, frozenset(): 3, frozenset(): 3, frozenset(): 2, frozenset(): 2}

注:**參考這位博主的**,進行了一些整理。

Apriori演算法Python實現

apriori如果資料探勘演算法的頭髮模式挖掘鼻祖,從60年代開始流行,該演算法非常簡單樸素的思維。首先挖掘長度1頻繁模式,然後k 2 這些頻繁模式的長度合併k頻繁模式。計算它們的頻繁的數目,並確保其充分k 1集長度為頻繁,值是,為了避免反覆。合併的時候。僅僅合併那些前k 2個字元都同樣,而k 1的...

Apriori 演算法python實現

1.apriori演算法簡介 apriori演算法是挖掘布林關聯規則頻繁項集的演算法。apriori演算法利用頻繁項集性質的先驗知識,通過逐層搜尋的迭代方法,即將k 項集用於探察 k 1 項集,來窮盡資料集中的所有頻繁項集。先找到頻繁項集1 項集集合l1,然後用l1找到頻繁2 項集集合l2,接著用l...

Apriori演算法的Python實現

apriori演算法是資料探勘中頻發模式挖掘的鼻祖,從60年代就開始流行,其演算法思想也十分簡單樸素,首先挖掘出長度為1的頻繁模式,然後k 2 將這些頻繁模式合併組成長度為k的頻繁模式,算出它們的頻繁次數,而且要保證其所有k 1長度的子集也是頻繁的,值得注意的是,為了避免重複,合併的時候,只合併那些...