日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

机器学习实战-FP-growth算法

發(fā)布時(shí)間:2024/1/1 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 机器学习实战-FP-growth算法 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本章內(nèi)容

  • 發(fā)現(xiàn)事物數(shù)據(jù)中的公共模式
  • FP-growth算法
  • 發(fā)現(xiàn)Twitter源中共現(xiàn)詞

搜索引擎自動(dòng)補(bǔ)全查詢此項(xiàng),可以找出互聯(lián)網(wǎng)上經(jīng)常一塊出現(xiàn)的詞對。這需要一種高效發(fā)現(xiàn)頻繁項(xiàng)集的方法。FP-growth比上一章討論的Apriori算法要快,它基于Apriori構(gòu)建,但在完成任務(wù)時(shí)采用不同的技術(shù)。這里的任務(wù)是將數(shù)據(jù)集存儲在一個(gè)特定的稱作FP樹的結(jié)構(gòu)之后發(fā)現(xiàn)頻繁項(xiàng)集或者頻繁項(xiàng)對,即常在一塊出現(xiàn)的元素項(xiàng)的集合FP樹。與Apriori相比,此算法執(zhí)行速度要快兩個(gè)數(shù)量級以上。但是,只能高效地發(fā)現(xiàn)頻繁項(xiàng)集,不能用于發(fā)現(xiàn)關(guān)聯(lián)規(guī)則。

