1. 程式人生 > >基於關聯規則的推薦-獲取頻繁項集

基於關聯規則的推薦-獲取頻繁項集

關聯規則:

關聯規則是形如X->Y的蘊含表示式,其中X和Y是不相交的項集,即X∩Y=∅。

關聯規則的強度可以用它的支援度(support)和置信度(confidence)來度量

支援度確定規則可以用於給定資料集的頻繁程度(能夠關聯的次數)
置信度確定Y在包含X的交易中出現的頻繁程度(能夠成功關聯的次數)

    支援度s和置信度c的形式定義如下:

        ||--> ·s(X->Y)=σ(X∪Y)/N
        ||--> ·c(X->Y)=σ(X∪Y)/σ(X)

        因此,大多數關聯規則挖掘演算法通常採用的一種策略是:

將關聯規則挖掘任務分解為如下兩個主要的子任務:

1.頻繁項集的產生:

    其目標是發現滿足最小值尺度閾值的所有項集,這些項集稱作頻繁項集(frequent itemset)

2.規則的產生:

    其目標是從上一步發現的頻繁項集中提取所有高置信度的規則,這些規則稱作強規則(strong rule)

顯而易見。頻繁項集的產生所需要的計算開銷遠大於產生規則所需的計算開銷。

使用Apriori演算法獲取頻繁項集

暴力挖取:

最容易想到的、也是最直接的關聯關係挖掘的方法或許就是暴力搜尋    (Brute-force)的方法。

但是暴力的計算量過大,一個包含k個項的資料集可能產生2^k-1個      頻繁項集。

發現頻繁項集的一種原始方法是確定每一個候選項集(candidate -itemset)的支援度計數。為了完成這一任務,必須將每個候選項集與每個交易進行比較。

如果候選項集包含在交易中則候選集的支援度計數增加。

複雜度O(NMω),N是交易數,M=2^k-1是候選項集數,而ω是交易的最大寬度(也就是交易中最大的項數)

先驗原理:

    對於本身複雜度極高的Brute-force,我們必須設法降低產生頻繁項集的計算複雜度。此時我們可以利用支援度對候選項集進行剪枝。

Apriori定律1:

如果一個集合是頻繁項集,則它所有的子集都是頻繁項集。

Apriori定律2:

如果一個集合不是頻繁項集,則它的所有的超集都不是頻繁項集。

剪枝原則:

依據apriori定律2,當一個集合不是頻繁項集時,剪除所有向下的集合。

頻繁項集的產生:

R.Agrawal 和 R. Srikant於1994年在文獻中提出了Apriori演算法,該演算法的描述如下:

·Let k=1
        ·Generate frequent itemsets of length k
        ·Repeat until no new frequent itemsets are identified 
              ·Generate length (k+1) candidate itemsets from length k frequent itemsets
              ·Prune candidate itemsets containing subsets of length k+1 that are infrequent
              ·Count the support of each candidate by scanning the DB
·Eliminate candidates that are infrequent, leaving only those that are frequent
D為總集
1.建立頻繁-1-項集
2.for k=2 頻繁-k-項集不為空
                從頻繁-k-1-項集中產生候選-K-項集
                計算候選-k-項集的支援度計數
                去除小於支援度計數閾值的集合
                返回頻繁-k-項集
3.返回頻繁項集

        產生候選項集:
            從頻繁-k-1項集中挑選兩項,使得:
                前k-2項相同
            合併這兩項

        計算支援度計數:
            for 所有的事務 in D:
                產生這個事務的子集集合
                判斷候選項集是否屬於這個子集

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

使用FP-Growth演算法獲取頻繁項集

Apriori演算法的缺點在於,過多的重複掃描資料庫。而另一種方法可以避免這種情況。

FP-Growth演算法是一種基於FP-Tree(Frequent Pattern Tree)的演算法。
演算法使用遞迴解決多個子問題的方式來產生頻繁項集,相比apriori也更容易實現。

FP-Tree Frequent Pattern Tree | 頻繁模式樹:

    Frequent pattern tree是一種字首樹,它可以看做是所有事務的投影。

    建樹方法:insert_fp_tree(p|P,T)

        首先我們統計出所有的頻繁一項集。
        然後對所有的事務進行過濾和排序(降序)。
        把每一條事務看作是(頭|字尾)的形式,字尾可以為空。
        然後遞迴的呼叫insert_fp_tree()
            每次進行判斷:
                若當前結點的兒女中有p,那麼這個兒女的頻繁度+1
                若沒有,新建這個兒女,頻繁度設定為1
            然後遞迴地,把字尾P進行分割,然後對下一個結點進行insert_fp_tree()

Header_Table:

          Header_Table的存在是為了方便進行快速查詢。
          Header_Table有三個域:item_name,count,next

            item_name是這個item的唯一識別符號
            count是這個item的支援度
            next指向FP-Tree中的一個item的點,並且連線成串

Conditional Pattern Base | 條件模式基:

          條件模式基是由FP-Tree中所有的item的字首構成的。
          從事務資料的角度上講,就是包含item(可以不止一個元素)的所有事務集

        generate conditional pattern base:
              構造一個條件模式基,我們利用Header_Table對所有的item進行瀏覽,然後儲存字首路徑即可。

Conditional Pattern Tree | 條件模式樹:

          從條件模式基構建出的FP-Tree稱為條件模式樹。

          對條件模式基中所有item的頻繁度進行加和,然後用閾值過濾,新的由過濾後的字首路徑形成的FP-Tree就是條件模式樹了。

判定:

          如果一個item(可以不止一個)對應的條件模式樹為空或者僅有一條路徑。
          那麼:
              item∪tree即為一個頻繁項集。由apriori定理1可知,其中所有的子集都是頻繁項集。

這次就不祝OIer了。。。反正你們也用不到23333

這裡寫圖片描述