机器学习(九)—FP-growth算法 – Yabea

  先前,校长要我结论Hadoop。,还勃起的了Ubuntu,分配额Hadoop,我不时没察觉到的何雪圻。,并且,我否则想先看一眼我最喜欢的算法。,结论Hadoop将临时性积蓄。,不外否则想问一下园子里的同行有什么结论Hadoop好点的材料,销路引荐,遵照Apriori算法,瞄准来结论FP-growth算法。

  与Apriori算法的对比地,FP-growth算法只必要对唱片库举行两遍遍历,频繁项集的高效撞见。搜索引擎公司,他们必要检查因特网上的单词来找出AP的单词。,故此,这些公司必要能撞见频繁论文集Eff.,瞄准要结论的FP-growth算法就可以完成的此重担。

一 FP-growth算法                    

1。概述

  FP-growth算法是本Apriori规律的,经过在FP(频繁)中希腊字母第12字唱片集 榜样)树上频繁项集,只你未检出的唱片中间的关系支配。。FP-growth算法只必要对唱片库举行两遍扫描,Apriori算法必要对全部潜在频率举行一次扫描唱片集。,故此,Apriori算法是无效的。。求频繁项集的算法:

(1)解释FP-树;

(2)从FP树发掘频繁项集。

2. 产生物理反应FP树

  FP表现频繁榜样。,它经过连锁连锁到使有效的元素。,衔接元素可以被看待是链表。。阵地支集对事务唱片表达到目标唱片项举行排序。,将每个事务达到目标唱片项按降序排列拔出一棵树中 NULL是根混合物达到目标树。,同时,在每个混合物上记载混合物的支集度。。

  FP-growth算法的迅速移动为:率先,解释FP-树。,与用它发掘频繁项集。。解释FP树时,你必要扫描唱片集的两边。,高音的扫描用于合乎情理频率。,思索频繁项集的二次扫描。上面的示例说明了FP-树。。

  让在事务唱片示例。,产生物理反应FP树的摇动列举如下: 

  事务ID

    买卖零件

  001

  r,z,h,j,p

  002

 z,y,x,w,v,u,t,s

  003

    z

  004

  r,x,n,o,s

  005

 y,r,x,z,q,t,p

  006

 y,z,x,e,q,s,t,m

  Apriori算法中最小支集度界限值,最小支集度限制为3。,合表达到目标唱片,那些的缺乏最少的支集请求的人将无力的出如今,据此产生物理反应FP树,它运用第一头标示剂表来感觉赠送的典型的第第一举例。,核心拜访FP树达到目标掌握元素,试验性的标示剂的FP树解释列举如下

结成试验性的标示剂表的绘制FP树,表格达到目标唱片过滤,排序列举如下:

事务ID 买卖零件 过滤和重行排序事务
001 r,z,h,j,p z,r
002 z,y,x,w,v,u,t,s z,x,y,s,t
003 z z
004 r,x,n,o,s x,s,r
005 y,r,x,z,q,t,p z,x,y,r,t
006 y,z,x,e,q,s,t,m z,x,y,s,t

对唱片项举行排序和排序后,就可以产生物理反应FP树了,赤手成家,在过滤和排序随后向它们添加频繁项集。。该迅速移动可以表现为:

  阵地这一思惟,可以实现预期的结果FP树的解释。,上面是运用Python来实现预期的结果的。。咱们赚得,在第二次扫描唱片集时会解释一棵FP树,运用包裹来禁猎树木。。率先,准备第一类来禁猎树的每个混合物。,行为准则列举如下:

#编码:UTF-8from numpy import *

class 树冠
    def__init__(生命本源), nameValue, numOccur, parentNode):
         = nameValue
        self.count = numOccur
        self.nodeLink = None
        self.parent = parentNode      #needs to be updated
        self.children = {} 
        
    def inc(生命本源),numOccur):
        self.count += numOccur

    def disp(生命本源),ind = 1):
        print''''*ind,,'''',self.count
        for child in self.children.values():
            (英)+1)
''''''
#test
rootNode = 树形(成金字塔状),9,无)
[眼睛] = 树眼(眼睛),13,无)
a = ()
print a
''''''

这样的事物,找到了FP树的唱片结构。,如今就可以产生物理反应FP树了,FP树的解释行使职责列举如下

#FP解释行使职责def createTree(dataSet,薄荷 = 1):
    headerTable = {}
    for trans in dataSet:
        for item in trans:
            headerTable[item] = (论文),0) + 唱片集[反]#记载每个元素论文的频率。for k in ():
        if headerTable[k] < 薄荷:
            del(headerTable[k])
    freqItemSet = set(())
    if len(freqItemSet) == 0:#最小支集需要的去除return None,None
    for k in headerTable:
        headerTable[k] = [headerTable[k],无
    retTree = 树冠''Null Set'',1,无)
    for tranSet,count in dataSet.items():
        localD = {}
        for item in tranSet:
            if item in freqItemSet:
                localD[item] = 使朝上[论文]〔0〕
        if len(localD) > 0:
            orderedItems = [v[0] for v in sorted((),key = lambda p:p[1],reverse = 真的)
            updateTree(orderedItems,retTree,headerTable,伯爵)
    return retTree,headerTable

def updateTree(论文)s, inTree, headerTable, 伯爵):
    if 论文〔0〕 in :
        [论文〔0〕].inc(伯爵) 
    else:
        [论文〔0〕] = 树冠(论文)s[0], count, 内树
        if headerTable[论文〔0〕][1] == None:
            headerTable[论文〔0〕][1] = [论文〔0〕]
        else:
            updateHeader(headerTable[论文〔0〕][1], [论文〔0〕])
    if len(论文)s) > 1:
        updateTree(论文)s[1::], [论文〔0〕], headerTable, 伯爵)

