apriori算法c++_關聯分析——基于Apriori算法實現

e54dfed3fd41ae0357b22f1f06fb6bb8.png

電子商務推薦系統主要是通過統計和挖掘技術,根據用戶在網站上的行為,主動為用戶提供推薦服務,從而提高網站體驗。而根據不同的業務場景,推薦系統需要滿足不同的推薦粒度,包括搜索推薦,商品類目推薦,商品標簽推薦,店鋪推薦等等,主要還是以 商品推薦 為主。而商品推薦主要分為規則模型,協同過濾模型和基于內內容的推薦。我們今天介紹的Apriori算法就是基于 規則模型 的算法。

把啤酒放在尿布旁,有助于提升啤酒銷售量

Apriori最典型的落地就是沃爾瑪的啤酒尿布案例。通過用戶交易數據集來尋找商品之間的 關聯規則,探究物品之間的相關性,同時達到“將尿布放入購物車之后,再推薦啤酒比直接推薦啤酒獲取有更好的售賣效果”

本篇文章首先簡要介紹一下Apriori算法的基本思想,然后使用業務數據進行了簡單的演示。

一、基本概念

以下的是Apriori算法涉及的一些概念,可以通過后續的舉例來理解。

頻繁項集(frequent item sets): 經常 同時出在訂單中商品的組合。{啤酒,尿布}就是一個頻繁項集的例子。

關聯規則(associational rules): 暗示兩種物品集之間可能存在很強的關系。例如,“購買尿布的用戶,有大概率購買啤酒”,這就是一個關聯規則。

給定關聯規則X=>Y,即根據X推出Y:

支持度(Support):該項集出現的次數除以總的記錄數(交易數)。 同時包X和Y的記錄數/數據集記錄數

置信度(Confidence):項集{X,Y}同時出現的次數占項集{X}出現次數的比例。同時包含X和Y的記錄數/包含X的記錄數

提升度(Lift):度量項集{X}和項集{Y}的獨立性。

二、舉例說明

本節通過一個關聯規則推薦的例子給大家介紹一下上述名詞,假設shein售賣四類商品,歷史上共5筆訂單(見下表)

2.1 數據準備

ec6d89bd810eca05cdbd3e9c5b213dbd.png

每一行表示一條訂單信息,例如:訂單編號為sh-0001的訂單中包含Beauty、Plus Size、Dress三個品類,以下為方便敘述,使用A、B、C、D來代表上圖的4個品類。

2.2 支持度的計算

支持度是某個商品在總銷售筆數(N)中出現的概率,可以理解為物品當前流行程度。計算方式是:

支持度 = (包含物品A的記錄數量) / (總的記錄數量)

例如下表中,共5筆訂單,3筆包含Beauty,Beauty的支持度是3/5。支持度評估商品包含在訂單中的“概率”,一個訂單,有多大概率包含這個商品。

4977470b540e45dc7905c7a9bbc42d94.png

組合商品也有支持度。

共5筆訂單,2筆同時包含AB,即A&B的支持度是2/5。

全局總共4種商品,假設關聯規則只關聯2種商品,則一共需要計算$C_4^2$共6種組合商品的支持度{AB,AC,AD,BC,BD,CD}。

如果想查看那幾種商品組合出現的次數較多,可以通過計算支持度來實現

2.3 置信度的計算

置信度是指如果購買物品A,有較大可能購買物品B,本質上是條件概率的應用。計算方式是這樣:

置信度( A -> B) = (包含物品A和B的記錄數量) / (包含 A 的記錄數量)

536abbf8f96412c80a1eb0066a931128.png

從上表可以看出,商品A有3次購買,這3次中有2次購買了B,A->B的置信度是2/3。

confidence(A->B) = support(A->B)/support(A)= (2/5)/(3/5) = 2/3

分子support(A->B)是同時購買A與B的比例,分母support(A)是只購買A的比例

這里需要注意的是,$X->Y$與$Y->X$的置信度不一定相等。

B->C的置信度是confidence(B->C)=support(B->C)/support(B)=1,即買商品B時,100%會買C;

C->B的置信度是confidence(C->B)=support(C->B)/support(C)=3/5,買商品C時,只有3/5買了B。

2.4 提升度的計算

提升度表示==先購買==A對購買B的概率的提升作用,用來判斷規則是否有實際價值。

在置信度的例子里,$confidence(B->C)=1$,那是不是意味著如果用戶將商品B放入購物車,就可以向用戶推薦商品C來達到提升C銷量的目的呢?