FP-growth算法只需要對數(shù)據(jù)庫進(jìn)行兩次掃描,而Apriori對于每個(gè)潛在的頻繁項(xiàng)集都會(huì)掃描數(shù)據(jù)集判定給定模式是否頻繁,因此FP-growth性能更好,它發(fā)現(xiàn)頻繁項(xiàng)集的基本過程如下:

  • 構(gòu)建FP樹
  • 從FP樹種挖掘頻繁項(xiàng)集
  • 一、FP樹:用于編碼數(shù)據(jù)集的有效方式

    FP-growth算法將數(shù)據(jù)存儲在FP樹這種緊湊數(shù)據(jù)結(jié)構(gòu)中。FP代表頻繁模式(Frequent Pattern)。一顆FP樹與計(jì)算機(jī)科學(xué)中其他樹結(jié)構(gòu)類似,但它通過鏈接(link)來連接相似元素。



    圖1 一顆FP樹,包含著連接相似點(diǎn)的鏈接

    同搜索樹不同的是,一個(gè)元素項(xiàng)可以在一棵FP樹中出現(xiàn)多次。FP樹會(huì)存儲項(xiàng)集的出現(xiàn)頻率,而每個(gè)項(xiàng)集會(huì)以路徑的方式存儲在樹中。存在相似元素的集合會(huì)共享樹的一部分。只有當(dāng)集合之間完全不同時(shí),樹才會(huì)分叉。樹節(jié)點(diǎn)上給出集合中單個(gè)元素及其在序列中的出現(xiàn)次數(shù),路徑會(huì)給出該序列的出現(xiàn)次數(shù)。

    相似項(xiàng)之間的鏈接,即節(jié)點(diǎn)鏈接(node link),用于快速發(fā)現(xiàn)相似項(xiàng)的位置。上圖FP樹可由下表中的數(shù)據(jù)生成。

    表1 用于生成上圖中FP樹的事物數(shù)據(jù)樣例

    事物ID事物中的元素項(xiàng)
    001r,z,h,j,p
    002z,y,x,w,v,u,t,s
    003z
    004r,x,n,o,s
    005y,r,x,z,q,t,p
    006y,z,x,e,q,s,t,m


    在上圖中,元素項(xiàng)z出現(xiàn)了5次,集合{r, z}出現(xiàn)了1次。集合{t, s, y, x, z}出現(xiàn)了2次,集合{t, r, y, x, z}出現(xiàn)了1次。元素項(xiàng)z的右邊是5,表示z出現(xiàn)了5次,剛才已經(jīng)給出了四次出現(xiàn),所以它一定單獨(dú)出現(xiàn)過1次。005號記錄是{y, r, x, z, q, t, p},那么q、p去哪兒了呢?

    這里使用第11章給出的支持度定義,該指標(biāo)對應(yīng)一個(gè)最小閾值,低于最小閾值的元素項(xiàng)被認(rèn)為是不頻繁的。若將最小支持度設(shè)為3,然后應(yīng)用頻繁項(xiàng)分析算法,就會(huì)獲得出現(xiàn)3次或3次以上的項(xiàng)集。圖中FP樹的最小支持度是3,因此p、q并沒有出現(xiàn)在樹中。

    FP-growth算法的工作流程:首先構(gòu)建FP樹,然后利用它來挖掘頻繁項(xiàng)集。為了構(gòu)建FP樹,需要對原始數(shù)據(jù)集掃描兩遍。第一遍對所有元素項(xiàng)的出現(xiàn)次數(shù)進(jìn)行計(jì)數(shù)。Apriori原理,即如果某元素是不頻繁的,那么包含該元素的超集也是不頻繁的,所以就不需要考慮超集。數(shù)據(jù)庫的第一遍掃描用來統(tǒng)計(jì)出現(xiàn)的頻率,第二遍掃描中只考慮哪些頻繁元素。

    二、構(gòu)建FP樹

    使用一個(gè)容器來保存FP樹。

    2-1 創(chuàng)建FP樹的數(shù)據(jù)結(jié)構(gòu)

    要?jiǎng)?chuàng)建一個(gè)類來保存樹的每個(gè)節(jié)點(diǎn)。創(chuàng)建fpGrowth.py,加入下列代碼。

    # coding=utf-8class treeNode :def __init__(self, nameValue, numOccur, parentNode) :# 節(jié)點(diǎn)名稱self.name = nameValueself.count = numOccur# 用于鏈接相似的元素項(xiàng)self.nodeLink = None# 當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn)self.parent = parentNode# 用于存放節(jié)點(diǎn)的子節(jié)點(diǎn)self.children = {}# 對count變量增加給定值def inc(self, numOccur) :self.count += numOccur# 將樹以文本的形式顯示def disp(self, ind=1) :print ' '*ind, self.name, ' ', self.countfor child in self.children.values() :child.disp(ind+1)
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    運(yùn)行程序結(jié)果:

    >>> import ml.fpGrowth as fpGrowth >>> rootNode = fpGrowth.treeNode('pyramid',9,None) >>> rootNode.children['eye'] = fpGrowth.treeNode('eye',13,None) >>> rootNode.disp()pyramid 9eye 13 >>> rootNode.children['phoenix']=fpGrowth.treeNode('phoenix',3,None) >>> rootNode.disp()pyramid 9eye 13phoenix 3
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    2-2 構(gòu)建FP樹

    除圖1給出的FP樹之外,還需要一個(gè)頭指針表來指向給定類型的第一個(gè)實(shí)例。利用頭指針表,可快速訪問FP樹中一個(gè)給定類型的所有元素。下圖2給出了一個(gè)頭指針表的示意圖。



    圖2 帶頭指針表的FP樹,頭指針表作為一個(gè)起始指針來發(fā)現(xiàn)相似元素項(xiàng)

    這里使用一個(gè)字典來保存頭指針表。除了存放指針外,頭指針表還可以用來保存FP樹中每類元素的總數(shù)。

    第一次遍歷數(shù)據(jù)集獲得每個(gè)元素項(xiàng)的出現(xiàn)頻率。接著,去掉不滿足最小支持度的元素項(xiàng),再構(gòu)建FP樹。在構(gòu)建時(shí),讀入每個(gè)項(xiàng)集并將其添加到一條已經(jīng)存在的路徑中。如果該路徑不存在,則創(chuàng)建一條新路徑。每個(gè)事務(wù)就是一個(gè)無序集合。假設(shè)有集合{z, x, y}和{y, z, r},那么在FP樹中,相同項(xiàng)會(huì)只表示一次。為了解決此問題,在將集合添加到樹之前,需要對每個(gè)集合進(jìn)行排序。排序基于元素項(xiàng)的絕對出現(xiàn)頻率來進(jìn)行。使用圖2中頭指針節(jié)點(diǎn)值,對表1中數(shù)據(jù)進(jìn)行過濾,重排序后的數(shù)據(jù)顯示在表2中。

    表12-2 將非頻繁項(xiàng)移除并且重排序后的事務(wù)數(shù)據(jù)集

    事務(wù)ID事務(wù)中的元素項(xiàng)過濾及重排序后的事務(wù)
    001r, z, h, j, pz, r
    002z, y, x, w, v, u, t, sz, x, y, s, t
    003zz
    004r, x, n, o, sx, s, r
    005y, r, x, z, q, t, pz, x, y, r, t
    006y, z, x, e, q, s, t, mz, x, y, s, t


    在對事務(wù)記錄過濾和排序之后,就可以構(gòu)建FP樹了。從空集(符號為??)開始,向其中不斷添加頻繁項(xiàng)集。過濾、排序后的事務(wù)依次添加到樹中,如果樹中已存在現(xiàn)有元素,則增加現(xiàn)有元素的值;如果現(xiàn)有元素不存在,則向樹添加一個(gè)分枝。對表2前兩條事務(wù)進(jìn)行添加的過程顯示在圖3中。



    圖3 FP樹構(gòu)建過程的一個(gè)示意圖,圖中給出了使用表2中數(shù)據(jù)構(gòu)建FP樹的前兩步

    下面代碼用于實(shí)現(xiàn)上述過程。

    # FP樹構(gòu)建函數(shù) # 使用數(shù)據(jù)集以及最小支持度作為參數(shù)來構(gòu)建FP樹。樹構(gòu)建過程會(huì)遍歷數(shù)據(jù)集兩次。 def createTree(dataSet, minSup=1) :headerTable = {}# 第一次遍歷掃描數(shù)據(jù)集并統(tǒng)計(jì)每個(gè)元素項(xiàng)出現(xiàn)的頻度。這些信息被保存在頭指針中。for trans in dataSet :for item in trans :headerTable[item] = headerTable.get(item, 0) + dataSet[trans]# 接著掃描頭指針表刪除那些出現(xiàn)次數(shù)小于minSup的項(xiàng)。for k in headerTable.keys() :if headerTable[k] < minSup :del(headerTable[k])freqItemSet = set(headerTable.keys())# 如果所有項(xiàng)都不頻繁,無需下一步處理if len(freqItemSet) == 0 : return None, None# 對頭指針表稍加擴(kuò)展以便可以保存計(jì)數(shù)值及指向每種類型第一個(gè)元素項(xiàng)的指針for k in headerTable :headerTable[k] = [headerTable[k], None]# 創(chuàng)建只包含空集合的根節(jié)點(diǎn)retTree = treeNode('Null Set', 1, None)for tranSet, count in dataSet.items() :localD = {}# 根據(jù)全局頻率對每個(gè)事務(wù)中的元素進(jìn)行排序for item in tranSet :if item in freqItemSet :localD[item] = headerTable[item][0]if len(localD) > 0 :orderedItems = [v[0] for v in sorted(localD.items(), key=lambda p : p[1], reverse=True)]# 排序后,調(diào)用updateTree()方法updateTree(orderedItems, retTree, headerTable, count)return retTree, headerTable# 為了讓FP樹生長,需調(diào)用updateTree函數(shù)。 def updateTree(items, inTree, headerTable, count) :# 該函數(shù)首先測試事務(wù)中的第一個(gè)元素項(xiàng)是否作為子節(jié)點(diǎn)存在。if items[0] in inTree.children :# 如果存在,則更新該元素項(xiàng)的計(jì)數(shù)inTree.children[items[0]].inc(count)else :# 如果不存在,則創(chuàng)建一個(gè)新的treeNode并將其作為一個(gè)子節(jié)點(diǎn)添加到樹中,這時(shí),頭指針表也要更新以指向新的節(jié)點(diǎn)。inTree.children[items[0]] = treeNode(items[0], count, inTree)if headerTable[items[0]][1] == None :headerTable[items[0]][1] = inTree.children[items[0]]else :# 更新頭指針表需要調(diào)用函數(shù)updateHeaderupdateHeader(headerTable[items[0]][1], inTree.children[items[0]])# updateTree()完成的最后一件事是不斷迭代調(diào)用自身,每次調(diào)用時(shí)會(huì)去掉列表中的第一個(gè)元素if len(items) > 1 :updateTree(items[1::], inTree.children[items[0]], headerTable, count)# 確保節(jié)點(diǎn)鏈接指向樹中該元素項(xiàng)的每一個(gè)實(shí)例,從頭指針的nodeLink開始,一直沿著nodeLink直到到達(dá)鏈表末尾。 # 當(dāng)處理樹的時(shí)候,一種自然的反應(yīng)就是迭代完整每一件事。當(dāng)以相同方式處理鏈表時(shí)可能會(huì)遇到一些問題, # 原因是如果鏈表很長可能會(huì)遇到迭代調(diào)用的次數(shù)限制 def updateHeader(nodeToTest, targetNode) :while (nodeToTest.nodeLink != None) :nodeToTest = nodeToTest.nodeLinknodeToTest.nodeLink = targetNode
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57

    運(yùn)行上例之前,需要一個(gè)真正的數(shù)據(jù)集,使用下面代碼裝入數(shù)據(jù):

    # 載入數(shù)據(jù)集 def loadSimpDat() :simpDat = [ ['r', 'z', 'h', 'j', 'p' ],['z', 'y', 'x', 'w', 'v', 'u', 't', 's' ],['z' ],['r', 'x', 'n', 'o', 's' ],['y', 'r', 'x', 'z', 'q', 't', 'p' ],['y', 'z', 'x', 'e', 'q', 's', 't', 'm' ] ]return simpDat# 從列表向字典的類型轉(zhuǎn)換 def createInitSet(dataSet) :retDict = {}for trans in dataSet :retDict[frozenset(trans)] = 1return retDict
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    上面代碼運(yùn)行結(jié)果:

    >>> reload(fpGrowth) <module 'ml.fpGrowth' from 'C:\Python27\ml\fpGrowth.pyc'> >>> simpDat = fpGrowth.loadSimpDat() >>> simpDat [['r', 'z', 'h', 'j', 'p'], ['z', 'y', 'x', 'w', 'v', 'u', 't', 's'], ['z'], ['r ', 'x', 'n', 'o', 's'], ['y', 'r', 'x', 'z', 'q', 't', 'p'], ['y', 'z', 'x', 'e' , 'q', 's', 't', 'm']] >>> initSet = fpGrowth.createInitSet(simpDat) >>> initSet {frozenset(['e', 'm', 'q', 's', 't', 'y', 'x', 'z']): 1, frozenset(['x', 's', 'r ', 'o', 'n']): 1, frozenset(['s', 'u', 't', 'w', 'v', 'y', 'x', 'z']): 1, frozen set(['q', 'p', 'r', 't', 'y', 'x', 'z']): 1, frozenset(['h', 'r', 'z', 'p', 'j'] ): 1, frozenset(['z']): 1} >>> myFPtree, myHeaderTab = fpGrowth.createTree(initSet, 3) >>> myFPtree.disp()Null Set 1x 1s 1r 1z 5x 3y 3s 2t 2r 1t 1r 1 >>>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    三、從一棵FP樹中挖掘頻繁項(xiàng)集

    有了FP樹后,就可以抽取頻繁項(xiàng)集了,思路與Apriori算法大致類似,首先從單元素項(xiàng)集合開始,然后在此基礎(chǔ)上逐步構(gòu)建更大的集合。從FP樹中抽取頻繁項(xiàng)集的三個(gè)基本步驟如下:

  • 從FP樹中獲得條件模式基;
  • 利用條件模式基,構(gòu)建一個(gè)條件FP樹;
  • 迭代重復(fù)步驟1、2,直到樹包含一個(gè)元素項(xiàng)為止。
  • 需重點(diǎn)關(guān)注第1步,即尋找條件模式基的過程。之后,為每一條件模式基創(chuàng)建對應(yīng)的條件FP樹。最后需構(gòu)造少許代碼來封裝上述兩個(gè)函數(shù),并從FP樹中獲得頻繁項(xiàng)集。

    3-1 抽取條件模式基

    首先從保存在頭指針中的單個(gè)頻繁元素項(xiàng)開始。對于每個(gè)元素項(xiàng),獲得其對應(yīng)的條件模式基(conditional pattern base)。條件模式基是以所查找元素項(xiàng)為結(jié)尾的路徑集合。每一條路徑其實(shí)都是一條前綴路徑(prefix path)。簡而言之,一條前綴路徑是介于所查找元素項(xiàng)與樹根節(jié)點(diǎn)之間的所有內(nèi)容。

    在圖2中,符號r的前綴路徑是{x, s}、{z, x, y}和{z}。每條前綴路徑都與一個(gè)計(jì)數(shù)值關(guān)聯(lián)。該計(jì)數(shù)值等于起始元素項(xiàng)的計(jì)數(shù)值,該計(jì)數(shù)值給了每條路徑上r的數(shù)目。表3列出了上例當(dāng)中每一個(gè)頻繁項(xiàng)的所有前綴路徑。

    表3 每個(gè)頻繁項(xiàng)的前綴路徑

    頻繁項(xiàng)前綴路徑
    z{}5
    r{x, s}1, {z, x, y}1, {z}1
    x{z}3, {}1
    y{z, x}3
    s{z, x, y}2, {x}1
    t{z, x, y, s}2, {z, x, y, r}1


    前綴路徑被用于構(gòu)建條件FP樹。為了獲得這些前綴路徑,可以對樹進(jìn)行窮舉式搜索,直到獲得想要的頻繁項(xiàng)為止,或使用一個(gè)更有效的方法來加速搜索過程。可以利用先前創(chuàng)建的頭指針來得到一種更有效的方法。頭指針表包含相同類型元素鏈表的起始指針。一旦到達(dá)了每一個(gè)元素項(xiàng),就可以上溯這棵樹直到根節(jié)點(diǎn)為止。下面代碼給出了如何發(fā)現(xiàn)前綴路徑。

    def ascendTree(leafNode, prefixPath) :# 迭代上溯整棵樹if leafNode.parent != None :prefixPath.append(leafNode)ascendTree(leafNode.parent, prefixPath)# 遍歷鏈表直到到達(dá)結(jié)尾。每遇到一個(gè)元素項(xiàng)都會(huì)調(diào)用ascendTree()來上溯FP樹,并收集所有遇到的元素項(xiàng)的名稱。 # 該列表返回之后添加到條件模式基字典condPats中 def findPrefixPath(basePat, treeNode) :condPats = {}while treeNode != None :prefixPath = []ascendTree(treeNode, prefixPath)if len(prefixPath) > 1 :condPats[frozenset(prefixPath[1:])] = treeNode.counttreeNode = treeNode.nodeLinkreturn condPats
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    運(yùn)行效果:

    >>> reload(fpGrowth) <module 'ml.fpGrowth' from 'C:\Python27\ml\fpGrowth.pyc'> >>> fpGrowth.findPrefixPath('x', myHeaderTab['x'][1]) {frozenset(['z']): 3} >>> fpGrowth.findPrefixPath('z', myHeaderTab['z'][1]) {} >>> fpGrowth.findPrefixPath('r', myHeaderTab['r'][1]) {frozenset(['x', 's']): 1, frozenset(['z']): 1, frozenset(['y', 'x', 'z']): 1}
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    3-2 創(chuàng)建條件FP樹

    對于每個(gè)頻繁項(xiàng),都創(chuàng)建一棵條件FP樹。我們會(huì)為z、x以及其他頻繁項(xiàng)構(gòu)建條件樹。可以使用剛才發(fā)現(xiàn)的條件模式基作為輸入數(shù)據(jù),并通過相同的建樹代碼來構(gòu)建這些樹。然后,我們會(huì)遞歸地發(fā)現(xiàn)頻繁項(xiàng)、發(fā)現(xiàn)條件模式基,以及發(fā)現(xiàn)另外的條件樹。舉個(gè)例子,假定為頻繁項(xiàng) t 創(chuàng)建一個(gè)條件FP樹,然后對{t, y}、{t, x}、……重復(fù)該過程。元素項(xiàng)t的條件FP樹的構(gòu)建過程如圖4所示。



    圖4 t的條件FP樹的創(chuàng)建過程。最初樹以空集作為根節(jié)點(diǎn),接著,原始的集合{y, x, s, z}中的集合{y, x, z}被添加進(jìn)來。因?yàn)椴粷M足最小支持度要求,字符s并沒有加入進(jìn)來。類似地,{y, x, z}也從原始集合{y, x, r, z}中添加進(jìn)來。

    在圖4中,元素項(xiàng)s、r是條件模式基的一部分,但它們并不屬于條件FP樹。單獨(dú)來看它們都是頻繁項(xiàng),但是在t的條件樹中,它們卻不是頻繁的,也就是說{t, r}、{t, s}是不頻繁的。

    接下來,對集合{t, z}、{t, x}、{t, y}來挖掘?qū)?yīng)的條件樹。這會(huì)產(chǎn)生更復(fù)雜的頻繁項(xiàng)集。該過程重復(fù)進(jìn)行,直到條件樹中沒有元素為止,然后就可以停止了。實(shí)現(xiàn)代碼很直觀,使用一些遞歸加上之前寫的代碼即可。具體如下:

    def mineTree(inTree, headerTable, minSup, preFix, freqItemList) :# 對頭指針表中元素項(xiàng)按照其出現(xiàn)頻率進(jìn)行排序,默認(rèn)是從小到大bigL = [v[0] for v in sorted(headerTable.items(), key=lambda p:p[1])]# 默認(rèn)是從小到大,下面過程是從頭指針的底端開始for basePat in bigL :newFreqSet = preFix.copy()newFreqSet.add(basePat)# 將每個(gè)頻繁項(xiàng)添加到頻繁項(xiàng)集列表freqItemList中freqItemList.append(newFreqSet)# 使用findPrefixPath()創(chuàng)建條件基condPattBases = findPrefixPath(basePat, headerTable[basePat][1])# 將條件基condPattBases作為新數(shù)據(jù)集傳遞給createTree()函數(shù)# 這里為函數(shù)createTree()添加足夠的靈活性,確保它可以被重用于構(gòu)建條件樹myCondTree, myHead = createTree(condPattBases, minSup)# 如果樹中有元素項(xiàng)的話,遞歸調(diào)用mineTree()函數(shù)if myHead != None :print 'conditional tree for: ', newFreqSetmyCondTree.disp()mineTree(myCondTree, myHead, minSup, newFreqSet, freqItemList)
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    代碼運(yùn)行效果:

    >>> reload(fpGrowth) <module 'ml.fpGrowth' from 'C:\Python27\ml\fpGrowth.pyc'> >>> freqItems = [] # 顯示所有條件樹 >>> fpGrowth.mineTree(myFPtree, myHeaderTab, 3, set([]), freqItems) conditional tree for: set(['y'])Null Set 1x 3z 3 conditional tree for: set(['y', 'z'])Null Set 1x 3 conditional tree for: set(['s'])Null Set 1x 3 conditional tree for: set(['t'])Null Set 1y 3x 3z 3 conditional tree for: set(['x', 't'])Null Set 1y 3 conditional tree for: set(['z', 't'])Null Set 1y 3x 3 conditional tree for: set(['x', 'z', 't'])Null Set 1y 3 conditional tree for: set(['x'])Null Set 1z 3 # 檢查返回的項(xiàng)集是否與條件樹匹配 >>> freqItems [set(['y']), set(['y', 'x']), set(['y', 'z']), set(['y', 'x', 'z']), set(['s']),set(['x', 's']), set(['t']), set(['y', 't']), set(['x', 't']), set(['y', 'x', ' t']), set(['z', 't']), set(['y', 'z', 't']), set(['x', 'z', 't']), set(['y', 'x' , 'z', 't']), set(['r']), set(['x']), set(['x', 'z']), set(['z'])]
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    5 示例:從新聞網(wǎng)站點(diǎn)擊流中挖掘

    >>> parsedDat = [line.split() for line in open('c:\python27\\kosarak.dat').readlines()] >>> initSet = fpGrowth.createInitSet(parsedDat) >>> myFPtree, myHeaderTab = fpGrowth.createTree(initSet, 100000) >>> myFreqList = [] >>> fpGrowth.mineTree(myFPtree, myHeaderTab, 100000, set([]), myFreqList) conditional tree for: set(['1'])Null Set 16 107404 conditional tree for: set(['3'])Null Set 111 97186 18628911 117401 conditional tree for: set(['11', '3'])Null Set 16 117401 conditional tree for: set(['11'])Null Set 16 261773 >>> len(myFreqList) 9 >>> myFreqList [set(['1']), set(['1', '6']), set(['3']), set(['11', '3']), set(['11', '3', '6'] ), set(['3', '6']), set(['11']), set(['11', '6']), set(['6'])]
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    6 小結(jié)

    FP-growth算法是一種用于發(fā)現(xiàn)數(shù)據(jù)集中頻繁模式的有效方法。FP-growth算法利用Apriori原則,執(zhí)行更快。Apriori算法產(chǎn)生候選項(xiàng)集,然后掃描數(shù)據(jù)集來檢查它們是否頻繁。由于只對數(shù)據(jù)集掃描兩次,因此FP-growth算法執(zhí)行更快。在FP-growth算法中,數(shù)據(jù)集存儲在FP樹中。FP樹構(gòu)建完成后,可以通過查找元素項(xiàng)的條件基,及構(gòu)建條件FP樹來發(fā)現(xiàn)頻繁項(xiàng)集。該過程不斷以更多元素作為條件重復(fù)進(jìn)行,直到FP樹只包含一個(gè)元素為止。

    可以使用FP-growth算法在多種文本文檔中查找頻繁單詞。

    總結(jié)

    以上是生活随笔為你收集整理的机器学习实战-FP-growth算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。