python中Apriori演算法實現講解

2022-09-27 06:36:12 字數 3120 閱讀 5598

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的過程分三步:

遍歷產生l1中所有可能性組合,即(i1,i2)...(i4,i5 )    對便利產生的每個組合進行拆分,以保證頻繁項集的所有非空子集也必須是頻繁的。即對於(i1,i2)來說進行拆分為i1,i2.由於i1和i2在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演算法實現

# -*- codinwww.cppcns.comg: 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 = 2

d =

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): # 迭代產生所有元素可能性組合

e.append(list(j))

if ([l for l in e if l not in s]) == :

ss_new.append(s_new[i])

e =

return ss_new # 篩選滿足條件的結果

def count(s_new): # 返回narray格式的c

num = 0

c = np.copy(s_new)

c = np.colum程式設計客棧n_stack((c, np.zeros(c.shape[0])))

for i in range(len(s_new)):

for j in ran

if ([l for l in s_new[i] if l not in data[j]]) == :

num = num+1

c[i,-1] = num

num = 0

return c

def limit(l): # 刪掉不滿足閾值的c

row =

for i in range(l.shape[0]):

if l[i,-1] < minsp :

row.append(i)

l = np.delete(l, row, 0)

return l

def generate(l, k): # 實現由l至c的轉換

s =

for i in range(l.shape[0]):

s.append(list(l[i,:-1]))

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]))

t.append(l[j,-2])

s_new.append(t) # 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)]

本文標題: python中apriori演算法實現講解

本文位址:

apriori演算法實現 FP Growth演算法簡介

由於apriori演算法在挖掘頻繁模式時,需要多次掃瞄資料庫,並且會產生大量的候選項集。所以apriori演算法的時間複雜度和空間複雜度相對都很高,演算法執行效率不高。而fp growth演算法在進行頻繁模式挖掘時,只需要對資料庫進行兩次掃瞄,並且不會產生候選項集。它的效率相比於apriori演算法...

Apriori演算法分析以及FP tree演算法

提高apriori演算法的有效性 主要的挑戰 1.要對資料進行多次掃瞄 2.會產生大量的候選集 3.對候選項集的支援度計算會非常繁瑣 解決思路 1.減少對資料的掃瞄 2.縮小產生的候選項集 3.改進對候選項集的支援度的計算方法 方法1 基於hash表的項集計數 將每個項集通過相應的hash函式對映到...

深度解析資料探勘關聯規則Apriori演算法

01 關聯規則挖掘背景和基本概念 如下所示的資料集,表中的每一行代表一次購買清單,注意我們只關心記錄出現與否,不關心某條記錄購買了幾次,如購買十盒牛奶也只計一次。資料記錄的所有項的集合稱為總項集,上表中的總項集 s 關聯規則 就是有關聯的規則,形式是這樣定義的 兩個不相交的非空集合x y,如果有 x...