国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

python中Apriori算法實現講解

2020-02-16 11:00:54
字體:
來源:轉載
供稿:網友

本文主要給大家講解了Apriori算法的基礎知識以及Apriori算法python中的實現過程,以下是所有內容:

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)]            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 冀州市| 阿尔山市| 龙游县| 古交市| 读书| 梧州市| 隆子县| 景宁| 内乡县| 阳城县| 历史| 银川市| 尼勒克县| 西丰县| 淮滨县| 茶陵县| 招远市| 合作市| 改则县| 庆城县| 南平市| 新和县| 广东省| 康定县| 汕头市| 化德县| 日土县| 思茅市| 台江县| 太谷县| 思南县| 涟水县| 永顺县| 如皋市| 石门县| 家居| 呼伦贝尔市| 泾阳县| 射阳县| 鄂伦春自治旗| 巍山|