MLlib--FPGrowth算法


轉載請標明出處http://www.cnblogs.com/haozhengfei/p/c9f211ee76528cffc4b6d741a55ac243.html 


FPGrowth算法_挖掘商品之間的關聯規則

1.1FPGrowth算法可以做什么?

    利用FPGrowth算法挖掘商品之間的關聯規則( 關聯規則挖掘的一個典型例子是購物籃分析。關聯規則研究有助於發現交易數據庫中不同商品(項)之間的聯系,找出顧客購買行為模式,如購買了某一商品對購買其他商品的影響,分析結果可以應用於商品貨架布局、貨存安排以及根據購買模式對用戶進行分類。
 
關聯規則的相關術語:

   商品之間關聯性強度如何,由三個概念——支持度、置信度、提升度來控制和評價,以下將通過例子介紹這三個概念。

    有10000個消費者購買了商品,其中購買尿布1000個,購買啤酒2000個,購買面包500個,同時購買尿布和啤酒800個,同時購買尿布和面包100個。

 

    1.支持度,考慮的關聯規則的每個項的支持度,也就是一個商品的熱度(要選出熱門的商品,一個商品是否熱門,找出購買率非常高的商品,不可能去找一些購買熱度非常低的商品,這樣即使最后分析出來也沒有意義,比如一件商品10000個人中只有1個人買,這種商品不足以參與分析), 從量上來衡量,剔除出鏡率低的商品。
 
    2.置信度,比如在購買尿布的先決條件下,購買啤酒的概率(買了尿布的的訂單中絕大多數都買了啤酒, ),衡量所考察的關聯規則在質上的可靠性(比如啤酒和尿不濕的置信度800/1000 = 80%
 
    3.提升度,兩種商品關聯的緊密程度( 提升度表示在含有 X 的條件下同時含有Y的可能性與沒有X這個條件下項集中含有Y的可能性之比 ),拿啤酒和尿不濕來說,兩者置信度為80%,在沒有尿不濕的前提下含有啤酒的概率為(2000-800)/(10000-1000)提升度= 80%/( (2000-800)/(10000-1000))

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

train
FPGrowth_new
代碼示例
 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 }
View Code
設置運行參數
  1. E:\IDEA_Projects\mlib\data\FPgrowth\train\sample_fpgrowth.txt E:\IDEA_Projects\mlib\data\FPgrowth\model 0.2 10 local
result
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM