1. apriori演算法簡介
apriori演算法是挖掘布林關聯規則頻繁項集的演算法。apriori演算法利用頻繁項集性質的先驗知識,通過逐層搜尋的迭代方法,即將k-項集用於探察(k+1)項集,來窮盡資料集中的所有頻繁項集。先找到頻繁項集1-項集集合l1, 然後用l1找到頻繁2-項集集合l2,接著用l2找l3,知道找不到頻繁k-項集,找到每個lk需要一次資料庫掃瞄。注意:頻繁項集的所有非空子集也必須是頻繁的。apriori性質通過減少搜尋空間,來提高頻繁項集逐層產生的效率。apriori演算法由連線和剪枝兩個步驟組成。
2. apriori演算法步驟
根據乙個例項來解釋:下圖是乙個交易單,i1至i5可看作5種商品。下面通過頻繁項集合來找出關聯規則。
假設我們的最小支援度閾值為2,即支援度計數小於2的都要刪除。
上表第一行(第一項交易)表示:i1和i2和i5一起被購買。
c1至l1的過程: 只需檢視支援度是否高於閾值,然後取捨。上圖c1中所有閾值都大於2,故l1中都保留。
l1至c2的過程分三步:
c2至l2的過程: 只需檢視支援度是否高於閾值,然後取捨。
l2至c3的過程:
還是上面的步驟。首先生成(1,2,3)、(1,2,4)、(1,2,5)....為什麼最後只剩(1,2,3)和(1,2,5)呢?因為剪枝過程:(1,2,4)拆分為(1,2)和(1,4)和(2,4).然而(1,4)在l2中不存在,即非頻繁項。所有剪枝刪除。然後對c3中剩下的組合進行計數。發現(1,2,3)和(1,2,5)的支援度2。迭代結束。
所以演算法過程就是 ck - lk - ck+1 的過程:
3.apriori演算法實現
#-*- coding: utf-8 -*-
"""created on sat dec 9 15:33:45 2017
@author: lps
"""import
numpy as np
from itertools import combinations #
迭代工具
data = [[1,2,5], [2,4], [2,3], [1,2,4], [1,3], [2,3], [1,3], [1,2,3,5], [1,2,3]]
minsp = 2d =
for i in
range(len(data)):
d.extend(data[i])
new_d =list(set(d))
def satisfy(s, s_new, k): #
更新確實存在的l
e = ss_new =
for i in
range(len(s_new)):
for j in combinations(s_new[i], k): #
迭代產生所有元素可能性組合
if ([l for l in e if l not
in s]) == :
e =return ss_new #
篩選滿足條件的結果
def count(s_new): #
返回narray格式的c
num =0
c =np.copy(s_new)
c =np.column_stack((c, np.zeros(c.shape[0])))
for i in
range(len(s_new)):
for j in
range(len(data)):
if ([l for l in s_new[i] if l not
in data[j]]) == :
num = num+1c[i,-1] =num
num =0
return
cdef limit(l): #
刪掉不滿足閾值的c
row =
for i in
range(l.shape[0]):
if l[i,-1]
l =np.delete(l, row, 0)
return
ldef generate(l, k): #
實現由l至c的轉換
s =for i in
range(l.shape[0]):
s_new =
#l = l.delete(l, -1, 1)
#l = l.shape[1]
for i in range(l.shape[0]-1):
for j in range(i+1, l.shape[0]):
if (l[j,-2]>l[i,-2]):
t =list(np.copy(s[i]))
#s_new為列表
s_new =satisfy(s, s_new, k)
c =count(s_new)
return
c
#初始的c與l
c = np.zeros([len(new_d), 2])
for i in
range(len(new_d)):
c[i:] =np.array([new_d[i], d.count(new_d[i])])
l =np.copy(c)
l =limit(l)
#開始迭代
k = 1
while (np.max(l[:,-1]) >minsp):
c =generate(l, k) # 由l產生c
l =limit(c) # 由c產生l
k = k+1
#對最終結果去重複
print((list(set([tuple(t) for t in
l])))
#結果為 [(1.0, 2.0, 3.0, 2.0), (1.0, 2.0, 5.0, 2.0)]
Apriori演算法Python實現
apriori如果資料探勘演算法的頭髮模式挖掘鼻祖,從60年代開始流行,該演算法非常簡單樸素的思維。首先挖掘長度1頻繁模式,然後k 2 這些頻繁模式的長度合併k頻繁模式。計算它們的頻繁的數目,並確保其充分k 1集長度為頻繁,值是,為了避免反覆。合併的時候。僅僅合併那些前k 2個字元都同樣,而k 1的...
Python實現Apriori演算法
整體流程如下圖所示 如上圖所示,整個 分為以下幾個模組 1 createc1 dataset 說明 該函式根據輸入的資料集dataset來生成候選1項集。2 get lk dataset,ck,min sup 說明 該函式根據候選項集ck,從資料集中搜尋,判斷ck中每個項集在資料集中的支援度 這裡用...
Apriori演算法的Python實現
apriori演算法是資料探勘中頻發模式挖掘的鼻祖,從60年代就開始流行,其演算法思想也十分簡單樸素,首先挖掘出長度為1的頻繁模式,然後k 2 將這些頻繁模式合併組成長度為k的頻繁模式,算出它們的頻繁次數,而且要保證其所有k 1長度的子集也是頻繁的,值得注意的是,為了避免重複,合併的時候,只合併那些...