Spark機器學習(9):FPGrowth演算法

来源:http://www.cnblogs.com/mstk/archive/2017/07/16/7190179.html
-Advertisement-
Play Games

關聯規則挖掘最典型的例子是購物籃分析,通過分析可以知道哪些商品經常被一起購買,從而可以改進商品貨架的佈局。 1. 基本概念 首先,介紹一些基本概念。 (1) 關聯規則:用於表示數據內隱含的關聯性,一般用X表示先決條件,Y表示關聯結果。 (2) 支持度(Support):所有項集中{X,Y}出現的可能 ...


關聯規則挖掘最典型的例子是購物籃分析,通過分析可以知道哪些商品經常被一起購買,從而可以改進商品貨架的佈局。

1. 基本概念

首先,介紹一些基本概念。

(1) 關聯規則:用於表示數據內隱含的關聯性,一般用X表示先決條件,Y表示關聯結果。

(2) 支持度(Support):所有項集中{X,Y}出現的可能性。

(3) 置信度(Confidence):先決條件X發生的條件下,關聯結果Y發生的概率。

2. Apriori演算法

Apriori演算法是常用的關聯規則挖掘演算法,基本思想是:

(1) 先搜索出1項集及其對應的支持度,刪除低於支持度的項集,得到頻繁1項集L1;

(2) 對L1中的項集進行連接,得到一個候選集,刪除其中低於支持度的項集,得到頻繁1項集L2;

...

迭代下去,一直到無法找到L(k+1)為止,對應的頻繁k項集集合就是最後的結果。

Apriori演算法的缺點是對於候選項集裡面的每一項都要掃描一次數據,從而需要多次掃描數據,I/O操作多,效率低。為了提高效率,提出了一些基於Apriori的演算法,比如FPGrowth演算法。

3. FPGrowth演算法

FPGrowth演算法為了減少I/O操作,提高效率,引入了一些數據結構存儲數據,主要包括項頭表、FP-Tree和節點鏈表。

3.1 項頭表

項頭表(Header Table)即找出頻繁1項集,刪除低於支持度的項集,並按照出現的次數降序排序,這是第一次掃描數據。然後從數據中刪除非頻繁1項集,並按照項頭表的順序排序,這是第二次也是最後一次掃描數據。

下麵的例子,支持度=0.4,閾值=0.4*10=4,因為D、F、G出現次數小於4次,小於閾值,所以被刪除,項頭表按照各一項集出現的次數重新排序。如ABCE=>EABC。

3.2 FP-Tree

3.2.1 FP-Tree的建立

FP-Tree(Frequent Pattern Tree)初始時只有一個根節點Null,將每一條數據里的每一項,按照排序後的順序插入FP-Tree,節點的計數為1,如果有共用的祖先,則共用祖先的節點計數+1。

首先,插入第1條數據E:

插入第2條數據ABC:

插入第3條數據EABC:

以此類推,所有數據都插入以後:

 

3.2.2 FP-Tree的挖掘過程

FP-Tree的挖掘過程如下,從長度為1的頻繁模式開始挖掘。可以分為3個步驟:

(1) 構造它的條件模式基(CPB, Conditional Pattern Base),條件模式基(CPB)就是我們要挖掘的Item的首碼路徑;

(2) 然後構造它的條件FP-Tree(Conditional FP-tree);

(3) 遞歸的在條件FP Tree上進行挖掘。

從項頭表的最下麵一項(也就是C)開始,包含C的3個CPB分別是EAB、E、AB,其計數分別為2、1、2,可以表示為CPB{<EAB:2>,<E:1>,<AB:2>}。累加每個CPB上的Item計數,低於閾值的刪除,得到條件FP Tree(Conditional FP-tree)。如CPB{<EAB:2>,<E:1>,<AB:2>},得到E:3,A:4,B:4,E的計數小於閾值4,所以刪除,得到C的條件FP Tree如下:

 

在條件FP Tree上使用如下的演算法進行挖掘:

procedure FP_growth(Tree, α){
if Tree 含單個路徑P {
    for 路徑 P 中結點的每個組合(記作β){
        產生模式β ∪ α,其支持度support = β中結點的最小支持度;
    }
}
else {
    for each a i 在 Tree 的頭部 {
        產生一個模式β = ai ∪ α,其支持度support = ai.support;
        構造β的條件模式基,然後構造β的條件FP Tree Treeβ;
        if Treeβ ≠ ∅ then
            調用FP_growth (Treeβ, β);}
    }
}

 對於上面的條件FP Tree,可知是單個路徑,可以得到以下的頻繁模式:<AC:4>、<BC:4>、<ABC:4>。

