整體流程如下圖所示:
如上圖所示,整個**分為以下幾個模組:
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長度的子集也是頻繁的,值得注意的是,為了避免重複,合併的時候,只合併那些...