大數據挖掘: FPGrowth初識--進行商品關聯規則挖掘

来源:http://www.cnblogs.com/wgp13x/archive/2016/02/02/5176980.html
-Advertisement-
Play Games

關聯規則的目的就是在一個數據集中找出項與項之間的關係,適用於在大數量的項集中發現關聯共現的項。也被稱為購物籃分析 (Market Basket analysis),因為“購物籃分析”很貼切的表達了適用該演算法情景中的一個子集。購物網站里你買了一個商品,旁邊列出一系列買過該商品的人還買的其他商品,並且按...


@(hadoop)[Spark, MLlib, 數據挖掘, 關聯規則, 演算法]

[TOC]


〇、簡介

經典的關聯規則挖掘演算法包括Apriori演算法和FP-growth演算法。Apriori演算法多次掃描交易資料庫,每次利用候選頻繁集產生頻繁集;而FP-growth則利用樹形結構,無需產生候選頻繁集而是直接得到頻繁集,大大減少掃描交易資料庫的次數,從而提高了演算法的效率。但是apriori的演算法擴展性較好,可以用於並行計算等領域。

關聯規則的目的就是在一個數據集中找出項與項之間的關係,適用於在大數量的項集中發現關聯共現的項。也被稱為購物籃分析 (Market Basket analysis),因為“購物籃分析”很貼切的表達了適用該演算法情景中的一個子集。

購物網站里你買了一個商品,旁邊列出一系列買過該商品的人還買的其他商品,並且按置信度高低排序,一般會發現買手機的還會買充電器(買充電器的人不一定會買手機),買牙刷的還會買牙膏,這大概就是關聯規則的用處。

基礎環境:
CentOS-6.5
JDK-1.7
spark:spark-1.2.0+cdh5.3.6+379

一、Apriori演算法

支持度(Support):定義為
\[supp(X) = \frac{包含X的記錄數}{數據集記錄總數}= P(X)=\frac{occur(X)}{count(D)}\]
置信度(Confidence): 定義為
\[ conf(X=>Y) = \frac{同時包含X和Y的記錄數}{數據集中包含X的記錄數}=P(Y|X)=\frac{P(X \cap Y)}{P(X)} = \frac{occur(X \cap Y)}{occur(X)}\]
FP-growth演算法是Apriori演算法的優化。

二、MLlib實現

spark-1.2.0 版本中Mliib的FPGrowthModel並沒有generateAssociationRules(minConfidence)方法。因此要引用高版本的jar包,併在提交任務時指定才行。這是可以實現的。

Ⅰ、獲取購買歷史數據

下麵共選取了6931條購買歷史記錄,作為關聯規則挖掘的數據集。

1、產生源數據

我們可能需要使用類Mysql中的group_concat()來產生源數據。在Hive中的替代方案是concat_ws()。但若要連接的列是非string型,會報以下錯誤:Argument 2 of function CONCAT_WS must be "string or array<string>", but "array<bigint>" was found.。使用以下hiveSQL可以避免此問題:

SELECT concat_ws(',', collect_set(cast(item_id AS String))) AS items FROM ods_angel_useritem tb GROUP BY tb.user_id;

得到item1,item2,item3式數據結構。
數據結構如下所示:

731478,732986,733494
731353
732985,733487,730924
731138,731169
733850,733447
731509,730796,733487
731169,730924,731353
730900
733494,730900,731509
732991,732985,730796,731246,733850

2、構造JavaRDD

JavaRDD<List<String>> transactions = ...;

Ⅱ、過濾掉出現頻率較低的數據

Java代碼:

//設置頻率(支持率)下限
FPGrowth fpg = new FPGrowth().setMinSupport(0.03).setNumPartitions(10);
FPGrowthModel<String> model = fpg.run(transactions);

List<FPGrowth.FreqItemset<String>> list_freqItem = model.freqItemsets().toJavaRDD().collect();
System.out.println("list_freqItem .size: " + list_freqItem .size());

for (FPGrowth.FreqItemset<String> itemset : list_freqItem) {
    System.out.println("[" + itemset.javaItems() + "], " + itemset.freq());
}

結果:

[[734902]], 275
[[733480]], 1051
[[734385]], 268
[[733151]], 895
[[733850]], 878
[[733850, 733480]], 339
[[733152]], 266
[[733230]], 243
[[731246]], 500
[[731246, 733480]], 233
[[734888]], 231
[[734894]], 483
[[733487]], 467
[[740697]], 222
[[733831]], 221
[[734900]], 333
[[731353]], 220
[[731169]], 311
[[730924]], 308
[[732985]], 212
[[732994]], 208
[[730900]], 291

