模式識別中的Apriori算法和FPGrowth算法

pattern discovery算法

模式識別中的一些基本概念

  • 模式:對於一個集合項,某些特定的子序列或者結構一般一塊兒出如今數據集中
  • absolute support :某一項出現的頻率[數量]
  • relative support: 某一項出現的頻率
  • frequent item:該項的support值大於最小support閾值
  • association rules: X->Y(s,c) 在有X的前提下,有Y的機率是多少 s(support):support( x U y )[x和y都出現的數量];
  • confidence:既包含x又包含y的機率,簡記爲c = sup(x U y) / sup(x)
  • close pattern:子集x是頻繁的。而且不存在一個x的父集y,是的y和x有同樣的support值。它不會丟失頻繁子集信息
  • max pattern: 子集x是頻繁的。而且不存在一個x的父頻繁子集。會丟失頻繁子集的support值

Apriori算法基本思想

若是一個集合是頻繁的,那麼在同一個最小sup值下,它的子集也是頻繁的。算法的核心思想是:首先找到全部的1項表明集C1,根據sup過濾獲得頻繁集合F1,從F1中獲得表明集C2,C2的本身若是有不在F1中的,就刪掉【這個過程稱爲剪枝】,而後遍歷數據集,當C2中的數據在原始數據集中是頻繁的時候,獲得頻繁集F2,依次往復。數據庫

Aprior算法面臨的問題

  1. 看起來沒產生一個頻繁集須要訪問一遍數據庫,改進的策略是:分區。
  2. 從k項的頻繁集,到k+!項的表明集會包含不少元素,因此最好能減小表明集的數量,有效策略是 hash(等)。

分區策略

對於一個很大的數據庫來講,分區以後,若是某一項是頻繁的,意味着至少存在一個分區,它也是頻繁的,因此,第一次掃描數據庫,先把當前分區的數據所有收入內存,而後計算出當前分區的全部頻繁集,而後把全部的頻繁集統一收做全局表明。再過濾出全局頻繁的,整個過程只有兩次掃描數據庫【有點小把戲,把數據縮小到內存中能放下,在內存中算】ide

  • ECLAT(Equivalence Class Transformation):通常的數據庫是根據項ID和項值來存儲的,這裏的主要思想是把惟一的項值提出來,對應列放在數據庫中的項ID列表。
    此時,當前項的頻率就是ID列表的大小,若是要看兩個項的頻率就是求IDlist的交集。
    這種存儲具有以下的特徵:若是idlist如出一轍,表明這兩項確定是一塊兒出現;若是x的ID列表是Y的ID列表的子集,那麼擁有X項的記錄一定擁有Y

hash較少表明集數量

對全部k集頻繁項作hash計算,hash表中存儲計算結果爲同一個hash值的個數【能夠在具體的分區作】,若是這個數值小於support值,那麼當前hash桶中的全部項都不是頻繁的,就不會當作表明集頻繁模式挖掘-DHP算法詳解 | I am Busyui

大體思路是:同一個hash值的確定會進同一個地方,若是一項出現多個,那麼他們一定是進同一個hash桶,也就是說這個的hash桶的個數會不少,若是個數少,說明這個hash桶中的數據都不是頻繁的orm

FPGrowth算法

FP-tree(frequent pattern tree)定義:cdn

  1. 它包含了一個root,被標記成null,root有每一項做爲前綴的子項,同時有一張表記錄了頻繁項的頭;
  2. 項前綴的子樹包含3個部分:該項的名字,數量和節點連接。
  3. 每一個頻繁項的頭表有兩個字段,項的名字以及節點連接的頭

FP-tree挖掘的步驟:
通過FP定義構建好FP-tree以後,這時它的跟節點是root,能夠稱做全局樹,而後根據header table給定的順序,從末尾的項,選擇一個元素P,以它爲條件,構建FP-tree,稱做P條件先的FP-tree,構建策略是從P開始往上尋找父節點,count值則是以P爲基礎,構建結果後,一直到最終只剩下一個元素,挖掘結束

相關文章
相關標籤/搜索