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...