日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

apriori算法c++_关联分析——基于Apriori算法实现

發(fā)布時(shí)間:2023/12/1 c/c++ 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 apriori算法c++_关联分析——基于Apriori算法实现 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

電子商務(wù)推薦系統(tǒng)主要是通過(guò)統(tǒng)計(jì)和挖掘技術(shù),根據(jù)用戶在網(wǎng)站上的行為,主動(dòng)為用戶提供推薦服務(wù),從而提高網(wǎng)站體驗(yàn)。而根據(jù)不同的業(yè)務(wù)場(chǎng)景,推薦系統(tǒng)需要滿足不同的推薦粒度,包括搜索推薦,商品類目推薦,商品標(biāo)簽推薦,店鋪推薦等等,主要還是以 商品推薦 為主。而商品推薦主要分為規(guī)則模型,協(xié)同過(guò)濾模型和基于內(nèi)內(nèi)容的推薦。我們今天介紹的Apriori算法就是基于 規(guī)則模型 的算法。

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

Apriori最典型的落地就是沃爾瑪?shù)钠【颇虿及咐Mㄟ^(guò)用戶交易數(shù)據(jù)集來(lái)尋找商品之間的 關(guān)聯(lián)規(guī)則,探究物品之間的相關(guān)性,同時(shí)達(dá)到“將尿布放入購(gòu)物車之后,再推薦啤酒比直接推薦啤酒獲取有更好的售賣效果”。

本篇文章首先簡(jiǎn)要介紹一下Apriori算法的基本思想,然后使用業(yè)務(wù)數(shù)據(jù)進(jìn)行了簡(jiǎn)單的演示。

一、基本概念

以下的是Apriori算法涉及的一些概念,可以通過(guò)后續(xù)的舉例來(lái)理解。

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

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

給定關(guān)聯(lián)規(guī)則X=>Y,即根據(jù)X推出Y:

支持度(Support):該項(xiàng)集出現(xiàn)的次數(shù)除以總的記錄數(shù)(交易數(shù))。 同時(shí)包X和Y的記錄數(shù)/數(shù)據(jù)集記錄數(shù)

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

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

二、舉例說(shuō)明

本節(jié)通過(guò)一個(gè)關(guān)聯(lián)規(guī)則推薦的例子給大家介紹一下上述名詞,假設(shè)shein售賣四類商品,歷史上共5筆訂單(見(jiàn)下表)

2.1 數(shù)據(jù)準(zhǔn)備

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

2.2 支持度的計(jì)算

支持度是某個(gè)商品在總銷售筆數(shù)(N)中出現(xiàn)的概率,可以理解為物品當(dāng)前流行程度。計(jì)算方式是:

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

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

組合商品也有支持度。

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

全局總共4種商品,假設(shè)關(guān)聯(lián)規(guī)則只關(guān)聯(lián)2種商品,則一共需要計(jì)算$C_4^2$共6種組合商品的支持度{AB,AC,AD,BC,BD,CD}。

如果想查看那幾種商品組合出現(xiàn)的次數(shù)較多,可以通過(guò)計(jì)算支持度來(lái)實(shí)現(xiàn)。

2.3 置信度的計(jì)算

置信度是指如果購(gòu)買物品A,有較大可能購(gòu)買物品B,本質(zhì)上是條件概率的應(yīng)用。計(jì)算方式是這樣:

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

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

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

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

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

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

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

2.4 提升度的計(jì)算

提升度表示==先購(gòu)買==A對(duì)購(gòu)買B的概率的提升作用,用來(lái)判斷規(guī)則是否有實(shí)際價(jià)值。

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

很顯然不是。我們目的是“將尿布放入購(gòu)物車之后,再推薦啤酒”比“直接推薦啤酒”有更好的售賣效果。雖然購(gòu)買商品B,100%會(huì)買C,但如果直接推薦C,用戶也100%會(huì)買C,所以購(gòu)買B與購(gòu)買C是獨(dú)立事件,用戶買不買C和用戶買不買B沒(méi)有直接關(guān)系。這里的關(guān)聯(lián)規(guī)則推薦,并沒(méi)有比直接推薦獲取更好的效果。

因此提升度是描述使用規(guī)則后商品在購(gòu)物車中出現(xiàn)的次數(shù)是否高于商品單獨(dú)出現(xiàn)在購(gòu)物車中的頻率。如果大于1說(shuō)明規(guī)則有效,小于等于1則無(wú)效。

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

在上表中,有3個(gè)訂單購(gòu)買A,這3個(gè)訂單中有2個(gè)訂單購(gòu)買了B,所以:

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

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

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

會(huì)發(fā)現(xiàn),使用關(guān)聯(lián)規(guī)則推薦,如果當(dāng)用戶將Beauty(A)品類的商品加入購(gòu)物車后,再推薦Plus Size(B)品類,比直接推薦Plus Size(B)品類的效果更好。

2.5 總結(jié)

在上述關(guān)聯(lián)規(guī)則推薦的例子中,推薦的目標(biāo)是想“將尿布放入購(gòu)物車之后,再推薦啤酒”比“直接推薦啤酒”有更好的售賣效果。

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

三、算法實(shí)現(xiàn)

網(wǎng)上有很多封裝好的Apriori算法,大家也可以自行下載使用,代碼詳見(jiàn)Jupyter notebook

算法對(duì)數(shù)據(jù)分析師而言只是工具,了解基本原理且會(huì)調(diào)用代碼即可。

算法實(shí)現(xiàn)涉及到兩個(gè)重要的定理:

  • 如果一個(gè)集合是頻繁項(xiàng)集,則它的所有子集都是頻繁項(xiàng)集。假設(shè)一個(gè)集合{A,B}是頻繁項(xiàng)集,則它的子集{A}, {B} 都是頻繁項(xiàng)集。
  • 如果一個(gè)集合不是頻繁項(xiàng)集,則它的所有超集都不是頻繁項(xiàng)集。假設(shè)集合{A}不是頻繁項(xiàng)集,則它的任何超集如{A,B},{A,B,C}必定也不是頻繁項(xiàng)集。
  • 通過(guò)以上兩個(gè)定理可以減少程序的計(jì)算次數(shù),提高程序的速度。

    Apriori實(shí)際應(yīng)用

    ? 1.需要根據(jù)不同的粒度,如品類,skc等,結(jié)合不同的維度,如瀏覽行為,購(gòu)買行為,構(gòu)建符合業(yè)務(wù)場(chǎng)景的規(guī)則模型。

    ? 2.Apriori也可以用來(lái)進(jìn)行個(gè)topn個(gè)性化推薦。首先可以根據(jù)一定時(shí)間范圍內(nèi)訂單數(shù)據(jù)找到強(qiáng)關(guān)聯(lián)規(guī)則(skc)。然后在根據(jù)用戶購(gòu)買的商品和規(guī)則進(jìn)行關(guān)聯(lián),預(yù)測(cè)用戶感興趣的商品,同時(shí)過(guò)濾掉用戶已經(jīng)購(gòu)買過(guò)的商品,對(duì)于其他商品按照置信度降序進(jìn)行排序,為用戶推薦。

    ? 3.Apriori也可以用來(lái)進(jìn)行關(guān)鍵路徑分析,研究某個(gè)功能或者某些特點(diǎn)的人群的在某些業(yè)務(wù)場(chǎng)景下的路徑。

    3.1presto中準(zhǔn)備好數(shù)據(jù)

    --準(zhǔn)備數(shù)據(jù) select week(cast(substr(t1.pay_time,1,10) as date)) as week_num --周序號(hào) ,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' --修改時(shí)間事件范圍 and country = 'xxx' and site_id <> 'xxx' group by 1,2

    3.2利用python中mlxtend模塊實(shí)現(xiàn)

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

    pip install mlxtend

    2.導(dǎo)入模塊。

    #導(dǎo)入包(第一次運(yùn)行的時(shí)候會(huì)比較慢) import pandas as pd from mlxtend.preprocessing import TransactionEncoder from mlxtend.frequent_patterns import apriori from mlxtend.frequent_patterns import association_rules

    3.調(diào)整數(shù)據(jù)格式,調(diào)用包。

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

    4.導(dǎo)出excel

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

    參數(shù)解釋:

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

    -df:這個(gè)不用說(shuō),就是 Apriori 計(jì)算后的頻繁項(xiàng)集。

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

    -min_threshold:參數(shù)類型是浮點(diǎn)型,根據(jù) metric 不同可選值有不同的范圍,

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

    -support_only:默認(rèn)是 False。僅計(jì)算有支持度的項(xiàng)集,若缺失支持度則用 NaNs 填充。

    總結(jié)

    以上是生活随笔為你收集整理的apriori算法c++_关联分析——基于Apriori算法实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。