1. 程式人生 > >關聯分析——Apriori演算法

關聯分析——Apriori演算法

關聯分析:

百度百科定義:又稱關聯挖掘,就是在交易資料、關係資料或其他資訊載體中,查詢存在於專案集合或物件集合之間的頻繁模式、關聯、相關性或因果結構。或者說,關聯分析是發現交易資料庫中不同商品(項)之間的聯絡。

說白了,就是從大量資料中發現元素之間的關聯和相關聯絡。

最典型的例子就是購物車分析,通過發現顧客放人其購物車中的不同商品之間的聯絡,分析顧客的購買習慣。通過了解哪些商品頻繁地被顧客同時購買,這種關聯的發現可以幫助零售商制定營銷策略。其他的應用還包括價目表設計、商品促銷、商品的排放和基於購買模式的顧客劃分。

如“67%的顧客在購買啤酒的同時也會購買尿布”,因此通過合理的啤酒和尿布的貨架擺放或捆綁銷售可提高超市的服務質量和效益。又如“‘C語言’課程優秀的同學,在學習‘資料結構’時為優秀的可能性達88%”,那麼就可以通過強化“C語言”的學習來提高教學效果。

關聯分析的演算法:
Apriori演算法,FP-growth演算法。

=================================================

Apriori演算法

簡介:

Apriori演算法是一種挖掘關聯規則的頻繁項集演算法,其核心思想是通過候選集生成和情節的向下封閉檢測兩個階段來挖掘頻繁項集。而且演算法已經被廣泛的應用到商業、網路安全等各個領域。

基本概念:對於A ⇒ B

(1)、支援度:P(A ∩ B),既有A又有B的概率
(2)、置信度:P(B|A),在A發生的事件中同時發生B的概率 p(AB)/P(A)

例如 購物車分析:牛奶 ⇒ 麵包
支援度:3% 意味著3%顧客同時購買牛奶和麵包
置信度:40% 意味著購買牛奶的顧客40%也購買麵包

(3)、頻繁項集:所有支援度大於最小支援度的項集稱為頻繁項集,簡稱頻集
(4)、如果事件A中包含k個元素,那麼稱這個事件A為K項集事件,A滿足最小支援度發值的事件稱為頻繁K項集
(5)、同時滿足最小支援度閥值和最小置信度閥值的規則稱為強規則。

實現步驟:
Aprior使用一種稱作逐層搜尋的迭代方法,“K-1項集”用於搜尋“K項集”。
首先,找出頻繁“1項集”的集合,該集合記作L1,L1用於找頻繁“2項集”的集合L2,而L2用於找L3。如此下去,直到不能找到“K項集”。找每個Lk都需要一次資料庫掃描。

核心思想:連線步和剪枝步。
連線步是自連線,原則就是保證前k-2項相同,並按照字典順序連線。
剪枝步是使任一頻繁項集的所有非空子集也必須是頻繁的。反之,如果其中候選的非空子集不是頻繁的,那麼該候選肯定不是頻繁的,這樣就可以將其刪除。

簡單的講:(1)掃描;(2)計數;(3)比較;(4)產生頻繁項集;(5)連線、剪枝,產生候選項集;(6)重複步驟(1)~(5)直到不能發現更大的頻集。

虛擬碼

 // 找出頻繁 1 項集
     L1 =find_frequent_1-itemsets(D); 
     For(k=2;Lk-1 !=null;k++){
// 產生候選,並剪枝
        Ck =apriori_gen(Lk-1 ); 
// 掃描 D 進行候選計數
        Foreach transation t  in D{ 
            Ct =subset(Ck,t); // 得到 t 的子集
            Foreach candidate  c 屬於 Ct
                c.count++;
        }
        //返回候選項集中不小於最小支援度的項集
        Lk ={c ∈ Ck | c.count>=min_sup}
}
Return L= 所有的頻繁集;
第一步:連線(joinProcedure apriori_gen (Lk-1 :frequent(k-1)-itemsets)
      Foreach  l1Lk-1
         Foreach  l2Lk-1
            If( (l1 [1]=l2 [1])&&( l1 [2]=l2 [2])&& ……&& (l1 [k-2]=l2 [k-2])&&(l1 [k-1]<l2 [k-1]) ) 
then{
                    c = l1 join l2    // 連線步:產生候選
                  //若k-1項集中已經存在子集c則進行剪枝
                   if has_infrequent_subset(c, Lk-1 ) then
                       delete c; // 剪枝步:刪除非頻繁候選
                   else add c to Ck;
                   }
          Return Ck;
第二步:剪枝(prune)
 Procedure has_infrequent_sub (c:candidate k-itemset; Lk-1 :frequent(k-1)-itemsets)
         Foreach (k-1)-subset s of c
            If s 不屬於 Lk-1 then
               Return true;
        Return false;

演算法例子:

這裡寫圖片描述

缺點不足:
(1)由頻繁k-1項集進行自連線生成的候選頻繁k項集數量巨大。
(2)在驗證候選頻繁k項集的時候需要對整個資料庫進行掃描,非常耗時。

網上提到的頻集演算法的幾種優化方法:
1.基於劃分的方法。2. 基於hash的方法。3. 基於取樣的方法。4. 減少交易的個數。