FP-growth算法发现频繁项集(二)——发现频繁项集
上篇介紹了如何構(gòu)建FP樹,FP樹的每條路徑都滿足最小支持度,我們需要做的是在一條路徑上尋找到更多的關(guān)聯(lián)關(guān)系。
抽取條件模式基
首先從FP樹頭指針表中的單個頻繁元素項開始。對于每一個元素項,獲得其對應的條件模式基(conditional pattern base),單個元素項的條件模式基也就是元素項的關(guān)鍵字。條件模式基是以所查找元素項為結(jié)尾的路徑集合。每一條路徑其實都是一條前輟路徑(perfix path)。簡而言之,一條前綴路徑是介于所査找元素項與樹根節(jié)點之間的所有內(nèi)容。
下圖是以{s:2}或{r:1}為元素項的前綴路徑:
{s}的條件模式基,即前綴路徑集合共有兩個:{{z,x,y,t}, {x}};{r}的條件模式基共三個:{{z}, {z,x,y,t}, {x,s}}。
尋找條件模式基的過程實際上是從FP樹的每個葉子節(jié)點回溯到根節(jié)點的過程。我們可以通過頭指針列表headTable開始,通過指針的連接快速訪問到所有根節(jié)點。下表是上圖FP樹的所有條件模式基:
創(chuàng)建條件FP樹
為了發(fā)現(xiàn)更多的頻繁項集,對于每一個頻繁項,都要創(chuàng)建一棵條件FP樹。可以使用剛才發(fā)現(xiàn)的條件模式基作為輸入數(shù)據(jù),并通過相同的建樹代碼來構(gòu)建這些樹。然后,遞歸地發(fā)現(xiàn)頻繁項、發(fā)現(xiàn)條件模式基,以及發(fā)現(xiàn)另外的條件樹。
以頻繁項r為例,構(gòu)建關(guān)于r的條件FP樹。r的三個前綴路徑分別是{z},{z,x,y,t},{x,s},設最小支持度minSupport=2,則y,t,s被過濾掉,剩下{z},{z,x},{x}。y,s,t雖然是條件模式基的一部分,但是并不屬于條件FP樹,即對于r來說,它們不是頻繁的。如下圖所示,y→t→r和s→r的全局支持度都為1,所以y,t,s對于r的條件樹來說是不頻繁的。
過濾后的r條件樹如下:
?
重復上面步驟,r的條件模式基是{z,x},{x},已經(jīng)沒有能夠滿足最小支持度的路徑, 所以r的條件樹僅有一個。需要注意的是,雖然{z,x},{x}中共存在兩個x,但{z,x}中,z是x的父節(jié)點,在構(gòu)造條件FP樹時不能直接將父節(jié)點移除,僅能從子節(jié)點開始逐級移除。
代碼如下:
1 def ascendTree(leafNode, prefixPath): 2 if leafNode.parent != None: 3 prefixPath.append(leafNode.name) 4 ascendTree(leafNode.parent, prefixPath) 5 6 def findPrefixPath(basePat, headTable): 7 condPats = {} 8 treeNode = headTable[basePat][1] 9 while treeNode != None: 10 prefixPath = [] 11 ascendTree(treeNode, prefixPath) 12 if len(prefixPath) > 1: 13 condPats[frozenset(prefixPath[1:])] = treeNode.count 14 treeNode = treeNode.nodeLink 15 return condPats 16 17 def mineTree(inTree, headerTable, minSup=1, preFix=set([]), freqItemList=[]): 18 # order by minSup asc, value asc 19 bigL = [v[0] for v in sorted(headerTable.items(), key=lambda p: (p[1][0],p[0]))] 20 for basePat in bigL: 21 newFreqSet = preFix.copy() 22 newFreqSet.add(basePat) 23 freqItemList.append(newFreqSet) 24 # 通過條件模式基找到的頻繁項集 25 condPattBases = findPrefixPath(basePat, headerTable) 26 myCondTree, myHead = createTree(condPattBases, minSup) 27 if myHead != None: 28 print('condPattBases: ', basePat, condPattBases) 29 myCondTree.disp() 30 print('*' * 30) 31 32 mineTree(myCondTree, myHead, minSup, newFreqSet, freqItemList) 33 34 simpDat = loadSimpDat() 35 dictDat = createInitSet(simpDat) 36 myFPTree,myheader = createTree(dictDat, 3) 37 myFPTree.disp() 38 condPats = findPrefixPath('z', myheader) 39 print('z', condPats) 40 condPats = findPrefixPath('x', myheader) 41 print('x', condPats) 42 condPats = findPrefixPath('y', myheader) 43 print('y', condPats) 44 condPats = findPrefixPath('t', myheader) 45 print('t', condPats) 46 condPats = findPrefixPath('s', myheader) 47 print('s', condPats) 48 condPats = findPrefixPath('r', myheader) 49 print('r', condPats) 50 51 mineTree(myFPTree, myheader, 2)控制臺信息:
本例可以發(fā)現(xiàn)兩個頻繁項集{z,x}和{x}。
取得頻繁項集后,可以根據(jù)置信度發(fā)現(xiàn)關(guān)聯(lián)規(guī)則,這一步較為簡單,可參考上篇的相關(guān)內(nèi)容,不在贅述。
?
?
? 參考文獻:《機器學習實戰(zhàn)》
??作者:我是8位的
??出處:http://www.cnblogs.com/bigmonkey
??本文以學習、研究和分享為主,如需轉(zhuǎn)載,請聯(lián)系本人,標明作者和出處,非商業(yè)用途!?
?
總結(jié)
以上是生活随笔為你收集整理的FP-growth算法发现频繁项集(二)——发现频繁项集的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 主成分分析的步骤
- 下一篇: 计算机网络原理自考真题,自考计算机网络原