日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

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

编程问答

FP-growth算法高效发现频繁项集

發(fā)布時間:2024/9/20 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 FP-growth算法高效发现频繁项集 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在用搜索引擎時,我們發(fā)現(xiàn)輸入單詞的一部分時,搜索引擎會自動補(bǔ)全查詢詞項(xiàng),這里的原理其實(shí)是通過查詢互聯(lián)網(wǎng)上的詞來找出經(jīng)常出現(xiàn)在一塊的詞對,這需要一種高效發(fā)現(xiàn)頻繁集的方法。

它基于Apriori構(gòu)建,但在完成相同任務(wù)時采用了一些不同的技術(shù)。這里的任務(wù)是將數(shù)據(jù)集存儲在一個特定的稱作FP樹的結(jié)構(gòu)之后發(fā)現(xiàn)頻繁項(xiàng)集或者頻繁項(xiàng)對,即常在一塊出現(xiàn)的元素項(xiàng)的集合FP樹。這種做法使得算法的執(zhí)行速度要快于Apriori,通常性能要好兩個數(shù)量級以上。

注意:

  • 這種算法雖然能更為高效地發(fā)現(xiàn)頻繁項(xiàng)集,但不能用于發(fā)現(xiàn)關(guān)聯(lián)規(guī)則。

  • FP-growth算法只需要對數(shù)據(jù)庫進(jìn)行兩次掃描,而Apriori算法對于每個潛在的頻繁項(xiàng)集都會掃描數(shù)據(jù)集判定給定模式是否頻繁,因此FP-gr0wth算法的速度要比Apriori算法快

FP-growth算法發(fā)現(xiàn)頻繁項(xiàng)集的過程:

  • 構(gòu)建FP樹
  • 從FP樹中挖掘頻繁項(xiàng)集

1. 構(gòu)建FP樹

1.1 這里必須著重說下FP樹,很重要!

  • FP-growth算法將數(shù)據(jù)存儲在一種稱為FP樹的緊湊數(shù)據(jù)結(jié)構(gòu)中。FP代表頻繁模式(Frequent Pattern)。一棵FP樹看上去與計(jì)算機(jī)科學(xué)中的其他樹結(jié)構(gòu)類似,但是它通過鏈接(link)來連接相似元素,被連起來的元素項(xiàng)可以看成一個鏈表
  • 與搜索樹不同的是,一個元素項(xiàng)可以在一棵FP樹種出現(xiàn)多次。FP樹會存儲項(xiàng)集的出現(xiàn)頻率,而每個項(xiàng)集會以路徑的方式存儲在數(shù)中。存在相似元素的集合會共享樹的一部分。只有當(dāng)集合之間完全不同時,樹才會分叉。 樹節(jié)點(diǎn)上給出集合中的單個元素及其在序列中的出現(xiàn)次數(shù),路徑會給出該序列的出現(xiàn)次數(shù)。
  • 相似項(xiàng)之間的鏈接稱為節(jié)點(diǎn)鏈接(node link),用于快速發(fā)現(xiàn)相似項(xiàng)的位置。

1.2 FP-growth算法的工作流程如下

首先構(gòu)建FP樹,然后利用它來挖掘頻繁項(xiàng)集。為構(gòu)建FP樹,需要對原始數(shù)據(jù)集掃描兩遍。第一遍對所有元素項(xiàng)的出現(xiàn)次數(shù)進(jìn)行計(jì)數(shù)。數(shù)據(jù)庫的第一遍掃描用來統(tǒng)計(jì)出現(xiàn)的頻率,而第二遍掃描中只考慮那些頻繁元素。

FP-growth算法還需要一個稱為頭指針表的數(shù)據(jù)結(jié)構(gòu),其實(shí)很簡單,就是用來記錄各個元素項(xiàng)的總出現(xiàn)次數(shù)的數(shù)組,再附帶一個指針指向FP樹中該元素項(xiàng)的第一個節(jié)點(diǎn)。這樣每個元素項(xiàng)都構(gòu)成一條單鏈表。

1.3 事務(wù)數(shù)據(jù)樣例

代碼:

# -*- coding: utf-8 -*-# 返回一個事物列表 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# 用于實(shí)現(xiàn)列表到字典的轉(zhuǎn)換過程 def createInitSet(dataSet): # 把每條事務(wù)記錄由列表轉(zhuǎn)換為frozenset類型,并且其鍵對應(yīng)的值為1retDict = {}for trans in dataSet:retDict[frozenset(trans)] = 1return retDict# 構(gòu)建FP樹的類定義 class treeNode:def __init__(self, nameValue, numOccur, parentNode):self.name = nameValueself.count = numOccurself.nodeLink = None # 用于鏈接相似的元素項(xiàng)self.parent = parentNode # 指向當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn)self.children = {} def inc(self, numOccur):self.count += numOccurdef disp(self, ind=1): # 用于將樹以文本形式顯示print ' ' *ind, self.name, ' ', self.count # ' ' *ind此處代表的是空格數(shù),也即是為了顯示運(yùn)行結(jié)果的結(jié)構(gòu)的for child in self.children.values(): # 子節(jié)點(diǎn)也是treeNode對象child.disp(ind+1) # 遞歸調(diào)用disp()# FPA樹構(gòu)建函數(shù) def createTree(dataSet, minSup=1): # minSup最小支持度headerTable = {}# 兩次遍歷數(shù)據(jù)集for trans in dataSet: # 第一次遍歷,統(tǒng)計(jì)每個元素出現(xiàn)的頻度for item in trans:# 這個式子很牛,headerTable[item]得到的是遍歷每個事務(wù)項(xiàng)中的每個元素后的個數(shù),即得到頭指針表headerTable[item] = headerTable.get(item, 0) + dataSet[trans] print 'headerTable_1:',headerTablefor k in headerTable.keys(): # 刪除頭指針表中出現(xiàn)次數(shù)小于minsup的項(xiàng)if headerTable[k] < minSup: del(headerTable[k])print 'headerTable_2:',headerTablefreqItemSet = set(headerTable.keys()) # 得到頻繁項(xiàng)的元素,即字典的鍵print 'freqItemSet: ',freqItemSetif len(freqItemSet) == 0: return None, None # 如果沒有元素項(xiàng)滿足要求,則退出for k in headerTable: # 遍歷過濾后的頭指針表headerTable[k] = [headerTable[k], None] # 每個項(xiàng)(字典鍵)的值是[計(jì)數(shù)值,元素項(xiàng)指針]print 'headerTable_3: ',headerTableretTree = treeNode('Null Set', 1, None) # 創(chuàng)建根節(jié)點(diǎn)for tranSet, count in dataSet.items(): # 遍歷dataSet中的每一項(xiàng)[],tranSet, count是[項(xiàng),數(shù)1]localD = {}print 'tranSet and count:',tranSet,'-->',countfor item in tranSet: if item in freqItemSet: # 基于頻繁項(xiàng)集再遍歷一遍localD[item] = headerTable[item][0] print 'localD:',localD if len(localD) > 0:# 列表推到式進(jìn)行排序,得到降序排列的每個事務(wù)項(xiàng)(過濾后的)orderedItems = [v[0] for v in sorted(localD.items(), key=lambda p: p[1], reverse=True)] print 'orderedItems:',orderedItems updateTree(orderedItems, retTree, headerTable, count) return retTree, headerTable # # 更新樹 def updateTree(items, inTree, headerTable, count): # intree:樹節(jié)點(diǎn)對象,count=1,items過濾后的事務(wù)項(xiàng)print 'children:',inTree.children.keys()if items[0] in inTree.children: # 事務(wù)中的第一個元素是否作為子節(jié)點(diǎn)存在print 'here...0'inTree.children[items[0]].inc(count) # 如果存在則更新該元素項(xiàng)的計(jì)數(shù)else: # 如果不存在則將其作為一個子節(jié)點(diǎn)添加到樹中inTree.children[items[0]] = treeNode(items[0], count, inTree) # inTree是父節(jié)點(diǎn),count=1,item[0]是節(jié)點(diǎn)名print 'here....1'inTree.disp()if headerTable[items[0]][1] == None: # [items[0]][1]是第一個鍵的值(列表)的第二個元素 print 'here...2'headerTable[items[0]][1] = inTree.children[items[0]] # 把節(jié)點(diǎn)對象賦給headerTable的[items[0]][1]#print 'headerTable_4:',headerTableelse: # 頭指針表也要更新以指向新的節(jié)點(diǎn)print 'here....3'updateHeader(headerTable[items[0]][1], inTree.children[items[0]])if len(items) > 1: # inTree.children[items[0]]頭指針表也要指向新的節(jié)點(diǎn)print 'len(items):',len(items)updateTree(items[1::], inTree.children[items[0]], headerTable, count)# 更新頭指針表 def updateHeader(nodeToTest, targetNode): # nodeToTest是節(jié)點(diǎn)對象,targetNode也是節(jié)點(diǎn)對象print 'updateHeader:',nodeToTest.name,targetNode.namewhile (nodeToTest.nodeLink != None): print 'gaga...'nodeToTest = nodeToTest.nodeLinknodeToTest.nodeLink = targetNodeprint 'nodeToTest.nodeLink-->',nodeToTest.nodeLink.namedef ascendTree(leafNode, prefixPath): #ascends from leaf node to rootif leafNode.parent != None:prefixPath.append(leafNode.name)ascendTree(leafNode.parent, prefixPath)# 主函數(shù)# 測試 rootNode=treeNode('pyramid',9,None) rootNode.disp() rootNode.children['eye']=treeNode('pyramid',13,None) rootNode.disp() rootNode.children['phoenix']=treeNode('phoenix',3,None) rootNode.disp()# 構(gòu)建FP樹 simDat=loadSimpDat() initSet=createInitSet(simDat) print 'initSet:',initSet myFPtree,myHeaderTab=createTree(initSet, 3) print 'complete tree:',myFPtree.disp() #print 'myHeaderTab:',myHeaderTab

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