4. MLlib的FPGrowth演算法

直接上代碼:

import org.apache.log4j.{ Level, Logger }
import org.apache.spark.{ SparkConf, SparkContext }
import org.apache.spark.rdd.RDD
import org.apache.spark.mllib.fpm.{ FPGrowth, FPGrowthModel }

/**
  * Created by Administrator on 2017/7/16.
  */
object FPGrowth {

  def main(args:Array[String]) ={
    // 設置運行環境
    val conf = new SparkConf().setAppName("FPGrowth")
      .setMaster("spark://master:7077").setJars(Seq("E:\\Intellij\\Projects\\MachineLearning\\MachineLearning.jar"))
    val sc = new SparkContext(conf)
    Logger.getRootLogger.setLevel(Level.WARN)

    // 讀取樣本數據並解析
    val dataRDD = sc.textFile("hdfs://master:9000/ml/data/sample_fpgrowth.txt")
    val exampleRDD = dataRDD.map(_.split(" ")).cache()

    // 建立FPGrowth模型,最小支持度為0.4
    val minSupport = 0.4
    val numPartition = 10
    val model = new FPGrowth().
      setMinSupport(minSupport).
      setNumPartitions(numPartition).
      run(exampleRDD)

    // 輸出結果
    println(s"Number of frequent itemsets: ${model.freqItemsets.count()}")
    model.freqItemsets.collect().foreach { itemset =>
      println(itemset.items.mkString("[", ",", "]") + ":" + itemset.freq)
    }
  }

}

樣本數據:

D E
A B C
A B C E
B E
C D E
A B C
A B C E
B E
F G
D F

運行結果:

 

參考文獻:《數據挖掘概念與技術》。 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 綱要 =============================== 計劃佈局,劃分整體結構 內容區域,從整體到局部,局部中的通用部分,根據上下文應用樣式 公共頭部(public header)、尾部(public footer) 公共容器(public container/inner center ...
  • [1]概述 [2]入門實例 [3]生成器 [4]HTTP模塊 [5]中間件 [6]托管靜態資源 [7]常用中間件 [8]路由 [9]路由器實例 [10]響應方法 [11]請求方法 [12]APP方法 [13]HTTPS [14]模板引擎 [15]資料庫 [16]上傳文件 [17]開發實例 ...
  • 一,工程圖。 二,代碼。 ViewController.m ...
  • Google 更新了最新的 Support Library 版本,其中最為顯眼的功能莫過於 support-v4 大拆分,然後這個拆分現在看來並沒有那麼美好。 v4 包從 2011 年開始引入,包含 ViewPager、FragmentActivity 等我們常用的功能,目前已經達到 1.3 M,G ...
  • 原作者:現在是實踐所有已經學習到Kotlin技術,以及充分利用它提供功能的時候。如果你還有任何疑問,在本文就給你一些做出最終決定的理由。 ...
  • 打開app/src/main/AndroidManifest。 1.註冊當前活動。通過<activity android:name>標簽註冊當前活動,Android studio會自動註冊,eclipse需要手動註冊。.MainActivity其中 . 表示包名,在上面package(包)中已經註冊 ...
  • 七月中旬了,大家的實習有著落了嗎?秋招又準備的怎麼樣了呢?我依舊在準備著秋招,每當想到自己以應屆生的身份找著工作而工作卻不一定要你的時候,難免也會有點失落。互聯網行業的大佬們求賢若渴但對賢才也十分的苛刻,看到內推正如火如荼的進行著,深怕自己被這場浪潮甩在身後,所以也不得不苦心的準備著。如果你也是20... ...
  • 1.表結構 2.數據類型 3.索引 4.約束 為欄位設定not null非空約束,因為null不僅占據更多的空間,還使對比與索引變得複雜。 5.SQL語句 6.緩存 現在我們大多數時候都是通過ORM框架訪問數據,這些框架往往提供緩存功能(一級緩存或者二級緩存),開啟緩存可以減少訪問資料庫的次數,不僅 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...