基於關聯規則的推薦-獲取頻繁項集
阿新 • • 發佈:2019-01-11
關聯規則:
關聯規則是形如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