pyramid 9pyramid 9pyramid 13pyramid 9pyramid 13phoenix 3 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, frozenset(['q', 'p', 'r', 't', 'y', 'x', 'z']): 1, frozenset(['h', 'r', 'z', 'p', 'j']): 1, frozenset(['z']): 1} headerTable_1: {'e': 1, 'h': 1, 'j': 1, 'm': 1, 'o': 1, 'n': 1, 'q': 2, 'p': 2, 's': 3, 'r': 3, 'u': 1, 't': 3, 'w': 1, 'v': 1, 'y': 3, 'x': 4, 'z': 5} headerTable_2: {'s': 3, 'r': 3, 't': 3, 'y': 3, 'x': 4, 'z': 5} freqItemSet: set(['s', 'r', 't', 'y', 'x', 'z']) headerTable_3: {'s': [3, None], 'r': [3, None], 't': [3, None], 'y': [3, None], 'x': [4, None], 'z': [5, None]} tranSet and count: frozenset(['e', 'm', 'q', 's', 't', 'y', 'x', 'z']) --> 1 localD: {'y': 3, 'x': 4, 's': 3, 'z': 5, 't': 3} orderedItems: ['z', 'x', 'y', 's', 't'] children: [] here....1Null Set 1z 1 here...2 len(items): 5 children: [] here....1z 1x 1 here...2 len(items): 4 children: [] here....1x 1y 1 here...2 len(items): 3 children: [] here....1y 1s 1 here...2 len(items): 2 children: [] here....1s 1t 1 here...2 tranSet and count: frozenset(['x', 's', 'r', 'o', 'n']) --> 1 localD: {'x': 4, 's': 3, 'r': 3} orderedItems: ['x', 's', 'r'] children: ['z'] here....1Null Set 1x 1z 1x 1y 1s 1t 1 here....3 updateHeader: x x nodeToTest.nodeLink--> x len(items): 3 children: [] here....1x 1s 1 here....3 updateHeader: s s nodeToTest.nodeLink--> s len(items): 2 children: [] here....1s 1r 1 here...2 tranSet and count: frozenset(['s', 'u', 't', 'w', 'v', 'y', 'x', 'z']) --> 1 localD: {'y': 3, 'x': 4, 's': 3, 'z': 5, 't': 3} orderedItems: ['z', 'x', 'y', 's', 't'] children: ['x', 'z'] here...0 len(items): 5 children: ['x'] here...0 len(items): 4 children: ['y'] here...0 len(items): 3 children: ['s'] here...0 len(items): 2 children: ['t'] here...0 tranSet and count: frozenset(['q', 'p', 'r', 't', 'y', 'x', 'z']) --> 1 localD: {'y': 3, 'x': 4, 'r': 3, 't': 3, 'z': 5} orderedItems: ['z', 'x', 'y', 'r', 't'] children: ['x', 'z'] here...0 len(items): 5 children: ['x'] here...0 len(items): 4 children: ['y'] here...0 len(items): 3 children: ['s'] here....1y 3s 2t 2r 1 here....3 updateHeader: r r nodeToTest.nodeLink--> r len(items): 2 children: [] here....1r 1t 1 here....3 updateHeader: t t nodeToTest.nodeLink--> t tranSet and count: frozenset(['h', 'r', 'z', 'p', 'j']) --> 1 localD: {'r': 3, 'z': 5} orderedItems: ['z', 'r'] children: ['x', 'z'] here...0 len(items): 2 children: ['x'] here....1z 4x 3y 3s 2t 2r 1t 1r 1 here....3 updateHeader: r r gaga... nodeToTest.nodeLink--> r tranSet and count: frozenset(['z']) --> 1 localD: {'z': 5} orderedItems: ['z'] children: ['x', 'z'] here...0 complete tree: Null Set 1x 1s 1r 1z 5x 3y 3s 2t 2r 1t 1r 1 None myHeaderTab: {'s': [3, <__main__.treeNode instance at 0x000000000B905188>], 'r': [3, <__main__.treeNode instance at 0x000000000B9B0E08>], 't': [3, <__main__.treeNode instance at 0x000000000B905F08>], 'y': [3, <__main__.treeNode instance at 0x000000000B9051C8>], 'x': [4, <__main__.treeNode instance at 0x000000000B9E5688>], 'z': [5, <__main__.treeNode instance at 0x000000000B9E59C8>]}

以上就是FP樹的構(gòu)建過程,已經(jīng)把具體流程打印出類了,一步一步對應(yīng)上面帶頭指針表的圖就可以搞清楚其中的細(xì)節(jié)了,具體解釋參考《機(jī)器學(xué)習(xí)實(shí)戰(zhàn)》。

構(gòu)建FP樹的前兩步:

這里我只想說,數(shù)據(jù)結(jié)構(gòu)很重要!數(shù)據(jù)結(jié)構(gòu)很重要!數(shù)據(jù)結(jié)構(gòu)很重要!

python中frozenset( )的用法

2. 從FP樹中挖掘頻繁項(xiàng)

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

從FP樹中抽取頻繁項(xiàng)集的三個基本步驟如下:

  • 從FP樹中獲得條件模式基;
  • 利用條件模式基,構(gòu)建一個條件FP樹;
  • 迭代重復(fù)步驟1步驟2,直到樹包含一個元素項(xiàng)為止。

其中關(guān)鍵是尋找條件模式基的過程,之后為每一個條件模式基創(chuàng)建對應(yīng)的條件FP樹。

2.1 抽取條件模式基

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

則由吐1.1得到每一個頻繁元素項(xiàng)的所有前綴路徑(條件模式基)為:

前綴路徑將在下一步中用于構(gòu)建條件FP樹,暫時先不考慮。如何發(fā)現(xiàn)某個頻繁元素項(xiàng)的所在的路徑?利用先前創(chuàng)建的頭指針表和FP樹中的相似元素節(jié)點(diǎn)指針,我們已經(jīng)有了每個元素對應(yīng)的單鏈表,因而可以直接獲取。
在代碼實(shí)現(xiàn)中:為給定元素項(xiàng)生成一個條件模式基(前綴路徑),這通過訪問樹中所有包含給定元素項(xiàng)的節(jié)點(diǎn)來完成。

2.2 創(chuàng)建條件FP樹

對于每一個頻繁項(xiàng),都要創(chuàng)建一棵條件FP樹。可以使用剛才發(fā)現(xiàn)的條件模式基作為輸入數(shù)據(jù),并通過相同的建樹代碼來構(gòu)建這些樹。例如,對于r,即以“{x, s}: 1, {z, x, y}: 1, {z}: 1”為輸入,調(diào)用函數(shù)createTree()獲得r的條件FP樹;對于t,輸入是對應(yīng)的條件模式基“{z, x, y, s}: 2, {z, x, y, r}: 1”,然后再遞歸地發(fā)現(xiàn)頻繁項(xiàng)集,發(fā)現(xiàn)條件模式基,以及發(fā)現(xiàn)另外的條件樹。

圖示:

2.3 遞歸查找頻繁項(xiàng)集

