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

爬蜥發表於2019-03-04

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,依次往復。

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

Aprior演算法面臨的問題

  1. 看起來沒產生一個頻繁集需要訪問一遍資料庫,改進的策略是:分割槽。
  2. 從k項的頻繁集,到k+!項的代表集會包含很多元素,所以最好能減少代表集的數量,有效策略是 hash(等)。

分割槽策略

對於一個很大的資料庫來說,分割槽之後,如果某一項是頻繁的,意味著至少存在一個分割槽,它也是頻繁的,所以,第一次掃描資料庫,先把當前分割槽的資料全部收入記憶體,然後計算出當前分割槽的所有頻繁集,然後把所有的頻繁集統一收作全域性代表。再過濾出全域性頻繁的,整個過程只有兩次掃描資料庫【有點小把戲,把資料縮小到記憶體中能放下,在記憶體中算】

  • ECLAT(Equivalence Class Transformation):一般的資料庫是根據項ID和項值來儲存的,這裡的主要思想是把唯一的項值提出來,對應列放在資料庫中的項ID列表。
    模式識別中的Apriori演算法和FPGrowth演算法

    此時,當前項的頻率就是ID列表的大小,如果要看兩個項的頻率就是求IDlist的交集。
    這種儲存具備如下的特徵:如果idlist一模一樣,代表這兩項肯定是一起出現;如果x的ID列表是Y的ID列表的子集,那麼擁有X項的記錄必定擁有Y

hash較少代表集數量

對所有k集頻繁項做hash計算,hash表中儲存計算結果為同一個hash值的個數【可以在具體的分割槽做】,如果這個數值小於support值,那麼當前hash桶中的所有項都不是頻繁的,就不會當做代表集頻繁模式挖掘-DHP演算法詳解 | I am Busy

大致思路是:同一個hash值的肯定會進同一個地方,如果一項出現多個,那麼他們必定是進同一個hash桶,也就是說這個的hash桶的個數會很多,如果個數少,說明這個hash桶中的資料都不是頻繁的

FPGrowth演算法

FP-tree(frequent pattern tree)定義:

  1. 它包含了一個root,被標記成null,root有每一項作為字首的子項,同時有一張表記錄了頻繁項的頭;
  2. 項字首的子樹包含3個部分:該項的名字,數量和節點連結。
  3. 每個頻繁項的頭表有兩個欄位,項的名字以及節點連結的頭
模式識別中的Apriori演算法和FPGrowth演算法

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

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

相關文章