很顯然不是。我們目的是“將尿布放入購物車之后,再推薦啤酒”“直接推薦啤酒”有更好的售賣效果。雖然購買商品B,100%會買C,但如果直接推薦C,用戶也100%會買C,所以購買B與購買C是獨立事件,用戶買不買C和用戶買不買B沒有直接關系。這里的關聯規則推薦,并沒有比直接推薦獲取更好的效果

因此提升度是描述使用規則后商品在購物車中出現的次數是否高于商品單獨出現在購物車中的頻率。如果大于1說明規則有效,小于等于1則無效。

提升度( A -> B) = 置信度( A -> B) / 支持度(B)

cfcbf1f5449db68055b43357d2af645c.png

在上表中,有3個訂單購買A,這3個訂單中有2個訂單購買了B,所以:

$confidence(A->B) =support(A->B)/support(A) = 2/3$ 即買了A有$2/3$的概率會買B

$support(B) = 3/5$ 表示直接推薦B的話,5個訂單中有3個購買了B, 即B的支持度是$3/5$,即有$3/5$的概率會直接買B。

$lift(A->B) =confidence(A->B)/support(B) = 10/9$

會發現,使用關聯規則推薦,如果當用戶將Beauty(A)品類的商品加入購物車后,再推薦Plus Size(B)品類,比直接推薦Plus Size(B)品類的效果更好。

2.5 總結

在上述關聯規則推薦的例子中,推薦的目標是想“將尿布放入購物車之后,再推薦啤酒”“直接推薦啤酒”有更好的售賣效果

  • 支持度support(A->B),是用戶同時購買A和B概率
  • 置信度confidence(A->B),是用戶購買A的同時,有多大概率購買B
  • 提升度lift(A->B),是“用戶購買A的同時,有多大概率購買B”與“直接購買B的概率”的比值
  • 提升度大于1時,說明A->B有正向效果
  • 提升度等于1時,說明A和B是獨立事件
  • 提升度小于1時,說明A->B有負向效果

三、算法實現

網上有很多封裝好的Apriori算法,大家也可以自行下載使用,代碼詳見Jupyter notebook

算法對數據分析師而言只是工具,了解基本原理且會調用代碼即可。

算法實現涉及到兩個重要的定理:

  1. 如果一個集合是頻繁項集,則它的所有子集都是頻繁項集。假設一個集合{A,B}是頻繁項集,則它的子集{A}, {B} 都是頻繁項集。
  2. 如果一個集合不是頻繁項集,則它的所有超集都不是頻繁項集。假設集合{A}不是頻繁項集,則它的任何超集如{A,B},{A,B,C}必定也不是頻繁項集。

通過以上兩個定理可以減少程序的計算次數,提高程序的速度。

Apriori實際應用

? 1.需要根據不同的粒度,如品類,skc等,結合不同的維度,如瀏覽行為,購買行為,構建符合業務場景的規則模型。

? 2.Apriori也可以用來進行個topn個性化推薦。首先可以根據一定時間范圍內訂單數據找到強關聯規則(skc)。然后在根據用戶購買的商品和規則進行關聯,預測用戶感興趣的商品,同時過濾掉用戶已經購買過的商品,對于其他商品按照置信度降序進行排序,為用戶推薦。

? 3.Apriori也可以用來進行關鍵路徑分析,研究某個功能或者某些特點的人群的在某些業務場景下的路徑。

3.1presto中準備好數據

--準備數據
select 
week(cast(substr(t1.pay_time,1,10) as date)) as week_num     --周序號
,order_id                                                    --訂單ID
,array_join(array_agg(distinct cate2),',') as cate  from dw.item_df t1
left join da.category t2
on t1.sku_cate = t2.cate4nmwhere site_tp = 'xxx'
and del_flag = 0
and substr(pay_time,1,10) = '2020-04-25'                     --修改時間事件范圍
and country = 'xxx'
and site_id <> 'xxx'
group by 1,2

3.2利用python中mlxtend模塊實現

1.首先在命令行中安裝mlxtend(可以新建一個環境防止包沖突)

pip install mlxtend

2.導入模塊。

#導入包(第一次運行的時候會比較慢)
import pandas as pd
from mlxtend.preprocessing import TransactionEncoder
from mlxtend.frequent_patterns import apriori
from mlxtend.frequent_patterns import association_rules

3.調整數據格式,調用包。

if __name__ == '__main__':#讀取數據并且調整格式data_set = pd.read_excel('shiyan.xlsx').cate.str.split(',').tolist()#進行 one-hot 編碼te = TransactionEncoder()te_ary = te.fit_transform(data_set)df = pd.DataFrame(te_ary, columns = te.columns_)#利用 Apriori 找出頻繁項集frequent_itemsets = apriori(df, min_support = 0.1, use_colnames = True)#計算關聯規則,一般只需要設置最小執行都就行rules = association_rules(frequent_itemsets, metric = 'confidence' ,min_threshold = 0.3)