有了FP樹和條件FP樹,我們就可以在前兩步的基礎(chǔ)上遞歸得查找頻繁項(xiàng)集。

完整代碼:

# -*- coding: utf-8 -*-# 返回一個事物列表 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# 用于實(shí)現(xiàn)列表到字典的轉(zhuǎn)換過程 def createInitSet(dataSet): # 把每條事務(wù)記錄由列表轉(zhuǎn)換為frozenset類型,并且其鍵對應(yīng)的值為1retDict = {}for trans in dataSet:retDict[frozenset(trans)] = 1return retDict# 構(gòu)建FP樹的類定義 class treeNode:def __init__(self, nameValue, numOccur, parentNode):self.name = nameValueself.count = numOccurself.nodeLink = None # 用于鏈接相似的元素項(xiàng)self.parent = parentNode # 指向當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn)self.children = {} def inc(self, numOccur):self.count += numOccurdef disp(self, ind=1): # 用于將樹以文本形式顯示print ' ' *ind, self.name, ' ', self.count # ' ' *ind此處代表的是空格數(shù),也即是為了顯示運(yùn)行結(jié)果的結(jié)構(gòu)的for child in self.children.values(): # 子節(jié)點(diǎn)也是treeNode對象child.disp(ind+1) # 遞歸調(diào)用disp()# FPA樹構(gòu)建函數(shù) def createTree(dataSet, minSup=1): # minSup最小支持度headerTable = {}for trans in dataSet: # 第一次遍歷,統(tǒng)計(jì)每個元素出現(xiàn)的頻度for item in trans:headerTable[item] = headerTable.get(item, 0) + dataSet[trans] for k in headerTable.keys(): # 刪除頭指針表中出現(xiàn)次數(shù)小于minsup的項(xiàng)if headerTable[k] < minSup: del(headerTable[k])freqItemSet = set(headerTable.keys()) # 得到頻繁項(xiàng)的元素,即字典的鍵if len(freqItemSet) == 0: return None, None # 如果沒有元素項(xiàng)滿足要求,則退出for k in headerTable: # 遍歷過濾后的頭指針表headerTable[k] = [headerTable[k], None] # 每個項(xiàng)(字典鍵)的值是[計(jì)數(shù)值,元素項(xiàng)指針]retTree = treeNode('Null Set', 1, None) # 創(chuàng)建根節(jié)點(diǎn)for tranSet, count in dataSet.items(): # 遍歷dataSet中的每一項(xiàng)[],tranSet, count是[項(xiàng),數(shù)1]localD = {}for item in tranSet: if item in freqItemSet: # 基于頻繁項(xiàng)集再遍歷一遍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)] updateTree(orderedItems, retTree, headerTable, count) return retTree, headerTable # 更新樹 def updateTree(items, inTree, headerTable, count): # intree:樹節(jié)點(diǎn)對象,count=1,items過濾后的事務(wù)項(xiàng)if items[0] in inTree.children: # 事務(wù)中的第一個元素是否作為子節(jié)點(diǎn)存在 inTree.children[items[0]].inc(count) # 如果存在則更新該元素項(xiàng)的計(jì)數(shù)else: # 如果不存在則將其作為一個子節(jié)點(diǎn)添加到樹中inTree.children[items[0]] = treeNode(items[0], count, inTree) # inTree是父節(jié)點(diǎn),count=1,item[0]是節(jié)點(diǎn)名 inTree.disp()if headerTable[items[0]][1] == None: # [items[0]][1]是第一個鍵的值(列表)的第二個元素 headerTable[items[0]][1] = inTree.children[items[0]] # 把節(jié)點(diǎn)對象賦給headerTable的[items[0]][1] else: # 頭指針表也要更新以指向新的節(jié)點(diǎn) updateHeader(headerTable[items[0]][1], inTree.children[items[0]])if len(items) > 1: # inTree.children[items[0]]頭指針表也要指向新的節(jié)點(diǎn) updateTree(items[1::], inTree.children[items[0]], headerTable, count)# 更新頭指針表 def updateHeader(nodeToTest, targetNode): # nodeToTest是節(jié)點(diǎn)對象,targetNode也是節(jié)點(diǎn)對象while (nodeToTest.nodeLink != None): nodeToTest = nodeToTest.nodeLinknodeToTest.nodeLink = targetNode# 發(fā)現(xiàn)給定元素結(jié)尾的所有路徑的函數(shù)(上溯FP樹) def ascendTree(leafNode, prefixPath): if leafNode.parent != None: # 迭代上溯整棵樹,因?yàn)橹挥懈?jié)點(diǎn)的父節(jié)點(diǎn)是NoneprefixPath.append(leafNode.name)ascendTree(leafNode.parent, prefixPath)# 創(chuàng)建條件基(遍歷鏈表直到到達(dá)結(jié)尾,,每遇到一個元素項(xiàng)都會調(diào)用asscendtree()來上溯FP樹) def findPrefixPath(basePat, treeNode): # 兩個參數(shù):給定元素項(xiàng)的節(jié)點(diǎn)和該節(jié)點(diǎn)指向的對象condPats = {} # 條件模式基字典while treeNode != None: # prefixPath = [] # 上溯列表ascendTree(treeNode, prefixPath)print 'prefixPath:',prefixPathif len(prefixPath) > 1: condPats[frozenset(prefixPath[1:])] = treeNode.countprint 'condPats:',condPats treeNode = treeNode.nodeLinkreturn condPats # 返回對應(yīng)的條件模式基# 遞歸查找頻繁項(xiàng)集#(myFPtree, myHeaderTab, 3, set([]), freqItems=[]) def mineTree(inTree, headerTable, minSup, preFix, freqItemList):bigL = [v[0] for v in sorted(headerTable.items(), key=lambda p: p[1])] # 排序頭指針表,按升序排列print 'bigL:',bigL # 頭指針表for basePat in bigL: # 從bigL的底部開始newFreqSet = preFix.copy()newFreqSet.add(basePat) # set集合用add()print 'finalFrequent Item: ',newFreqSet # 頻繁項(xiàng)freqItemList.append(newFreqSet) # 列表用append()#print 'treenood:',headerTable[basePat][1].namecondPattBases = findPrefixPath(basePat, headerTable[basePat][1]) # 第二個參數(shù)是print 'condPattBases :',basePat, '-->',condPattBases # 得到模式基字典# 針對每一個條件模式基創(chuàng)建條件FP樹myCondTree, myHead = createTree(condPattBases, minSup) # myCondTree條件fp樹print 'head from conditional tree: ', myHead if myHead != None: print 'conditional tree for: ',newFreqSetmyCondTree.disp(1) mineTree(myCondTree, myHead, minSup, newFreqSet, freqItemList)# 主函數(shù) # 構(gòu)建FP樹 simDat=loadSimpDat() initSet=createInitSet(simDat) print 'initSet:',initSet myFPtree,myHeaderTab=createTree(initSet, 3) myFPtree.disp() print 'myHeaderTab:',myHeaderTab freqItems=[] mineTree(myFPtree, myHeaderTab, 3, set([]), freqItems) print 'freqItems:',freqItems

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

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, frozenset(['q', 'p', 'r', 't', 'y', 'x', 'z']): 1, frozenset(['h', 'r', 'z', 'p', 'j']): 1, frozenset(['z']): 1}Null Set 1z 1z 1x 1x 1y 1y 1s 1s 1t 1Null Set 1x 1z 1x 1y 1s 1t 1x 1s 1s 1r 1y 3s 2t 2r 1r 1t 1z 4x 3y 3s 2t 2r 1t 1r 1Null Set 1x 1s 1r 1z 5x 3y 3s 2t 2r 1t 1r 1 myHeaderTab: {'s': [3, <__main__.treeNode instance at 0x000000000B8E9808>], 'r': [3, <__main__.treeNode instance at 0x000000000B8E9608>], 't': [3, <__main__.treeNode instance at 0x000000000B8E9788>], 'y': [3, <__main__.treeNode instance at 0x000000000B8E9848>], 'x': [4, <__main__.treeNode instance at 0x000000000B8E97C8>], 'z': [5, <__main__.treeNode instance at 0x000000000B8E9508>]} bigL: ['r', 't', 's', 'y', 'x', 'z'] finalFrequent Item: set(['r']) prefixPath: ['r', 's', 'x'] condPats: {frozenset(['x', 's']): 1} prefixPath: ['r', 'y', 'x', 'z'] condPats: {frozenset(['x', 's']): 1, frozenset(['y', 'x', 'z']): 1} prefixPath: ['r', 'z'] condPats: {frozenset(['x', 's']): 1, frozenset(['z']): 1, frozenset(['y', 'x', 'z']): 1} condPattBases : r --> {frozenset(['x', 's']): 1, frozenset(['z']): 1, frozenset(['y', 'x', 'z']): 1} head from conditional tree: None finalFrequent Item: set(['t']) prefixPath: ['t', 's', 'y', 'x', 'z'] condPats: {frozenset(['y', 'x', 's', 'z']): 2} prefixPath: ['t', 'r', 'y', 'x', 'z'] condPats: {frozenset(['y', 'x', 's', 'z']): 2, frozenset(['y', 'x', 'r', 'z']): 1} condPattBases : t --> {frozenset(['y', 'x', 's', 'z']): 2, frozenset(['y', 'x', 'r', 'z']): 1}Null Set 1y 2y 2x 2x 2z 2 head from conditional tree: {'y': [3, <__main__.treeNode instance at 0x000000000B8E9888>], 'x': [3, <__main__.treeNode instance at 0x000000000B8E9448>], 'z': [3, <__main__.treeNode instance at 0x000000000B8E9408>]} conditional tree for: set(['t'])Null Set 1y 3x 3z 3 bigL: ['z', 'x', 'y'] finalFrequent Item: set(['z', 't']) prefixPath: ['z', 'x', 'y'] condPats: {frozenset(['y', 'x']): 3} condPattBases : z --> {frozenset(['y', 'x']): 3}Null Set 1y 3y 3x 3 head from conditional tree: {'y': [3, <__main__.treeNode instance at 0x000000000B8E9488>], 'x': [3, <__main__.treeNode instance at 0x000000000B8E93C8>]} conditional tree for: set(['z', 't'])Null Set 1y 3x 3 bigL: ['x', 'y'] finalFrequent Item: set(['x', 'z', 't']) prefixPath: ['x', 'y'] condPats: {frozenset(['y']): 3} condPattBases : x --> {frozenset(['y']): 3}Null Set 1y 3 head from conditional tree: {'y': [3, <__main__.treeNode instance at 0x000000000B8E92C8>]} conditional tree for: set(['x', 'z', 't'])Null Set 1y 3 bigL: ['y'] finalFrequent Item: set(['y', 'x', 'z', 't']) prefixPath: ['y'] condPattBases : y --> {} head from conditional tree: None finalFrequent Item: set(['y', 'z', 't']) prefixPath: ['y'] condPattBases : y --> {} head from conditional tree: None finalFrequent Item: set(['x', 't']) prefixPath: ['x', 'y'] condPats: {frozenset(['y']): 3} condPattBases : x --> {frozenset(['y']): 3}Null Set 1y 3 head from conditional tree: {'y': [3, <__main__.treeNode instance at 0x000000000B8E9188>]} conditional tree for: set(['x', 't'])Null Set 1y 3 bigL: ['y'] finalFrequent Item: set(['y', 'x', 't']) prefixPath: ['y'] condPattBases : y --> {} head from conditional tree: None finalFrequent Item: set(['y', 't']) prefixPath: ['y'] condPattBases : y --> {} head from conditional tree: None finalFrequent Item: set(['s']) prefixPath: ['s', 'y', 'x', 'z'] condPats: {frozenset(['y', 'x', 'z']): 2} prefixPath: ['s', 'x'] condPats: {frozenset(['y', 'x', 'z']): 2, frozenset(['x']): 1} condPattBases : s --> {frozenset(['y', 'x', 'z']): 2, frozenset(['x']): 1}Null Set 1x 2 head from conditional tree: {'x': [3, <__main__.treeNode instance at 0x000000000B69B788>]} conditional tree for: set(['s'])Null Set 1x 3 bigL: ['x'] finalFrequent Item: set(['x', 's']) prefixPath: ['x'] condPattBases : x --> {} head from conditional tree: None finalFrequent Item: set(['y']) prefixPath: ['y', 'x', 'z'] condPats: {frozenset(['x', 'z']): 3} condPattBases : y --> {frozenset(['x', 'z']): 3}Null Set 1x 3x 3z 3 head from conditional tree: {'x': [3, <__main__.treeNode instance at 0x000000000B6A26C8>], 'z': [3, <__main__.treeNode instance at 0x000000000B84B248>]} conditional tree for: set(['y'])Null Set 1x 3z 3 bigL: ['x', 'z'] finalFrequent Item: set(['y', 'x']) prefixPath: ['x'] condPattBases : x --> {} head from conditional tree: None finalFrequent Item: set(['y', 'z']) prefixPath: ['z', 'x'] condPats: {frozenset(['x']): 3} condPattBases : z --> {frozenset(['x']): 3}Null Set 1x 3 head from conditional tree: {'x': [3, <__main__.treeNode instance at 0x000000000B6A10C8>]} conditional tree for: set(['y', 'z'])Null Set 1x 3 bigL: ['x'] finalFrequent Item: set(['y', 'x', 'z']) prefixPath: ['x'] condPattBases : x --> {} head from conditional tree: None finalFrequent Item: set(['x']) prefixPath: ['x', 'z'] condPats: {frozenset(['z']): 3} prefixPath: ['x'] condPattBases : x --> {frozenset(['z']): 3}Null Set 1z 3 head from conditional tree: {'z': [3, <__main__.treeNode instance at 0x000000000B823908>]} conditional tree for: set(['x'])Null Set 1z 3 bigL: ['z'] finalFrequent Item: set(['x', 'z']) prefixPath: ['z'] condPattBases : z --> {} head from conditional tree: None finalFrequent Item: set(['z']) prefixPath: ['z'] condPattBases : z --> {} head from conditional tree: None freqItems: [set(['r']), set(['t']), set(['z', 't']), set(['x', 'z', 't']), set(['y', 'x', 'z', 't']), set(['y', 'z', 't']), set(['x', 't']), set(['y', 'x', 't']), set(['y', 't']), set(['s']), set(['x', 's']), set(['y']), set(['y', 'x']), set(['y', 'z']), set(['y', 'x', 'z']), set(['x']), set(['x', 'z']), set(['z'])]