def updateHeader(nodeToTest, targetNode):   
    while ( != 无):
        nodeToTest = 
     = targetNode

在运转后面的示例先前,还必要第一真实的唱片集。,与先前的唱片相联合集团的自限制唱片集:

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

def createInitSet(dataSet):
    retDict = {}
    for trans in dataSet:
        retDict[frozenset(trans)] = 1
    return retDict

运转:

#test
simpDat = loadSimpDat()
initSet  = createInitSet(simpDat)
myFPtree,myHeaderTab = createTree(initSet,3)
a = ()
print a

以这种方法解释了FP树。,接下来,咱们运用它来发掘频繁项集。。

3. 本FP-树的频繁项集发掘

  在解释FP-树随后,,可以茫然的频繁项集。,这时的模糊想法大致上类似地Apriori算法。,从搜集氮元素开端。,与在此基础上找到第一更大的集合。。它大致上可以分为三个摇动。:

(1)从FP-树中得到必需品榜样基。;

(2)运用必需品榜样基,解释必需品FP树;

(3)迭代反复(1)和(2),直到树计入元素项。。

  率先,得到必需品榜样基。必需品榜样库是搜索元素完毕时的路集。,表现搜索的元素和根混合物的掌握满足。。联合集团产生物理反应FP树绘制的图,R的前缀路是{x。,s}、{z,x,y}和{z},每个前缀路与计数值中间定位。,计数值表现每个路上的R号码。。获取这些前缀路,联合集团后面的头标示剂表,头标示剂表计入等于典型ELM的接收标示剂。,每个元素可以追溯到这树直到根混合物。。该迅速移动的划一的行为准则列举如下:

def ascendTree(leafNode, prefixPath): #ascends from leaf node to rootif leafNode.parent != None:
        ()
        ascendTree(leafNode.parent, prefixPath)
    
def findPrefixPath(basePat, 树形) #树冠 comes from header table
    condPats = {}
    while 树冠 != None:
        prefixPath = []
        ascendTree(树冠, prefixPath)
        if len(prefixPath) > 1: 
            condPats[frozenset(prefixPath[1:])] = 树冠.count
        树冠 = 树冠.nodeLink
    return condPats

#test
simpDat = loadSimpDat()
initSet  = createInitSet(simpDat)
myFPtree,myHeaderTab = createTree(initSet,3)
a = ()
b = findPrefixPath(''x'',myHeaderTab[''x''][1])
print b

  运转行为准则,与赠送的的唱片划一。接下来,您可以准备必需品FP树。。在附近的全部频繁论文,强迫准备第一必需品FP树。,运用勉强准备的必需品榜样库作为输出。,运用等于的开发行为准则来解释树。,重现论文被重现撞见。、撞见必需品榜样基和附加必需品树。划一的的频繁项集重现搜索行使职责为FoLL:

def mineTree(inTree, headerTable, 薄荷, preFix, freqItemList):
    bigL = [v[0] for v in sorted((), key=lambda p: p[1])]#(排序) header 表)for basePat in bigL:
        newFreqSet = ()
        (basePat)
        (newFreqSet)
        condPattBases = findPrefixPath(basePat, headerTable[basePat][1])
        myCondTree, myHead = createTree(condPattBases, 薄荷)
        if myHead != None:            
            mineTree(myCondTree, myHead, 薄荷, newFreqSet, freqItemList)

联合集团先前的唱片证明,缺少撞见口误。。

二 从强迫征兵网站点击流发掘

在自限制唱片分离算法中证明了上述的算法。,如今选择用于份量的现实唱片。。在这唱片集合,计入100万条记载。,寄给报社达到目标每政党的计入用户阅读的强迫征兵报道。,用于查找无论如何有10万人表的报道。。行为准则列举如下:

#从强迫征兵网站点击流发掘
parsedData = [() for line in open('''').readlines()]
initSet = createInitSet(parsedData)
myFPtree,myHeaderTab = createTree(initSet,100000)
myFreqList = []
a = mineTree(myFPtree,myHeaderTab,100000,set([]),myFreqList)
b = len(myFreqList)
print b
print myFreqList

这实现预期的结果了这功用。。

不只是是我本身的总结和投合心意。,犯口误是必然发生的事的。,我希望的东西你的同行会毫不犹豫地给咱们标示。

发表评论

电子邮件地址不会被公开。 必填项已用*标注