4.導出excel

#導出excel
rules.to_excel(r'C:/Users/dell/Desktop/result.xlsx',encoding = 'utf-8')

b0866fb6dab80e62da82a76603eb177d.png

參數解釋:

association_rules(df, metric = ‘confidence‘, min_threshold = 0.8, support_only = False):

-df:這個不用說,就是 Apriori 計算后的頻繁項集。

-metric:可選值['support' , 'confidence' , 'lift' , 'leverage' , 'conviction']。里面比較常用的就是置信度和支持度。這個參數和下面的min_threshold參數配合使用

-min_threshold:參數類型是浮點型,根據 metric 不同可選值有不同的范圍,

  • metric = 'support' => 取值范圍 [0,1]
  • metric = 'confidence' => 取值范圍 [0,1]
  • metric = 'lift' => 取值范圍 [0, inf]

-support_only:默認是 False。僅計算有支持度的項集,若缺失支持度則用 NaNs 填充。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/372405.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/372405.shtml
英文地址,請注明出處:http://en.pswp.cn/news/372405.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

在Oracle Coherence中分發Spring Bean

本文展示了如何通過使用Oracle Coherence中的EntryProcessor和可移植對象格式&#xff08;POF&#xff09;功能來分發Spring Bean。 Coherence通過EntryProcessor API支持無鎖編程模型。 此功能通過減少網絡訪問并在條目上執行隱式的低級鎖定來提高系統性能。 此隱式低級鎖定功…

postman測試實例--斷言

讓我們來看看postman測試的一些例子。 其中大部分是作為內部postman片段。 大多數測試是為單行的JavaScript語句一樣簡單。 只要你想一個請求&#xff0c;你可以有很多的測試。注意&#xff1a;一個響應已從服務器接收后測試腳本運行。測試實例1.設置環境變量 postman.setEnvir…

python實現單例模式的幾種方式_基于Python中單例模式的幾種實現方式及優化詳解...

單例模式單例模式(Singleton Pattern)是一種常用的軟件設計模式&#xff0c;該模式的主要目的是確保某一個類只有一個實例存在。當你希望在整個系統中&#xff0c;某個類只能出現一個實例時&#xff0c;單例對象就能派上用場。比如&#xff0c;某個服務器程序的配置信息存放在一…

android-鈴聲的設置與播放

在android系統中&#xff0c;不同鈴聲存放的鈴聲路徑&#xff1a;/system/media/audio/ringtones 來電鈴聲/system/media/audio/notifications 短信通知鈴聲/system/media/audio/alarms 鬧鐘鈴聲鈴聲的設置&#xff1a;import java.io.File; import andr…

Apache Commons SCXML:有限狀態機實現

本文提到有限狀態機&#xff08;FSM&#xff09;&#xff0c;SCXML&#xff08;狀態圖可擴展標記語言&#xff09;和Apache Common的SCXML庫。 本文還提供了基本的ATM有限狀態機示例代碼。 有限狀態機&#xff1a; 您可能還記得計算機科學課程中的有限狀態機。 FSM用于設計計算…

第二十章、分離應用程序邏輯并處理事件

理解委托 委托是對方法的引用。&#xff08;之所以稱為委托&#xff0c;是因為一旦被調用&#xff0c;就將具體的處理“委托”給引用的方法&#xff09; 委托對象引用了方法&#xff0c;和將int賦值給int變量一樣&#xff0c;是將方法引用賦給委托對象。 Processor p new Proc…

pymol怎么做底物口袋表面_怎么從文獻中發掘一篇新文章?

本文來自微信公眾號&#xff1a;X-MOLNews可能你的導師也曾說過這樣的話——盯著Nature、Science級別的文章做&#xff0c;可能最終會中十分的文章&#xff1b;如果盯著十分的文章做&#xff0c;可能最終發出來也就五六分&#xff1b;但如果就為了發個文章混畢業&#xff0c;很…

如何分析線程轉儲– IBM VM

本文是我們的線程轉儲分析系列的第4部分&#xff0c;它將為您概述什么是IBM VM的JVM線程轉儲以及您將找到的不同線程和數據點。 您將看到和學習??到&#xff0c;IBM VM Thread Dump格式是不同的&#xff0c;但是提供了更多現成的故障排除數據。 在這一點上&#xff0c;您應該…

VMware vSphere克隆虛擬機