上面是具體的過程。

補(bǔ)充:因?yàn)橹虚g涉及到很多遞歸,所以具體的過程比較麻煩,這里舉一個例子.
for basePat in bigL:一行當(dāng)basePat為’t’時的過程:

對照上面代碼的運(yùn)行結(jié)果可以幫助分析,沒別的,就是數(shù)據(jù)結(jié)構(gòu)的東西。

3. 從新聞網(wǎng)站點(diǎn)擊流中挖掘新聞報道

書中的這兩章有不少精彩的示例,這里只選取比較有代表性的一個——從新聞網(wǎng)站點(diǎn)擊流中挖掘熱門新聞報道。這是一個很大的數(shù)據(jù)集,有將近100萬條記錄(參見擴(kuò)展閱讀:kosarak)。在源數(shù)據(jù)集合保存在文件kosarak.dat中。該文件中的每一行包含某個用戶瀏覽過的新聞報道。新聞報道被編碼成整數(shù),我們可以使用Apriori或FP-growth算法挖掘其中的頻繁項(xiàng)集,查看那些新聞ID被用戶大量觀看到。

在2中的代碼主函數(shù)部分改成如下:

parsedDat = [line.split() for line in open('kosarak.dat').readlines()] # 將數(shù)據(jù)集導(dǎo)入到列表 initSet=createInitSet(parsedDat) # 對初始集合格式化 # 然后構(gòu)建FP樹,并從中尋找那些至少被10萬人瀏覽過的新聞報道 myFPtree, myHeaderTab = createTree(initSet, 100000) myFreqList = [] # 創(chuàng)建一個空列表來保存這些頻繁項(xiàng)集 mineTree(myFPtree, myHeaderTab, 100000, set([]), myFreqList) print 'length:',len(myFreqList) # 查看多少新聞報道或報道集合曾經(jīng)被10萬或者更多的人瀏覽過 print 'myFreqList',myFreqList # 具體的內(nèi)容

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

... condPattBases : 6 --> {} head from conditional tree: None finalFrequent Item: set(['6']) prefixPath: ['6'] condPattBases : 6 --> {} head from conditional tree: None length: 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'])]

同時也可以使用其他設(shè)置來查看運(yùn)行結(jié)果,比如降低置信度級別。

