FP-growth算法發現頻繁項集(二)——發現頻繁項集


  上篇介紹了如何構建FP樹,FP樹的每條路徑都滿足最小支持度,我們需要做的是在一條路徑上尋找到更多的關聯關系。

抽取條件模式基

  首先從FP樹頭指針表中的單個頻繁元素項開始。對於每一個元素項,獲得其對應的條件模式基(conditional pattern base),單個元素項的條件模式基也就是元素項的關鍵字。條件模式基是以所查找元素項為結尾的路徑集合。每一條路徑其實都是一條前輟路徑(perfix path)。簡而言之,一條前綴路徑是介於所査找元素項與樹根節點之間的所有內容。

  下圖是以{s:2}或{r:1}為元素項的前綴路徑:

  {s}的條件模式基,即前綴路徑集合共有兩個:{{z,x,y,t}, {x}};{r}的條件模式基共三個:{{z}, {z,x,y,t}, {x,s}}。

  尋找條件模式基的過程實際上是從FP樹的每個葉子節點回溯到根節點的過程。我們可以通過頭指針列表headTable開始,通過指針的連接快速訪問到所有根節點。下表是上圖FP樹的所有條件模式基:

創建條件FP樹

  為了發現更多的頻繁項集,對於每一個頻繁項,都要創建一棵條件FP樹。可以使用剛才發現的條件模式基作為輸入數據,並通過相同的建樹代碼來構建這些樹。然后,遞歸地發現頻繁項、發現條件模式基,以及發現另外的條件樹。

  以頻繁項r為例,構建關於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},已經沒有能夠滿足最小支持度的路徑, 所以r的條件樹僅有一個。需要注意的是,雖然{z,x},{x}中共存在兩個x,但{z,x}中,z是x的父節點,在構造條件FP樹時不能直接將父節點移除,僅能從子節點開始逐級移除。

  代碼如下:

 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)

  控制台信息:

  本例可以發現兩個頻繁項集{z,x}和{x}。

  取得頻繁項集后,可以根據置信度發現關聯規則,這一步較為簡單,可參考上篇的相關內容,不在贅述。

 


   出處:微信公眾號 "我是8位的"

   本文以學習、研究和分享為主,如需轉載,請聯系本人,標明作者和出處,非商業用途! 

   掃描二維碼關注作者公眾號“我是8位的”


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM