1. 程式人生 > >挖掘頻繁模式、相關和關聯(1)

挖掘頻繁模式、相關和關聯(1)

頻繁模式(Frequent Pattern)是頻繁出現在資料集中的模式(如項集,子序列和子結構)。頻繁模式一般可以用關聯規則表示如何判斷模式是否頻繁,有兩個基本的度量:

支援度(support):該模式在所有被考察的物件中的佔比,表示了該模式(規則)的有用性;

置信度(cofidence):由規則的前因推出後果的可信度,表示了規則的確定性;

設規則為A->B,則支援度和置信度可以表示如下:

support(A->B) = P(AUB)

confidence(A->B) = P(A|B)

根據上面的定義,可以得出挖掘關聯規則(A->B)的問題可以歸結為挖掘頻繁項集(因為這裡的概率運算都可以用滿足條件的項的出現次數和總個數的比表示):

1. 找出所有的頻繁項集;

2. 有頻繁項集產生強關聯規則;

將可以看到,第一步的開銷遠大於第二步,所以效能將由第一步決定。

挖掘海量資料的主要挑戰是這種挖掘常常產生大量滿足最小支援度閾值的項集,因為如果一個項集是頻繁的,那麼它的每個子集也是頻繁的。比如說包含100個項集的子集就遠遠超出了目前計算機的儲存限制。為了克服這個問題,提出了比頻繁項集和極大頻繁項集的概念。

閉頻繁項集:如果不存在真超項集Y使得Y與X在項集S中有相同的支援度計數,則稱X在S中試閉的。項集X是S中的閉頻繁項集,如果X在S中是閉的和頻繁的;

極大頻繁項集:如果X是頻繁的,並且不存在超項集Y使得X屬於Y,並且Y在S中是頻繁的。

閉頻繁項集的集合包含了頻繁項集的完整資訊,但是從極大頻繁項集只能知道一個特定的項集是否是頻繁的,而無從得知其實際支援度計數。

下面是從事務或關係資料集中挖掘頻繁項集的方法。

Apriori演算法---使用候選產生髮現頻繁項集

Apriori演算法使用逐層搜尋的迭代方法,即使用包含了k個元素的項集K來探索K+1項集。每產生一個層次的項集,需要掃描整個項集一遍。為了提高逐層掃描的效率,使用如下的Apriori 規則來壓縮搜尋空間。

Apriori性質:頻繁項集的所有非空子集也必須是頻繁的

該性質意味著"大"頻繁項集可以有"小"頻繁項集來產生。

設定L(k)是指每個項包含k個元素的頻繁項集,意味著k層的掃描。Apriori演算法

主要有兩步,可以表示如下:

連線步:假設已經得到L(K-1),那麼將L(K-1)與自身連線產生L(k)的候選集合。這一步主要是集合的合併運算,施加一定的限制,使得連線產生的是K個元素;

剪枝步:得到候選集合後,應用Apriori性質。對候選集合的每一個項集,檢查它的k-1子集是否在L(K)中,如果有不在的情況,則從候選項集中刪除此項集。最終得到L'(k),然後掃描整個項集,得到L'(k)每個項集的支援度計數,篩選即可得到L(k);

連續執行這兩步,就可以得到所有的頻繁項集:L(1),L(2),…,L(n)。

現在又很多的方法可以用來提高Apriori演算法的效率,如基於雜湊的技術、事務壓縮、劃分、抽樣、動態項集技術等。其中“劃分”方法類似與分治法,將資料集劃分成n份,第一步得到區域性的頻繁項集,第二部將區域性頻繁項集合並得到全域性頻繁項集候選,最後掃描整個項集,刪除候選中不符合最小支援度計數的從未得到頻繁項集。第一步中使用一種特殊的資料結構使得只需要掃描一遍區域性項集就可以得到所有的區域性頻繁項集。至於區域性項集的劃分以每個劃分可以放入記憶體為標準。

不候選產生挖掘頻繁項集

Apriori的候選-產生機制顯著壓縮了候選項集的大小,並導致的很好的效能,但是也有一些缺點,比如說當資料量很大的時候,候選集將會非常的大(劃分方法可以避免這一點);並且需要多次掃描資料庫(劃分應該是一個非常好的方法)。所以一種稱作“頻繁模式增長”或簡稱FP增長(FP Growth)的方法應運而生了。它採用分治策略,將提供頻繁項的資料庫壓縮到一顆頻繁模式樹中,但仍保留項集的相關資訊。然後將壓縮後的資料庫劃分成一組條件資料庫 ,每個關聯一個頻繁項或模式段,並分別挖掘每個條件資料庫。其主要的過程描述如下:

1.構造FP樹和項頭表  FP樹包含了原始資料的關聯關係和計數資訊。

  1. 1.1 首先遍歷一遍資料庫,得到1項集的計數資訊,並按減序排列成L
  2. 1.2 初始化一顆樹T,根節點為NULL;
  3. 1.3 第二次遍歷資料庫,對其中的每一項,先按照L的順序重新組織項裡面的元素,得到E'。然後查詢T,檢查T是否已經有一條路徑為項E',若沒有,則根據情況增加T的節點。並且將路徑上各元素的計數加1;
  4. 1.4 對於每一項得到的葉節點,更新項頭表:如果葉節點為新加入的,則新增指標到該節點對應元素的桶的末尾。

2.由FP樹得到條件模式基並構造其FP樹  條件模式基實際上是由FP樹中的字尾模式以及與其一起出現的字首路徑集組成。

  1. 2.1 從L中的最後一個元素e開始,以e作為字尾開始構造FP樹。首先沿著項頭表對應的桶得到其在T中葉子節點的位置,向上回溯就會得到其字首路徑集:以e為結尾的所有路徑的集合,並攜帶此路徑的計數資訊。路徑集和e就構成了e的條件模式基;
  2. 2.2 按照第一步的方法,從條件模式中構造它的FP樹。這裡就包括了多個FP樹,稱作條件FP樹;
  3. 2.3 條件FP樹的所有路徑上的元素的組合和它的字尾構成了頻繁模式集;

我對這個演算法的理解有幾點是:

1. 資料庫中的項需要根據1項集的計數從大到小排序,保證後續FP樹的構造過程,使得構造過程非常簡單易懂;

  1. 2. 由第一步的FP樹構造過程可以看出,對於元素e,如果把在1項集中計數比e大的元素集合稱作S,那麼S中的元素只可能出現在e的字首路徑集中;
  2. 3. 由第2點可以看出 從計數小的元素開始尋找條件模式基 的原因。這樣帶來的一個好處是計數大的字尾模式對應的頻繁模式中不用考慮計數比自己小的元素e,因為包含e的頻繁模式已近都在前面被找出來了;

FP增長方法適當變形也可以適用於大型資料庫。它方法可以利用遞迴方法實現,有時間的話我倒想實現一個C++語言的版本看看,挺有意思的。