總結(jié):

  • FP-growth算法是一種用于發(fā)現(xiàn)數(shù)據(jù)集中頻繁模式的有效方法。FP-growth算法利用Apriori原則,執(zhí)行更快。
  • FP-growth算法還有一個map-reduce版本的實(shí)現(xiàn),它也很不錯,可以擴(kuò)展到多臺機(jī)器上運(yùn)行。Google使用該算法通過遍歷大量文本來發(fā)現(xiàn)頻繁共現(xiàn)詞,其做法和我們剛才介紹的例子非常類似。

4. 筆記

(1)Python 字典(Dictionary) get()方法:

Python 字典(Dictionary) get() 函數(shù)返回指定鍵的值,如果值不在字典中返回默認(rèn)值。
get()方法語法: dict.get(key, default=None)
key – 字典中要查找的鍵
default – 如果指定鍵的值不存在時,返回該默認(rèn)值值。

示例:

>>> dict = {'Name': 'Zara', 'Age': 27} >>> dict.get('Age') 27 >>> dict.get('Sex', 0) 0 >>>

(2) initSet=createInitSet(simDat)的用法:

In [13]: m=['e', 'm', 'q', 's', 't', 'y', 'x', 'z']In [14]: mm=frozenset(m)In [15]: initSet Out[15]: {frozenset({'e', 'm', 'q', 's', 't', 'x', 'y', 'z'}): 1,frozenset({'n', 'o', 'r', 's', 'x'}): 1,frozenset({'z'}): 1,frozenset({'s', 't', 'u', 'v', 'w', 'x', 'y', 'z'}): 1,frozenset({'p', 'q', 'r', 't', 'x', 'y', 'z'}): 1,frozenset({'h', 'j', 'p', 'r', 'z'}): 1}In [16]: initSet[mm] Out[16]: 1

(3)orderedItems = [v[0] for v in sorted(localD.items(), key=lambda p: p[1], reverse=True)]的用法:

In [31]: localD={'y': 3, 'x': 4, 's': 3, 'z': 5, 't': 3}In [32]: [v[0] for v in sorted(localD.items(), \...: key=lambda p: p[1], reverse=True)] Out[32]: ['z', 'x', 'y', 's', 't']# rr是針對localD以其value為排序目標(biāo)進(jìn)行的降序排列(p[1]) In [33]: rr=sorted(localD.items(), \...: key=lambda p: p[1], reverse=True)In [34]: rr Out[34]: [('z', 5), ('x', 4), ('y', 3), ('s', 3), ('t', 3)]# rr是針對localD以其key為排序目標(biāo)進(jìn)行的降序排列(p[0]) In [35]: rr=sorted(localD.items(), \...: key=lambda p: p[0], reverse=True)In [36]: rr Out[36]: [('z', 5), ('y', 3), ('x', 4), ('t', 3), ('s', 3)]# 得到了rr中每個元組的第一個元素 In [37]: [v[0] for v in rr] Out[37]: ['z', 'y', 'x', 't', 's']In [38]: [v[1] for v in rr] Out[38]: [5, 3, 4, 3, 3]In [39]: rr[0] Out[39]: ('z', 5)In [40]: type(rr[0]) Out[40]: tuple

(4)updateTree(items[1::], inTree.children[items[0]], headerTable, count)的用法:

>>> items=['z', 'x', 'y', 's', 't'] >>> items[1::] ['x', 'y', 's', 't'] >>> items[1:] ['x', 'y', 's', 't'] >>> items[2::] ['y', 's', 't'] >>>

參考:https://www.cnblogs.com/qwertWZ/p/4510857.html

總結(jié)

以上是生活随笔為你收集整理的FP-growth算法高效发现频繁项集的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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

