Apriori 演算法python實現

來源:互聯網
上載者:User

標籤:idt   挖掘   es2017   ext   div   tool   列表   let   更新   

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演算法實現

# -*- coding: utf-8 -*-"""Created on Sat Dec  9 15:33:45 2017@author: LPS"""import numpy as npfrom 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):  # 迭代產生所有元素可能性組合            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.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+1        C[i,-1] = num        num = 0                  return Cdef 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 Ldef 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與LC = 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 = 1while (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實現

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.