參考資料&#xff1a;http://blog.csdn.net/shen_jz2012/article/details/484167711. 首先將你所要克隆的虛擬機關掉2. 選擇你的ESXI服務器選中"配置"&#xff0c;然后選中存儲器右鍵你的存儲介質&#xff0c;比如我的是datastore1&#xff0c;選擇“瀏覽數據存儲”。…

將本地jar包倒入maven項目類庫中

有兩種方法&#xff1a;1.本地下載maven并配置環境變量&#xff0c;然后運行cmd控制臺輸入 mvn install:install-file -Dfile本地jar路徑 -DgroupId -DartifactId -Dpackagingjar -Dversion -DgeneratePomtrue. 2.直接在pom.xml中對應的依賴下面添加<scope>system&l…

Spring和JSF集成:分頁

處理大型數據集時&#xff0c;通常需要以分頁格式顯示數據。 分頁是一個有趣的問題&#xff0c;因為它傾向于跨越應用程序的所有層&#xff0c;從視圖層通過應用程序服務一直到對數據庫的原始調用。 在獲取分頁數據時&#xff0c;有一些非常好的解決方案。 如果您使用的是JPA&a…

三重積分平均值_直角坐標系下的三重積分的幾何可視化解釋圖解高等數學

12.4 直角坐標系下的三重積分三重積分假設 F(x,y,z) 為一個空間有界閉區域 D 上的函數. D 為下面立體橢球所占區域. 將空間區域分割成小長方塊. 體積記為 ΔVk, 其長寬高分別為Δxk, Δyk, Δzk , 并有下列的求和式:觀察下面動畫, 當空間不斷分割, 每個小方塊的體積 ΔVk 不斷變…

最短網絡Agri-Net

【例4-11】、最短網絡Agri-Net【問題描述】農民約翰被選為他們鎮的鎮長&#xff01;他其中一個競選承諾就是在鎮上建立起互聯網&#xff0c;并連接到所有的農場。當然&#xff0c;他需要你的幫助。約翰已經給他的農場安排了一條高速的網絡線路&#xff0c;他想把這條線路共享給…

cors-synchronous-requests-not-working-in-firefox

http://stackoverflow.com/questions/16668386/cors-synchronous-requests-not-working-in-firefox轉載于:https://www.cnblogs.com/diyunpeng/p/5829594.html

硬盤接口協議

硬盤是電腦主要的存儲媒介之一&#xff0c;由一個或者多個鋁制或者玻璃制的碟片組成。碟片外覆蓋有鐵磁性材料。硬盤有固態硬盤&#xff08;SSD 盤&#xff0c;新式硬盤&#xff09;、機械硬盤&#xff08;HDD 傳統硬盤&#xff09;、混合硬盤&#xff08;HHD 一塊基于傳統機械…

圖的表示

Python 數據結構與算法——圖&#xff08;Graph&#xff09; 1. 鄰接矩陣 vs 鄰接表&#xff08;壓縮的鄰接矩陣&#xff09; 鄰接矩陣的缺點是&#xff1a; 空間占用與結點數的平方成正比&#xff0c;可能帶來很大的浪費&#xff1b;鄰接矩陣不容易增加新的結點&#xff0c;不…

在Java Web應用程序中阻止CSRF

跨站點請求偽造攻擊&#xff08;CSRF&#xff09;在Web應用程序中非常常見&#xff0c;如果允許&#xff0c;可能會造成重大危害。 如果您從未聽說過CSRF&#xff0c;建議您查看有關它的OWASP頁面 。 幸運的是&#xff0c;阻止CSRF攻擊非常簡單&#xff0c;我將向您展示它們的工…

windows命令行無法啟動redis_windows系統安裝redis

1、下載最新redis https://github.com/MicrosoftArchive/redis/releases我選擇下載msi版本的2.雙擊下載包安裝3.設置redis環境變量&#xff0c;把redis路徑配置到系統變量path值中4啟動redis&#xff0c;cmd進入安裝好redis文件夾 輸入&#xff1a;如果redis啟動出錯Creating S…

SQL Server 篩選時間區間

一、SQL直接判斷 select * from login where pass>2013/03/25 and pass < 2017/04/24 二、DATEDIFF() 函數返回兩個日期之間的時間 --語法 DATEDIFF(datepart,startdate,enddate) --開始時間 startdate --結束時間 enddate --datepart datepart縮寫年yy, yyyy季度qq, …

OpenShift Express Web管理控制臺:入門

本周&#xff0c; 最新版本的OpenShift為已經很棒的PaaS Cloud提供商帶來了兩個非常好的功能。 首先&#xff0c;JBoss AS已從7.0升級到7.1&#xff0c;并且所有新的Express Web Management Console已作為預覽發布。 在本文中&#xff0c;我們將研究如何使用此新控制臺&#xf…