轉載請標明出處http://www.cnblogs.com/haozhengfei/p/c9f211ee76528cffc4b6d741a55ac243.html
FPGrowth算法_挖掘商品之間的關聯規則
1.1FPGrowth算法可以做什么?
商品之間關聯性強度如何,由三個概念——支持度、置信度、提升度來控制和評價,以下將通過例子介紹這三個概念。
1.2FPGrowth_原理剖析
FP-Growth(頻繁模式增長)算法是韓家煒老師在2000年提出的關聯分析算法,它采取如下分治策略:將提供頻繁項集的數據庫壓縮到一棵頻繁模式樹(FP-Tree),但仍保留項集關聯信息;該算法和Apriori算法最大的不同有兩點:第一,不產生候選集,第二,只需要兩次遍歷數據庫,大大提高了效率。
(1)按以下步驟構造FP-樹
(a) 掃描事務數據庫D一次。收集頻繁項的集合F和它們的支持度。對F按支持度降序排序,結果為頻繁項表L。
(b) 創建FP-樹的根結點,以“null”標記它。對於D 中每個事務Trans,執行:選擇 Trans 中的頻繁項,並按L中的次序排序。設排序后的頻繁項表為[p | P],其中,p 是第一個元素,而P 是剩余元素的表。調用insert_tree([p | P], T)。該過程執行情況如下。如果T有子女N使得N.item-name = p.item-name,則N 的計數增加1;否則創建一個新結點N將其計數設置為1,鏈接到它的父結點T,並且通過結點鏈結構將其鏈接到具有相同item-name的結點。如果P非空,遞歸地調用insert_tree(P, N)。
(2)FP-樹的挖掘
通過調用FP_growth(FP_tree, null)實現。該過程實現如下:
FP_growth(Tree, α)
(1) if Tree 含單個路徑P then
(2) for 路徑 P 中結點的每個組合(記作β)
(3) 產生模式β ∪ α,其支持度support = β中結點的最小支持度;
(4) else for each ai在Tree的頭部(按照支持度由低到高順序進行掃描) {
(5) 產生一個模式β = ai ∪ α,其支持度support = ai .support;
(6) 構造β的條件模式基,然后構造β的條件FP-樹Treeβ;
(7) if Treeβ ≠ ∅ then
(8) 調用 FP_growth (Treeβ, β);}
end
1.1.3 FP-Growth算法演示—構造FP-樹
(1)事務數據庫建立
原始事務數據庫如下:
Tid |
Items |
1 |
I1,I2,I5 |
2 |
I2,I4 |
3 |
I2,I3 |
4 |
I1,I2,I4 |
5 |
I1,I3 |
6 |
I2,I3 |
7 |
I1,I3 |
8 |
I1,I2,I3,I5 |
9 |
I1,I2,I3 |
掃描事務數據庫得到頻繁1-項目集F。
I1 |
I2 |
I3 |
I4 |
I5 |
6 |
7 |
6 |
2 |
2 |
定義minsup=20%,即最小支持度為2,重新排列F。
I2 |
I1 |
I3 |
I4 |
I5 |
7 |
6 |
6 |
2 |
2 |
重新調整事務數據庫。
Tid |
Items |
1 |
I2, I1,I5 |
2 |
I2,I4 |
3 |
I2,I3 |
4 |
I2, I1,I4 |
5 |
I1,I3 |
6 |
I2,I3 |
7 |
I1,I3 |
8 |
I2, I1,I3,I5 |
9 |
I2, I1,I3 |
(2)創建根結點和頻繁項目表
(3)加入第一個事務(I2,I1,I5)
(4)加入第二個事務(I2,I4)
(5)加入第三個事務(I2,I3)
以此類推加入第5、6、7、8、9個事務。
(6)加入第九個事務(I2,I1,I3)
1.1.4 FP-Growth算法演示—FP-樹挖掘
FP-樹建好后,就可以進行頻繁項集的挖掘,挖掘算法稱為FpGrowth(Frequent Pattern Growth)算法,挖掘從表頭header的最后一個項開始,以此類推。本文以I5、I3為例進行挖掘。
(1)挖掘I5:
對於I5,得到條件模式基:<(I2,I1:1)>、<I2,I1,I3:1>
構造條件FP-tree:
得到I5頻繁項集:{{I2,I5:2},{I1,I5:2},{I2,I1,I5:2}}
I4、I1的挖掘與I5類似,條件FP-樹都是單路徑。
(1)挖掘I3:
I5的情況是比較簡單的,因為I5對應的條件FP-樹是單路徑的,I3稍微復雜一點。I3的條件模式基是(I2 I1:2), (I2:2), (I1:2),生成的條件FP-樹如下圖:
I3的條件FP-樹仍然是一個多路徑樹,首先把模式后綴I3和條件FP-樹中的項頭表中的每一項取並集,得到一組模式{I2 I3:4, I1 I3:4},但是這一組模式不是后綴為I3的所有模式。還需要遞歸調用FP-growth,模式后綴為{I1,I3},{I1,I3}的條件模式基為{I2:2},其生成的條件FP-樹如下圖所示。
在FP_growth中把I2和模式后綴{I1,I3}取並得到模式{I1 I2 I3:2}。
理論上還應該計算一下模式后綴為{I2,I3}的模式集,但是{I2,I3}的條件模式基為空,遞歸調用結束。最終模式后綴I3的支持度>2的所有模式為:{ I2 I3:4, I1 I3:4, I1 I2 I3:2}。
1.3FPGrowth_code


1 import org.apache.log4j.{Level, Logger} 2 import org.apache.spark.{SparkConf, SparkContext} 3 import org.apache.spark.mllib.fpm.FPGrowth 4 import org.apache.spark.rdd.RDD 5 6 /** 7 * Created by hzf 8 */ 9 object FPGrowth_new { 10 // E:\IDEA_Projects\mlib\data\FPgrowth\train\sample_fpgrowth.txt E:\IDEA_Projects\mlib\data\FPgrowth\model 0.2 10 local 11 def main(args: Array[String]) { 12 Logger.getLogger("org.apache.spark").setLevel(Level.ERROR) 13 if (args.length < 5) { 14 System.err.println("Usage: FPGrowth <inputPath> <modelPath> <support> <partitions> <master> [<AppName>]") 15 System.exit(1) 16 } 17 val appName = if (args.length > 5) args(5) else "FPGrowth" 18 val conf = new SparkConf().setAppName(appName).setMaster(args(4)) 19 val sc = new SparkContext(conf) 20 val data = sc.textFile(args(0)) 21 val transactions: RDD[Array[String]] = data.map(s => s.trim.split(' ')) 22 val fpg = new FPGrowth().setMinSupport(args(2).toDouble).setNumPartitions(args(3).toInt) 23 val model = fpg.run(transactions) 24 model.freqItemsets.collect().foreach { itemset => 25 println(itemset.items.mkString("[", ",", "]") + ", " + itemset.freq) 26 } 27 model.freqItemsets.saveAsTextFile(args(1)) 28 } 29 }
E:\IDEA_Projects\mlib\data\FPgrowth\train\sample_fpgrowth.txt E:\IDEA_Projects\mlib\data\FPgrowth\model 0.2 10 local