\[\frac{208}{6931}=0.03001>0.03\],6931是交易的訂單數量,即數據源總條數。

可見,商品732994正好高於支持率下限。

Ⅲ、過濾掉可信度過低的判斷

Java代碼:

double minConfidence = 0.3; //置信下限
List<AssociationRules.Rule<String>> list_rule = model.generateAssociationRules(minConfidence).toJavaRDD().collect();
System.out.println("list_rule.size: " + list_rule.size());
for (AssociationRules.Rule<String> rule : list_rule) {
    System.out.println(
    rule.javaAntecedent() + " => " + rule.javaConsequent() + ", " + rule.confidence());
}

結果:

[733480] => [733850], 0.3225499524262607
[731246] => [733480], 0.466
[733850] => [733480], 0.38610478359908884
  1. \(P(733850|733480)=\frac{occur(733850 \cap 733480)}{occur(733480)}=\frac{339}{1051}=0.3225499524262607\)
  2. \(P(733480|731246)=\frac{occur(733480 \cap 731246)}{occur(731246)}=\frac{233}{500}=0.466\)
  3. \(P(733480|733850)=\frac{occur(733850 \cap 733480)}{occur(733850)}=\frac{339}{878}=0.38610478359908884\)

以上表明,用戶在購買商品733480後往往還會購買商品733480,可信度為0.3225499524262607;用戶在購買商品731246後往往還會購買商品731246,可信度為0.466;用戶在購買商品733850後往往還會購買商品733480,可信度為0.38610478359908884。

三、提交任務

Ⅰ、Spark On Standalone

spark-submit --master spark://node190:7077 --class com.angel.mlib.FPGrowthTest --jars lib/hbase-client-0.98.6-cdh5.3.6.jar,lib/hbase-common-0.98.6-cdh5.3.6.jar,lib/hbase-protocol-0.98.6-cdh5.3.6.jar,lib/hbase-server-0.98.6-cdh5.3.6.jar,lib/htrace-core-2.04.jar,lib/zookeeper.jar,lib/spark-mllib_2.10-1.5.2.jar,lib/spark-core_2.10-1.5.2.jar spark-test-1.0.jar

Ⅱ、Spark On Yarn

spark-submit --master yarn-client --class com.angel.mlib.FPGrowthTest --jars lib/hbase-client-0.98.6-cdh5.3.6.jar,lib/hbase-common-0.98.6-cdh5.3.6.jar,lib/hbase-protocol-0.98.6-cdh5.3.6.jar,lib/hbase-server-0.98.6-cdh5.3.6.jar,lib/htrace-core-2.04.jar,lib/zookeeper.jar,lib/spark-mllib_2.10-1.5.2.jar,lib/spark-core_2.10-1.5.2.jar spark-test-1.0.jar

四、FPGrowth演算法在現實中的應用調優

在實際情況中,真實的業務數據處處都是雜訊。活用數據,設計有業務含義的特征體系,是構造魯棒模型的基礎!

具體的解決辦法,我們可以多演算法並用,這些將在後續的aitanjupt文章中詳述。

五、綜上所述

也就是說,“購買了該寶貝的人32%還購買了某某商品”就是使用商品關聯規則挖掘實現的;還有一些捆綁銷售,例如牙膏和牙刷一起賣,尿布和啤酒放在一起賣。

關聯規則挖掘演算法不只是能用在商品銷售,使用它我們可以挖掘出更多的關聯關係,比如我們可以挖掘出,溫度、天氣、性別等等與心情之間是否有關聯關係,這是非常有意義的。

關聯規則挖掘演算法應用場景非常龐大,遙記多年前做的手機用戶關聯分析,那時尚未用到關聯規則挖掘演算法,用的是自己編寫的類join演算法,現在看起來,關聯規則挖掘演算法是再適合不過的了。

mllib

上面是mllib下所有的演算法。
某一數據挖掘演算法可以做某種特定的分析,也可以跨界使用,還可以聯合應用,重要的是理解其思想以靈活運用。

幸福是有一顆感恩的心,健康的身體,稱心的工作,一位深愛你的人,一幫信賴的朋友!
祝大家小年快樂!


作者 @王安琪
我的頭像
http://www.cnblogs.com/wgp13x/
2016 年 02月 02日


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

