Apriori 演算法python實現

2022-07-04 11:30:15 字數 3291 閱讀 8008

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長度的子集也是頻繁的,值得注意的是,為了避免重複,合併的時候,只合併那些...