综合色伊人 | 狠狠色丁香 | 精品一二三四在线 | 久久综合免费 | 国产精品久久久久久久免费大片 | 狠狠色丁香婷婷综合久小说久 | 亚洲精品a区 | 亚洲精品字幕在线观看 | 日韩在线观看一区二区 | 四虎免费在线观看 | 蜜臀aⅴ国产精品久久久国产 | 国产精品少妇 | 国产糖心vlog在线观看 | 91精品国产综合久久久久久久 | 久久99这里只有精品 | 天天色视频 | 九九热99视频 | 婷婷综合在线 | 国产精品视频永久免费播放 | 91视频免费看 | 深爱激情综合网 | 99久久精品国产毛片 | 99国产免费网址 | 欧美一区二区三区四区夜夜大片 | 亚洲综合欧美精品电影 | 黄色毛片视频 | 国产精品久久99综合免费观看尤物 | 九九在线免费视频 | 国产 字幕 制服 中文 在线 | 91你懂的 | 色综合久久88 | 欧美一级视频免费 | 日韩av视屏在线观看 | 亚洲欧洲精品久久 | 国产福利精品在线观看 | www亚洲视频| www.色com | 国产91勾搭技师精品 | 99电影456麻豆| www.av小说 | 波多野结依在线观看 | 亚洲激情在线视频 | 99 久久久久 | 丝袜美腿亚洲 | 日韩精品国产一区 | 久久99精品国产麻豆宅宅 | 91毛片在线 | 在线小视频你懂得 | 亚洲精品在线免费播放 | 亚洲在线高清 | 激情影音 | 亚州av网站| 日韩欧美成人网 | 91久久精品一区 | 国产精品12 | 亚洲电影黄色 | 午夜久久久久久久久久影院 | 久久国产精品99久久久久久老狼 | 国产999精品久久久久久 | 精品一区在线 | 美女视频黄在线 | 波多野结衣综合网 | 在线观看亚洲专区 | 精久久久久 | 亚色视频在线观看 | 国产精品一区二区免费看 | 日韩精品免费一线在线观看 | 亚洲国产精品传媒在线观看 | www.99久久.com| 成人h动漫精品一区二 | 69国产精品成人在线播放 | 免费视频一二三 | 黄色的片子 | 丁香久久激情 | 狠狠色伊人亚洲综合网站色 | 久久a v视频| 亚洲精品视频一 | 亚洲精品免费在线观看视频 | 天天操夜夜操夜夜操 | 亚洲精品视频在线看 | 婷婷在线看 | 亚洲成a人片在线观看中文 中文字幕在线视频第一页 狠狠色丁香婷婷综合 | 91传媒在线看 | 国产h在线播放 | 视频在线精品 | www.久久91 | 九九九九免费视频 | 色综合天天爱 | 国产99一区视频免费 | 亚洲男人天堂2018 | 香蕉视频网站在线观看 | 亚洲成人午夜在线 | 成人午夜av电影 | 欧美精品九九99久久 | 免费黄色在线网站 | 岛国大片免费视频 | 日韩在线观看一区二区三区 | 日本在线成人 | 超碰个人在线 | 久久国产高清 | 中文字幕人成不卡一区 | 日本最新高清不卡中文字幕 | 精品999| www夜夜操 | 国产区久久 | 97香蕉久久超级碰碰高清版 | 亚洲精品美女久久久 | 91色在线观看 | 91视频啪 | 欧美成人久久 | 在线观看你懂的网址 | 狠狠地日 | www视频在线观看 | 8x成人免费视频 | 日韩专区一区二区 | 天堂av在线免费观看 | 久久综合中文色婷婷 | 色婷婷骚婷婷 | 亚洲精品国产高清 | 国产91成人在在线播放 | 99精品一级欧美片免费播放 | 国产999精品久久久久久绿帽 | 中文字幕观看av | 福利av影院 | 久草在线久草在线2 | 超碰在线cao| 国产精品免费大片视频 | 日韩中文在线播放 | 91爱爱免费观看 | 国产字幕在线观看 | 日韩av免费一区 | 国产精品久久久久久久久久99 | 久久久久久草 | 深爱开心激情 | 深夜福利视频一区二区 | 天天操狠狠操 | 国产在线观看99 | 狠狠色丁香婷婷综合最新地址 | 日本黄色大片儿 | 亚洲精品在线观 | 天天做天天爱天天爽综合网 | 福利网址在线观看 | 黄色影院在线免费观看 | 天天激情综合网 | 国产在线观看高清视频 | 亚洲精品在线一区二区三区 | 国产精品欧美日韩在线观看 | 亚洲欧美日韩在线看 | 日韩电影一区二区三区在线观看 | 久久久午夜精品理论片中文字幕 | 欧美日韩精品在线 | 69国产精品视频免费观看 | 黄色三级久久 | 亚洲一级二级三级 | 国产成人不卡 | 久久伊99综合婷婷久久伊 | 在线观看亚洲国产 | 天天色欧美 | 日本不卡视频 | 免费在线播放 | 国产欧美日韩一区 | www免费| 欧美精品xxx| 黄色三级网站 | 很黄很色很污的网站 | 91中文在线观看 | 国产韩国精品一区二区三区 | www.av免费| a级免费观看| 黄色a在线观看 | av高清影院 | 国产精品99久久久久久有的能看 | 国产精品国产三级国产不产一地 | 亚洲 中文 欧美 日韩vr 在线 | 免费网站在线观看人 | 久久在线看 | 国产一区观看 | 日本精油按摩3 | 久久在线免费视频 | 9999毛片| 国产精品免费视频观看 | 91污污视频在线观看 | 一区免费观看 | 成年人免费观看在线视频 | 最新婷婷色| 久久国产精品久久精品 | 91视频xxxx| 免费黄色激情视频 | 久久6精品 | 欧洲精品在线视频 | 国产在线观看网站 | 日韩一区二区三区在线观看 | 日韩高清免费无专码区 | www四虎影院 | 天天摸天天弄 | 高潮久久久 | 婷婷久久五月 | 手机看国产毛片 | 国产精品免费成人 | 久久爱992xxoo| 午夜12点 | 久久久在线免费观看 | 久久亚洲成人网 | 免费在线观看亚洲视频 | 亚洲激情av | 区一区二在线 | 天堂av在线 | 精品在线播放视频 | 日韩一区正在播放 | 视频一区二区视频 | 久久国产精品免费视频 | 国产99久久九九精品免费 | 最新中文字幕在线观看视频 | 免费裸体视频网 | 91精品久久久久久久99蜜桃 | 欧美日在线观看 | www.色在线| 高清av不卡 | 国产精品专区一 | 91精品视频免费在线观看 | 天天射天天射 | 91视频免费看网站 | 激情综合网五月 | 欧美先锋影音 | 深爱五月激情五月 | 三级动态视频在线观看 | 欧美日韩国产页 | 中文字幕二区在线观看 | 欧美精品一区在线发布 | 欧美一区二区三区在线 | 精品字幕在线 | 国产精品 亚洲精品 | 91精品网站| 超级碰碰免费视频 | 久久久五月天 | 色综合色综合久久综合频道88 | 国产免费小视频 | 亚洲成a人片在线观看中文 中文字幕在线视频第一页 狠狠色丁香婷婷综合 | 97视频一区 | 午夜精品视频一区二区三区在线看 | 免费观看丰满少妇做爰 | 婷婷激情综合 | 色综合久久久久综合体 | 久久免费精品国产 | 国产精品久久电影观看 | 人人爽人人舔 | 久久人人爽| 中文字幕丝袜美腿 | 亚洲精品国产高清 | 爱射综合| 天堂av官网 | 婷婷免费视频 | 激情五月视频 | 久久99九九99精品 | 亚洲国内精品在线 | 国产亚洲视频在线观看 | 久久夜靖品 | 免费aa大片| 欧美一区二区在线刺激视频 | 成人黄色片免费看 | 国产精品福利久久久 | 国产爽视频 | 91精品一区二区三区蜜臀 | 天天在线操 | 日韩一区二区三区不卡 | 久久久久福利视频 | 在线视频精品播放 | 日本三级人妇 | а天堂中文最新一区二区三区 | 中文字幕一区二区三区乱码不卡 | 日日日日干 | 久久人网 | av成人动漫在线观看 | 久久人人爽人人爽人人片av软件 | 精品91久久久久 | 国产精品永久免费观看 | 日韩欧美在线观看一区二区 | 亚洲电影久久久 | 亚洲一区精品二人人爽久久 | 男女啪啪免费网站 | 国产精品露脸在线 | 亚洲精品视频在线免费 | 麻豆传媒电影在线观看 | 韩日av在线| bbbb操bbbb| 在线观看国产成人av片 | 射久久久 | 午夜精品一区二区三区免费视频 | 国模吧一区 | 国产精品99久久久久久久久久久久 | 欧美精品xxx| 日韩在线高清视频 | 国产不卡视频在线播放 | 国产精品中文久久久久久久 | 国产欧美精品一区二区三区四区 | 亚洲国产色一区 | 日韩一级片观看 | 国内精品久久久久久久久 | 超级碰碰碰免费视频 | 亚洲影音先锋 | 亚洲天天摸日日摸天天欢 | 国产精品21区| 干 操 插 | 91看片在线播放 | 国产麻豆成人传媒免费观看 | av噜噜噜在线播放 | 丁香资源影视免费观看 | 亚洲国产视频直播 | 日本成址在线观看 | 成人一级电影在线观看 | 精品国产伦一区二区三区观看说明 | 国产精品一区二区av日韩在线 | 人人天天夜夜 | 亚洲精品久久激情国产片 | 日韩精品久久一区二区三区 | 日韩在线电影 | 国产精品婷婷午夜在线观看 | 日日久视频 | 亚洲精品在线看 | 日韩成人免费在线 | 国产黄色视 | 欧美二区视频 | av免费在线网站 | 日本乱视频 | 97香蕉视频 | 四虎影视成人永久免费观看亚洲欧美 | 久草视频免费观 | 美女视频久久黄 | 天天操天天射天天爱 | 一区二区三区国产欧美 | 97精品国产97久久久久久免费 | 天天综合天天综合 | 亚洲成av片人久久久 | 日韩资源视频 | 97精品一区二区三区 | 国产精品亚洲片在线播放 | 久久夜色精品亚洲噜噜国4 午夜视频在线观看欧美 | 久久久国产一区 | 国产美女永久免费 | a视频免费 | 日韩成人精品一区二区三区 | 欧美在线视频第一页 | 91精品视频播放 | 色婷婷色| 免费毛片一区二区三区久久久 | 日韩网站在线播放 | 九九热精品在线 | 97品白浆高清久久久久久 | 九九视频这里只有精品 | 日韩欧美精品在线观看 | 国产精品免费看久久久8精臀av | 激情文学综合丁香 | 色综合亚洲精品激情狠狠 | 中文字幕 国产 一区 | 国产精品久久久久aaaa九色 | 在线小视频你懂的 | 国产不卡免费av | 久久高清精品 | 天天干人人 | 在线观看中文字幕dvd播放 | 成人免费一区二区三区在线观看 | 五月激情片 | 中文亚洲欧美日韩 | 99国产精品一区二区 | av电影一区二区三区 | 欧美日韩国产在线精品 | 亚洲h在线播放在线观看h | 欧美 日韩 成人 | 在线三级播放 | 美女视频一区 | 亚洲春色成人 | 国产一级不卡视频 | 人人干网| 丁香午夜婷婷 | 麻豆超碰 | 久久免费的精品国产v∧ | 丁香六月婷婷开心婷婷网 | a v在线视频 | 日韩大片在线免费观看 | 日韩欧美一区二区在线 | 日本一区二区三区免费看 | 99热在线免费观看 | 亚洲毛片久久 | 婷婷av在线| 欧美性护士 | 国产精品久久久一区二区 | 亚洲第一av在线播放 | 亚洲女在线 | 国产一区在线免费观看视频 | 国产日韩精品欧美 | 国产精品久久久久免费 | 色婷婷国产精品一区在线观看 | 九九导航| 国产一区二区三区午夜 | 国产一区av在线 | 久久看视频 | 亚洲精品在线观看免费 | 91麻豆精品91久久久久同性 | 夜色资源站国产www在线视频 | 精品久久久久免费极品大片 | 午夜在线观看一区 | 免费av网站在线看 | 久久亚洲综合国产精品99麻豆的功能介绍 | 国产91aaa | 国产精品99久久久久的智能播放 | a极黄色片 | 99精品视频在线播放观看 | 天天操夜夜逼 | 91精品国产成 | 九九日九九操 | 午夜视频在线观看一区二区三区 | 精品中文字幕在线播放 | 99精品一区二区三区 | 久久国产精品免费一区二区三区 | 中字幕视频在线永久在线观看免费 | 久久精品视频一 | 久久久久国 | 国产日韩欧美网站 | 日韩天天干 | 在线观看日韩 | 最近中文字幕大全中文字幕免费 | 人人澡人人舔 | 日韩 精品 一区 国产 麻豆 | 在线看片视频 | 人人干网| 黄色三级久久 | 国内久久视频 | 97国产精品免费 | 国产成人一区二区精品非洲 | 久久只精品99品免费久23小说 | 99产精品成人啪免费网站 | 免费网站在线观看成人 | 国产精品色在线 | a视频免费在线观看 | 欧美少妇xxxxxx | 午夜精品导航 | 天天操人人干 | 98精品国产自产在线观看 | 久久久久日本精品一区二区三区 | 日韩精品一二三 | 国产三级香港三韩国三级 | 日韩免费三区 | 婷婷色网视频在线播放 | 欧美综合色在线图区 | 午夜在线看片 | 亚洲综合视频在线 | 九九热免费观看 | 成人97人人超碰人人99 | 午夜视频在线观看一区 | 特级西西人体444是什么意思 | 伊人影院在线观看 | 久久国产精品免费一区 | 日韩在线 一区二区 | 超碰久热| 麻豆视频免费在线 | 狠狠狠色丁香婷婷综合激情 | 玖玖玖精品 | 国产欧美最新羞羞视频在线观看 | 涩涩网站免费 | 91中文字幕网 | 成年人免费在线播放 | 天天综合天天做天天综合 | 不卡av在线播放 | 看黄色.com | 国产成人久久精品77777综合 | 亚洲 欧美变态 另类 综合 | 天天干天天草天天爽 | 77国产精品 | 亚洲视频免费视频 | 天堂久色| 欧美韩日在线 | 午夜av在线电影 | 美女福利视频 | 99久久精品免费一区 | 高清免费在线视频 | 午夜婷婷在线播放 | 国产不卡高清 | 最近日本mv字幕免费观看 | 精品国产1区 | 久久久久国产精品免费网站 | 区一区二在线 | 久久精品99北条麻妃 | 亚洲视频在线免费看 | av黄色免费看 | 91精品久久久久久久久 | 久九视频| 五月综合| 亚洲精品美女久久久 | 午夜精品电影一区二区在线 | 天天干天天上 | 在线91播放 | 99色免费视频 | 久久久黄色av | 天天天射 | 中文字幕在线视频第一页 | 久久综合久久综合这里只有精品 | 亚洲成年片 | 国产精品国产亚洲精品看不卡 | 国产成人av电影在线观看 | 最近更新好看的中文字幕 | 91久草视频 | 免费日韩一区二区 | 亚洲国产精品成人va在线观看 | 国产精品99久久99久久久二8 | 超碰人人做 | 在线观看网站你懂的 | 麻豆一区在线观看 | 日韩和的一区二在线 | 久久综合影院 | 午夜精品一区二区三区在线播放 | 超碰在线cao | 正在播放久久 | 久草在线在线精品观看 | 久久精品视频观看 | 最近中文字幕大全中文字幕免费 | 国产成人一区二区三区久久精品 | 96香蕉视频 | 精品黄色在线 | 精品a视频 | 青青河边草免费观看 | 亚洲欧美国产精品18p | av三级av | 色噜噜在线观看 | 成人黄性视频 | 五月婷婷黄色网 | 成年人黄色av | 国产精品国内免费一区二区三区 | 日韩影片在线观看 | 欧美日韩视频网站 | 一区二区三区在线免费播放 | av天天干| 日韩影视精品 | 韩日精品中文字幕 | av片中文字幕 | 日韩免费视频线观看 | 成人三级网站在线观看 | 久久国产麻豆 | 国产精品入口a级 | 国产日产精品一区二区三区四区的观看方式 | 中文字幕在线高清 | 开心丁香婷婷深爱五月 | 免费av在线播放 | 欧美在线一二 | 亚洲h在线播放在线观看h | 在线导航福利 | 亚洲永久精品视频 | 欧美大jb| 欧美整片sss| 日本在线视频一区二区三区 | 99久久99视频只有精品 | 综合精品久久 | 91成人精品一区在线播放69 | 黄av资源 | 国产美女无遮挡永久免费 | 少妇搡bbbb搡bbb搡aa | 在线免费精品视频 | 亚洲最大激情中文字幕 | 激情久久久| 日本一区二区三区视频在线播放 | 成人国产精品 | 久久久久久免费 | 国产色秀视频 | 91豆花在线 | 欧美日韩不卡在线视频 | 青草草在线视频 | 国产精品久久久久9999 | 2021国产在线视频 | 亚洲精品免费在线观看 | 国产精品v a免费视频 | 在线观看91精品视频 | 亚洲精品777 | 久久99国产综合精品免费 | 中文字幕中文字幕在线中文字幕三区 | 欧美一区二区三区免费看 | 99精品毛片 | 国产99久久九九精品 | 夜夜骑天天操 | 中文字幕av一区二区三区四区 | 香蕉视频在线网站 | 国产小视频在线观看免费 | jizz欧美性9 国产一区高清在线观看 | 不卡精品视频 | 久久精品国产亚洲 | 国产专区精品 | 夜夜躁日日躁狠狠躁 | 久久久国产精品网站 | 成年人视频在线观看免费 | 亚洲黄色片在线 | 免费看片日韩 | 久久国产免费 | 亚洲在线成人精品 | 国产精品久久久久久久久免费看 | 国产成人三级三级三级97 | 久久精品99国产国产精 | 国产一区在线观看免费 | 天堂网在线视频 | 国产一级一片免费播放放a 一区二区三区国产欧美 | 久久视频免费观看 | 欧美日韩精品电影 | 在线一区av | 婷婷久操| 亚洲国产中文字幕在线视频综合 | 久久久影视 | 亚洲国产成人精品久久 | 久草精品视频 | 97人人视频 | 久久久久成人精品 | 国产超碰在线观看 | 最新av网址在线观看 | 国产成人精品免高潮在线观看 | 国产黄影院色大全免费 | 亚洲mv大片欧洲mv大片免费 | 亚洲伦理精品 | 国产在线播放一区二区 | 狠狠色丁香婷婷 | 狠狠干狠狠艹 | 国产成人一区二区三区在线观看 | 国产在线精品二区 | 国产亚洲欧美精品久久久久久 | 9草在线| 伊人久在线 | 日韩av一区二区三区在线观看 | 成人久久久精品国产乱码一区二区 | 伊人在线视频 | 免费国产在线精品 | 香蕉精品在线观看 | 97视频在线观看播放 | 丁香婷婷深情五月亚洲 | 久久 精品一区 | 私人av | 在线a人v观看视频 | 国产亚洲人 | 国产91av视频在线观看 | 国产精品影音先锋 | 9色在线视频 | 欧美日韩国产页 | 日韩精品在线视频 | 韩国精品一区二区三区六区色诱 | 欧美a级一区二区 | 欧美日韩视频在线观看一区二区 | 久久专区 | 久久久久久久久黄色 | 国产精品精品国产色婷婷 | 91爱爱视频 | 国产色婷婷精品综合在线手机播放 | 色综合久久久久久中文网 | 色婷婷成人网 | 国产精品丝袜久久久久久久不卡 | 久久久99精品免费观看 | 99re6热在线精品视频 | 免费看成人片 | 国产亚洲精品久久久久久久久久久久 | 欧美日韩在线免费视频 | 五月婷在线 | 综合天天| 久久久精选 | 国产精品一级视频 | 国产精品久久久久免费 | 国产精品久久久久久一区二区 | 国产中文欧美日韩在线 | 欧美色888| 成人在线黄色电影 | 激情综合五月天 | 精品一区在线 | 色99色| 日韩av午夜 | 97超碰超碰久久福利超碰 | 亚洲一区二区视频在线播放 | 91精品久久久久久综合乱菊 | 91亚洲国产成人久久精品网站 | 国产精品久久久久久久久久了 | 婷婷色狠狠 | 久久久蜜桃一区二区 | 91av中文 | 国产精品尤物 | 黄色aa久久 | www天天干 | 在线天堂日本 | 国产一区视频导航 | 97在线视 | 极品美女被弄高潮视频网站 | 玖玖玖精品 | 在线观看午夜av | 久久久黄视频 | 91精品国产电影 | 人人澡视频 | 色婷婷视频在线观看 | 欧美日韩视频在线观看免费 | 欧美va天堂va视频va在线 | www色 | 日韩天堂网 | 国产视频不卡 | av网址在线播放 | 五月天亚洲激情 | 国产精品18久久久久vr手机版特色 | 亚洲精品理论 | 久久黄色片子 | 亚洲在线黄色 | 日韩视频免费观看高清完整版在线 | 五月天久久综合网 | 国内外成人在线 | 黄色在线观看www | 精品久久久久国产免费第一页 | 国产欧美久久久精品影院 | 久久久精品网 | 欧美精品久久天天躁 | 久久精品8| 中文字幕亚洲综合久久五月天色无吗'' | 高潮毛片无遮挡高清免费 | www日日夜夜 | 久久久资源网 | 国产精品热 | 色.com| 国内精品免费 | av在线播放快速免费阴 | 久久全国免费视频 | 日韩欧美专区 | 亚洲国产一区在线观看 | 香蕉免费 | 久久久久伦理电影 | 精品999| 国产福利中文字幕 | 国产无吗一区二区三区在线欢 | 亚洲国产片 | 成人性生交大片免费观看网站 | 久久免费视频在线观看 | 国产亚洲一区二区三区 | av片中文 | 欧美韩国在线 | 麻豆国产在线播放 | 久久精品爱爱视频 | 成人黄色免费观看 | 在线观看aa | 久久精品首页 | 亚洲理论在线观看电影 | 韩日电影在线 | 男女拍拍免费视频 | 亚洲免费a | 性色va| 国产精品国产三级国产aⅴ入口 | 人人爽人人片 | 久久这里只有精品23 | 不卡的av在线 | 亚洲 欧美 另类人妖 | 午夜精品久久久久99热app | 五月婷婷一区二区三区 | 日韩中文字幕免费电影 | 人人干人人爽 | 国产精品亚洲综合久久 | japanese黑人亚洲人4k | 中文字幕在线色 | 国产精品久久中文字幕 | 精品久久久久一区二区国产 | 欧美天堂视频在线 | 国产中文字幕一区二区三区 | 17婷婷久久www | 日韩免费高清在线 | a v在线观看 | 久久九九视频 | 在线观看视频免费大全 | 久久精品91久久久久久再现 | 精品一区二区视频 | 久久理论电影 | 国产原厂视频在线观看 | 国产精品毛片一区二区 | 综合久久一本 | 999久久久久 | 日韩黄色在线观看 | 涩涩在线 | 国产中文在线播放 | 国产精品黄网站在线观看 | 精品国产乱码久久久久 | 97在线视频观看 | 99久久久久久国产精品 | 久久成人亚洲欧美电影 | 91精品国产入口 | 国产毛片aaa | 麻豆91小视频 | 久久久久成人精品亚洲国产 | 久久精品中文字幕 | www.干| 97超碰在线人人 | 五月天高清欧美mv | 五月天综合色 | 国产高清视频免费最新在线 | 久久久国产毛片 | 久久国产精品小视频 | 久久资源总站 | 久久久久久久久久久久久久av | 亚洲综合在线播放 | 亚洲国产中文字幕在线视频综合 | japanese黑人亚洲人4k | 国产专区欧美专区 | 狠狠色噜噜狠狠狠合久 | 在线亚洲人成电影网站色www | 日韩啪视频 | 99超碰在线播放 | 亚洲精品在线视频 | 日韩手机在线观看 | 久久久蜜桃 | 欧美射射射| 又黄又爽又无遮挡免费的网站 | 99欧美视频 | 999国内精品永久免费视频 | 五月天亚洲综合小说网 | 久久国产精品99久久久久久丝袜 | 欧美综合国产 | 久久久久国产精品视频 | 91麻豆精品国产91久久久更新时间 | 黄色福利网 | 999抗病毒口服液 | www.午夜 | 日本午夜在线亚洲.国产 | 中文日韩在线视频 | 999国内精品永久免费视频 | 午夜视频一区二区三区 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 99色亚洲 | 香蕉视频亚洲 | 免费福利在线观看 | 成人免费网站在线观看 | 日韩精品在线免费播放 | 在线中文字母电影观看 | 精品国产一区二区三区不卡 | 国产一区在线视频播放 | 女人魂免费观看 | 91热爆在线观看 | 四虎在线视频免费观看 | 久久综合精品国产一区二区三区 | 午夜精品在线看 | 日韩最新理论电影 | 成人国产综合 | 欧美日韩国产网站 | 国产在线免费 | 国产一区成人 | 免费在线观看一区 | 一级欧美日韩 | 国产精品免费观看久久 | 在线成人国产 | 在线黄av | 奇米四色影狠狠爱7777 | 日韩视频中文字幕 | 久久久久免费视频 | 国产一级免费电影 | 天天激情| 激情视频免费在线 | 国产91在线免费视频 | 亚洲黄色在线免费观看 | 中文字幕成人 | 成人一级免费视频 | 国产色视频一区二区三区qq号 | 国产精品大全 | 在线亚洲人成电影网站色www | 中文字幕日韩在线播放 | 天天爽天天搞 | 亚洲桃花综合 | 99久久婷婷国产一区二区三区 | 国产精品99久久久久久有的能看 | 欧美一区二区三区在线 | 日韩在线视频播放 | 毛片精品免费在线观看 | 国产精品久久久久久久免费观看 | 亚洲综合成人av | 欧美国产精品久久久久久免费 | 91精品国产麻豆国产自产影视 | 亚洲免费av在线播放 | 成片视频在线观看 | 天天操月月操 | 91精品一区国产高清在线gif | 午夜精品久久久久久久久久久久 | 狠狠综合久久av | 99综合久久 | 精壮的侍卫呻吟h | 超碰久热| 99精品一区 | 夜夜操天天摸 | 久久99国产精品免费网站 | 综合网av | 精品一区二区日韩 | 一级国产视频 | 丁香综合| 在线观看av网 | 天天干天天想 | 亚洲五月综合 | 久久久久久久综合色一本 | 精品国产一区二区三区久久久 | 天天摸夜夜操 | 久草视频在线免费播放 | 久久精品欧美一区二区三区麻豆 | 久草干 | 精品在线观看一区二区 | 色综合小说 | 有码中文字幕在线观看 | 国产99久久久国产精品成人免费 | 成人禁用看黄a在线 | 国产国产人免费人成免费视频 | 欧美激情视频久久 | 一区国产精品 | 六月婷婷久香在线视频 | 天天天干天天射天天天操 | 欧美视频www | 成人精品国产免费网站 | 亚洲精品在线免费 | 成人小视频在线观看免费 | 国产探花视频在线播放 | 中文字幕在线观看你懂的 | 欧美精品在线观看一区 | 97成人在线观看 | 亚洲精品国偷拍自产在线观看 | 天天干天天射天天插 | 免费a级毛片在线看 | 国产手机视频在线观看 | 欧美日韩在线观看不卡 | 欧美在线资源 | 91黄视频在线 | 婷婷亚洲五月 | 婷婷综合五月天 | 少妇性色午夜淫片aaaze | 亚洲精品久久久久www | 日韩av三区 | 日韩在线中文字幕视频 | 在线观看国产福利片 | 婷婷色六月天 | 91看毛片 | 中文字幕视频播放 | 狠狠搞,com| 国产精品系列在线播放 | 亚洲不卡av一区二区三区 | 五月婷婷激情综合 | 九九综合久久 | 色www精品视频在线观看 | av直接看 | 国产精久久久久久久 | 国产首页 | 日本韩国精品在线 | 青青河边草免费观看 | 又大又硬又黄又爽视频在线观看 | 日韩精品一区二区免费视频 | 日韩精品一二三 | 亚洲闷骚少妇在线观看网站 | 亚洲激情久久 | 日韩,中文字幕 | 免费网站在线观看成人 | 69视频在线播放 | 蜜桃av观看| 9色在线视频 | 精品无人国产偷自产在线 | 国产精品综合av一区二区国产馆 | 亚洲精品美女 | 亚洲a色 | 日本美女xx | 国产麻豆视频在线观看 | 免费在线色视频 | 婷婷 综合 色| 成年人视频在线观看免费 | 99精品国产一区二区 | 久草.com | av不卡免费看 | 久久99精品久久久久久久久久久久 | 91麻豆免费视频 | 国产免费大片 | 成人动漫一区二区三区 | 韩国一区二区在线观看 | 色婷婷免费视频 | 日韩视频图片 | 国产黄色视 | 日韩精品一区二区三区第95 | 国产乱视频 | 久久中文字幕在线视频 | 国产999| 毛片视频电影 | 色资源在线 | 在线视频精品播放 | 国产精品资源在线观看 | 亚洲欧美一区二区三区孕妇写真 | 日韩欧美网站 | 久久久久久国产精品 | 欧美精品成人在线 | av中文字幕在线免费观看 | 一区二区三区在线影院 | 视频一区二区精品 | 国产97碰免费视频 | 中文超碰字幕 | 日韩成人在线一区二区 | 天天干,天天插 | 成人黄色电影免费观看 | 在线观看av中文字幕 | 日日草天天草 | 最近久乱中文字幕 | 久久99热这里只有精品国产 | 亚洲精品乱码白浆高清久久久久久 | 伊人电影在线观看 | 精品国产视频在线观看 | 探花视频在线观看+在线播放 | 久久视频在线免费观看 | 成人a级大片| japanesefreesexvideo高潮| 色一色在线 |