-Advertisement-
Play Games
更多相關文章
  • 本文內容 創建 MySQL 用戶和組 解壓 MySQL 源代碼包 生成配置安裝文件 編譯和安裝 MySQL 配置文件 創建 MySQL 授權表 授權 啟動 MySQL 驗證安裝 設置訪問許可權 MySQL 開機自動啟動 最近做項目,出了一個事:之前我是用 Oracle 的,如果在 Windows 環境
  • CREATE OR REPLACE PACKAGE BODY BASE_INFO AS PROCEDURE insert_lapc(lapc In lapc_array) AS v_max number; v_result number; v_status number; BEGIN delete
  • a.安裝 本人下載的是windows版本的3.2.1mongo,路徑為https://fastdl.mongodb.org/win32/mongodb-win32-x86_64-2008plus-ssl-3.2.1-signed.msi 或者直接去官網也可以http://www.mongodb.or
  • Redis 持久化 Redis 提供了不同持久化範圍的選項: RDB 持久化以指定的時間間隔執行數據集的即時點(point-in-time)快照。 AOF 持久化在服務端記錄每次收到的寫操作,在伺服器啟動時會重放,以重建原始數據集。命令使用和 Redis 協議一樣的格式以追加的方式來記錄。當文件太大
  • dos中MySQL安裝服務成功--啟動服務成功--登錄MySQL成功後輸入:select version(); 如圖:
  • 之前現場反饋一個數據更新的問題,查看感覺是因為表空間滿了導致的(錯誤在之前的博客隨筆中寫過),因此遠程對伺服器進行查看。個人平常都是通過Oracle客戶端的Entreprise Manager Console進行查看的,但是發現伺服器上只安裝了Oracle服務端並且不能正常進行網頁登錄查看。 因此到
  • mysql,數據類型優先順序,不同類型比較
  • 版本是:Mongodb 3.2.1 本來是想用python做個爬蟲然後爬取一些數據放到資料庫上的,想著想著以為NoSQL會很流行,就用了Mongodb,結果,一折騰真是不容易。 遇到的第一個問題:官網上下載還有安裝什麼的就不說了。之後就遇到了Mongodb閃退的問題,沒有理,百度找資料直接做,把Mo
一周排行
    -Advertisement-
    Play Games
  • 前言 在我們開發過程中基本上不可或缺的用到一些敏感機密數據,比如SQL伺服器的連接串或者是OAuth2的Secret等,這些敏感數據在代碼中是不太安全的,我們不應該在源代碼中存儲密碼和其他的敏感數據,一種推薦的方式是通過Asp.Net Core的機密管理器。 機密管理器 在 ASP.NET Core ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 順序棧的介面程式 目錄順序棧的介面程式頭文件創建順序棧入棧出棧利用棧將10進位轉16進位數驗證 頭文件 #include <stdio.h> #include <stdbool.h> #include <stdlib.h> 創建順序棧 // 指的是順序棧中的元素的數據類型,用戶可以根據需要進行修改 ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • C總結與剖析:關鍵字篇 -- <<C語言深度解剖>> 目錄C總結與剖析:關鍵字篇 -- <<C語言深度解剖>>程式的本質:二進位文件變數1.變數:記憶體上的某個位置開闢的空間2.變數的初始化3.為什麼要有變數4.局部變數與全局變數5.變數的大小由類型決定6.任何一個變數,記憶體賦值都是從低地址開始往高地 ...
  • 如果讓你來做一個有狀態流式應用的故障恢復,你會如何來做呢? 單機和多機會遇到什麼不同的問題? Flink Checkpoint 是做什麼用的?原理是什麼? ...
  • C++ 多級繼承 多級繼承是一種面向對象編程(OOP)特性,允許一個類從多個基類繼承屬性和方法。它使代碼更易於組織和維護,並促進代碼重用。 多級繼承的語法 在 C++ 中,使用 : 符號來指定繼承關係。多級繼承的語法如下: class DerivedClass : public BaseClass1 ...
  • 前言 什麼是SpringCloud? Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的開發便利性簡化了分散式系統的開發,比如服務註冊、服務發現、網關、路由、鏈路追蹤等。Spring Cloud 並不是重覆造輪子,而是將市面上開發得比較好的模塊集成進去,進行封裝,從 ...
  • class_template 類模板和函數模板的定義和使用類似,我們已經進行了介紹。有時,有兩個或多個類,其功能是相同的,僅僅是數據類型不同。類模板用於實現類所需數據的類型參數化 template<class NameType, class AgeType> class Person { publi ...
  • 目錄system v IPC簡介共用記憶體需要用到的函數介面shmget函數--獲取對象IDshmat函數--獲得映射空間shmctl函數--釋放資源共用記憶體實現思路註意 system v IPC簡介 消息隊列、共用記憶體和信號量統稱為system v IPC(進程間通信機制),V是羅馬數字5,是UNI ...