dataset=loaddataset();
//dataset:[[1, 3, 4], [2, 3, 5], [1, 2, 3, 5], [2, 5]]
//
l, supportdata=apriori(dataset);
//l:最終滿足支援度的全部組合項[[frozenset(), frozenset(), frozenset(), frozenset()], [frozenset(), frozenset(), frozenset(), frozenset()], [frozenset()], ]
supportdata:大部分記錄的支援度記錄
): 0.5, frozenset(): 0.75, frozenset(): 0.25, frozenset(): 0.75, frozenset(): 0.75, frozenset(): 0.5, frozenset(): 0.75, frozenset(): 0.5, frozenset(): 0.5, frozenset(): 0.25, frozenset(): 0.25, frozenset(): 0.5}
//
retlist=apriorigen(l[0],2);
//retlist:一項數字生成的兩項的組合[frozenset(), frozenset(), frozenset(), frozenset(), frozenset(), frozenset()]
//
演算法流程
#total aprioridef apriorigen(lk, k): #組合,向上合併
//lk:數字項的集合[frozenset(), frozenset(), frozenset(), frozenset()]
k:與項集元素個數 k
2//
#creates ck 引數:頻繁項集列表 lk 與項集元素個數 k
retlist =
lenlk = len(lk)
//lenlk:數字項的集合的長度4//
for i in range(lenlk):
//i:迴圈數字項的集合0//
for j in range(i+1, lenlk): #兩兩組合遍歷
//j:往後依次獲取數字項的組合1 //
l1 = list(lk[i])[:k-2]; l2 = list(lk[j])[:k-2]
//l1:lk[i]的前k-2項 l2:lk[j]的前k-2項 k:2//
l1.sort(); l2.sort()
//排序便於下面比較//
//#若兩個集合的前k-2個項相同時,則將兩個集合合併//
return retlist
#apriori
def apriori(dataset, minsupport = 0.5):
//dataset:點集[[1, 3, 4], [2, 3, 5], [1, 2, 3, 5], [2, 5]]
minsupport:最小支援度
//
c1 = createc1(dataset)
//c1:dataset最小[frozenset(), frozenset(), frozenset(), frozenset(), frozenset()]
//
d = list(map(set, dataset)) #python3
//d:dataset list map化?好像沒有必要直接使用dataset也是可以求scand[, , , ]
//
l1, supportdata = scand(d, c1, minsupport)#單項最小支援度判斷 0.5,生成l1
//l1:滿足0.5的點集[frozenset(), frozenset(), frozenset(), frozenset()]
supportdata:所有單數字的支援度
): 0.5, frozenset(): 0.75, frozenset(): 0.25, frozenset(): 0.75, frozenset(): 0.75}
//
l = [l1]
//l:記錄全部的頻繁項,包含組合[[frozenset(), frozenset(), frozenset(), frozenset()]]
//
k = 2
//組合個數的起點//
while (len(l[k-2]) > 0):#建立包含更大項集的更大列表,直到下乙個大的項集為空
//前一項數字個數的列表不為空時迴圈//
ck = apriorigen(l[k-2], k)#ck
//使用前乙個數字組合生成多乙個數的數字組合:注(演算法優化其實目前k直接是l[k-2]單個項的長度+1)ck: [frozenset(), frozenset(), frozenset(), frozenset(), frozenset(), frozenset()]
//
lk, supk = scand(d, ck, minsupport)#get lk
//ck中滿足支援度的點集和支援度情況lk:[frozenset(), frozenset(), frozenset(), frozenset()]
supk:): 0.5, frozenset(): 0.75, frozenset(): 0.5, frozenset(): 0.5, frozenset(): 0.25, frozenset(): 0.25}
//
supportdata.update(supk)
//支援度存入//
//滿足支援度的點組合存入//
k += 1
//#繼續向上合併 生成項集個數更多的//
return l, supportdata
//最終的頻繁項和全部組合的支援度//
Apriori演算法的介紹
資料探勘中的關聯分析可以分成頻繁項集的挖掘和關聯規則的生成兩個步驟,而apriori演算法是找頻繁項集最常用到的一種演算法。關於關聯分析和頻繁項集請見 什麼是關聯分析?我們還是利用購物籃的例子來講述apriori演算法的思路。購物籃資訊如下 tiditems 001cola,egg,ham 002c...
apriori演算法的學習
1993年美國學者agrawal提出通過分析購物籃中的商品集合,從而找出商品之間關聯關係的關聯演算法,並根據商品之間的關係,找出客戶的購買行為。agrawal從數學及計算機演算法角度提出了商品關聯關係的計算方法 apriori演算法。沃爾瑪從上個世紀90年代嘗試將aprior算 法引入到pos機資料...
Apriori演算法小結
1 apriori演算法是一種挖掘關聯規則的頻繁項集演算法,其核心思想是通過候選集生成挖掘頻繁項集。2 步驟 3 概念 對於a b 支援度 support p a b 既有a又有b 的概率 置信度 p b a p ab p a 在a 發生的事件中同時發生 b的概率 例如購物籃分析 牛奶 麵包例子 支...