【機(jī)器學(xué)習(xí)實(shí)戰(zhàn)】第12章 使用 FP-growth 算法來(lái)高效發(fā)現(xiàn)頻繁項(xiàng)集

第12章 使用FP-growth算法來(lái)高效發(fā)現(xiàn)頻繁項(xiàng)集

FP-growth算法首頁(yè)

前言

第11章 時(shí)我們已經(jīng)介紹了用 Apriori 算法發(fā)現(xiàn) 頻繁項(xiàng)集關(guān)聯(lián)規(guī)則
本章將繼續(xù)關(guān)注發(fā)現(xiàn) 頻繁項(xiàng)集 這一任務(wù)相叁,并使用 FP-growth 算法更有效的挖掘 頻繁項(xiàng)集

FP-growth 算法簡(jiǎn)介

  • 一種非常好的發(fā)現(xiàn)頻繁項(xiàng)集算法业汰。
  • 基于Apriori算法構(gòu)建,但是數(shù)據(jù)結(jié)構(gòu)不同歹颓,使用叫做 FP樹(shù) 的數(shù)據(jù)結(jié)構(gòu)結(jié)構(gòu)來(lái)存儲(chǔ)集合铜秆。下面我們會(huì)介紹這種數(shù)據(jù)結(jié)構(gòu)。

FP-growth 算法步驟

  • 基于數(shù)據(jù)構(gòu)建FP樹(shù)
  • 從FP樹(shù)種挖掘頻繁項(xiàng)集

FP樹(shù) 介紹

  • FP樹(shù)的節(jié)點(diǎn)結(jié)構(gòu)如下:
class treeNode:
    def __init__(self, nameValue, numOccur, parentNode):
        self.name = nameValue     # 節(jié)點(diǎn)名稱
        self.count = numOccur     # 節(jié)點(diǎn)出現(xiàn)次數(shù)
        self.nodeLink = None      # 不同項(xiàng)集的相同項(xiàng)通過(guò)nodeLink連接在一起
        # needs to be updated
        self.parent = parentNode  # 指向父節(jié)點(diǎn)
        self.children = {}        # 存儲(chǔ)葉子節(jié)點(diǎn)

FP-growth 原理

基于數(shù)據(jù)構(gòu)建FP樹(shù)

步驟1:

  1. 遍歷所有的數(shù)據(jù)集合芥炭,計(jì)算所有項(xiàng)的支持度漓库。
  2. 丟棄非頻繁的項(xiàng)。
  3. 基于 支持度 降序排序所有的項(xiàng)园蝠。


    步驟1-3
  4. 所有數(shù)據(jù)集合按照得到的順序重新整理渺蒿。
  5. 重新整理完成后,丟棄每個(gè)集合末尾非頻繁的項(xiàng)彪薛。


    步驟4-5

步驟2:

  1. 讀取每個(gè)集合插入FP樹(shù)中茂装,同時(shí)用一個(gè)頭部鏈表數(shù)據(jù)結(jié)構(gòu)維護(hù)不同集合的相同項(xiàng)。
    步驟6-1

最終得到下面這樣一棵FP樹(shù)


步驟6-2

從FP樹(shù)中挖掘出頻繁項(xiàng)集

步驟3:

  1. 對(duì)頭部鏈表進(jìn)行降序排序

  2. 對(duì)頭部鏈表節(jié)點(diǎn)從小到大遍歷善延,得到條件模式基少态,同時(shí)獲得一個(gè)頻繁項(xiàng)集。


    步驟6-2

    如上圖易遣,從頭部鏈表 t 節(jié)點(diǎn)開(kāi)始遍歷彼妻,t 節(jié)點(diǎn)加入到頻繁項(xiàng)集。找到以 t 節(jié)點(diǎn)為結(jié)尾的路徑如下:


    步驟7-1

    去掉FP樹(shù)中的t節(jié)點(diǎn)豆茫,得到條件模式基<左邊路徑,左邊是值>[z,x,y,s,t]:2侨歉,[z,x,y,r,t]:1 。條件模式基的值取決于末尾節(jié)點(diǎn) t 揩魂,因?yàn)?t 的出現(xiàn)次數(shù)最小幽邓,一個(gè)頻繁項(xiàng)集的支持度由支持度最小的項(xiàng)決定。所以 t 節(jié)點(diǎn)的條件模式基的值可以理解為對(duì)于以 t 節(jié)點(diǎn)為末尾的前綴路徑出現(xiàn)次數(shù)火脉。

  3. 條件模式基繼續(xù)構(gòu)造條件 FP樹(shù)牵舵, 得到頻繁項(xiàng)集柒啤,和之前的頻繁項(xiàng)組合起來(lái),這是一個(gè)遞歸遍歷頭部鏈表生成FP樹(shù)的過(guò)程畸颅,遞歸截止條件是生成的FP樹(shù)的頭部鏈表為空担巩。
    根據(jù)步驟 2 得到的條件模式基 [z,x,y,s,t]:2,[z,x,y,r,t]:1 作為數(shù)據(jù)集繼續(xù)構(gòu)造出一棵FP樹(shù)重斑,計(jì)算支持度兵睛,去除非頻繁項(xiàng),集合按照支持度降序排序窥浪,重復(fù)上面構(gòu)造FP樹(shù)的步驟。最后得到下面 t-條件FP樹(shù) :


    步驟7-2

    然后根據(jù) t-條件FP樹(shù) 的頭部鏈表進(jìn)行遍歷笛丙,從 y 開(kāi)始漾脂。得到頻繁項(xiàng)集 ty 。然后又得到 y 的條件模式基胚鸯,構(gòu)造出 ty的條件FP樹(shù)骨稿,即 ty-條件FP樹(shù)。繼續(xù)遍歷ty-條件FP樹(shù)的頭部鏈表姜钳,得到頻繁項(xiàng)集 tyx坦冠,然后又得到頻繁項(xiàng)集 tyxz. 然后得到構(gòu)造tyxz-條件FP樹(shù)的頭部鏈表是空的,終止遍歷哥桥。我們得到的頻繁項(xiàng)集有 t->ty->tyz->tyzx辙浑,這只是一小部分。

  • 條件模式基:頭部鏈表中的某一點(diǎn)的前綴路徑組合就是條件模式基拟糕,條件模式基的值取決于末尾節(jié)點(diǎn)的值判呕。
  • 條件FP樹(shù):以條件模式基為數(shù)據(jù)集構(gòu)造的FP樹(shù)叫做條件FP樹(shù)。

FP-growth 算法優(yōu)缺點(diǎn):

* 優(yōu)點(diǎn): 1. 因?yàn)?FP-growth 算法只需要對(duì)數(shù)據(jù)集遍歷兩次送滞,所以速度更快侠草。
        2. FP樹(shù)將集合按照支持度降序排序,不同路徑如果有相同前綴路徑共用存儲(chǔ)空間犁嗅,使得數(shù)據(jù)得到了壓縮边涕。
        3. 不需要生成候選集。
        4. 比Apriori更快褂微。
* 缺點(diǎn): 1. FP-Tree第二次遍歷會(huì)存儲(chǔ)很多中間過(guò)程的值功蜓,會(huì)占用很多內(nèi)存。
        2. 構(gòu)建FP-Tree是比較昂貴的蕊梧。
* 適用數(shù)據(jù)類型:標(biāo)稱型數(shù)據(jù)(離散型數(shù)據(jù))霞赫。

FP-growth 代碼講解

完整代碼地址: https://github.com/apachecn/MachineLearning/blob/master/src/python/12.FrequentPattemTree/fpGrowth.py

main 方法大致步驟:

if __name__ == "__main__":
    simpDat = loadSimpDat()                       #加載數(shù)據(jù)集。
    initSet = createInitSet(simpDat)              #對(duì)數(shù)據(jù)集進(jìn)行整理肥矢,相同集合進(jìn)行合并端衰。
    myFPtree, myHeaderTab = createTree(initSet, 3)#創(chuàng)建FP樹(shù)叠洗。
    freqItemList = []
    mineTree(myFPtree, myHeaderTab, 3, set([]), freqItemList) #遞歸的從FP樹(shù)中挖掘出頻繁項(xiàng)集。
    print freqItemList

大家看懂原理旅东,再仔細(xì)跟蹤一下代碼灭抑。基本就沒(méi)有問(wèn)題了抵代。


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末腾节,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子荤牍,更是在濱河造成了極大的恐慌案腺,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,270評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件康吵,死亡現(xiàn)場(chǎng)離奇詭異劈榨,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)晦嵌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)同辣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人惭载,你說(shuō)我怎么就攤上這事旱函。” “怎么了描滔?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,630評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵棒妨,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我伴挚,道長(zhǎng)靶衍,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,906評(píng)論 1 295
  • 正文 為了忘掉前任茎芋,我火速辦了婚禮颅眶,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘田弥。我一直安慰自己涛酗,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布偷厦。 她就那樣靜靜地躺著商叹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪只泼。 梳的紋絲不亂的頭發(fā)上剖笙,一...
    開(kāi)封第一講書(shū)人閱讀 51,718評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音请唱,去河邊找鬼弥咪。 笑死过蹂,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的聚至。 我是一名探鬼主播酷勺,決...
    沈念sama閱讀 40,442評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼扳躬!你這毒婦竟也來(lái)了脆诉?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,345評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤贷币,失蹤者是張志新(化名)和其女友劉穎击胜,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體役纹,經(jīng)...
    沈念sama閱讀 45,802評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡潜的,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了字管。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,117評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡信不,死狀恐怖嘲叔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情抽活,我是刑警寧澤硫戈,帶...
    沈念sama閱讀 35,810評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站下硕,受9級(jí)特大地震影響丁逝,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜梭姓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評(píng)論 3 331
  • 文/蒙蒙 一霜幼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧誉尖,春花似錦罪既、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,011評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至探熔,卻和暖如春驹针,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背诀艰。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,139評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工柬甥, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留饮六,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,377評(píng)論 3 373
  • 正文 我出身青樓暗甥,卻偏偏與公主長(zhǎng)得像喜滨,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子撤防,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容