一、介紹
Apriori算法是一種最有影響的挖掘布爾關(guān)聯(lián)規(guī)則頻繁項(xiàng)集的算法,它用來找出數(shù)據(jù)值中頻繁出現(xiàn)的數(shù)據(jù)集合,找出這些集合的模式有助于我們做一些決策。比如在常見的超市購物數(shù)據(jù)集,或者電商的網(wǎng)購數(shù)據(jù)集中,如果我們找到了頻繁出現(xiàn)的數(shù)據(jù)集,那么對于超市,我們可以優(yōu)化產(chǎn)品的位置擺放,對于電商,我們可以優(yōu)化商品所在的倉庫位置,達(dá)到節(jié)約成本,增加經(jīng)濟(jì)效益的目的。
二、Apriori算法思想
1. 基本概念
頻繁項(xiàng)集:經(jīng)常出現(xiàn)在一塊的物品的集合
關(guān)聯(lián)規(guī)則:暗示兩種物品之間可能存在很強(qiáng)的關(guān)系
支持度(Support):一個(gè)項(xiàng)集的支持度被定義為數(shù)據(jù)集中包含該項(xiàng)集的記錄所占的比例。公式為:支持度 = (包含物品A的記錄數(shù)量) / (總的記錄數(shù)量)。
置信度(Confidence):指如果購買物品A,有較大可能購買物品B。公式為:置信度( A -> B) = (包含物品A和B的記錄數(shù)量) / (包含 A 的記錄數(shù)量)
提升度(Lift):提升度指當(dāng)銷售一個(gè)物品時(shí),另一個(gè)物品銷售率會(huì)增加多少。公式為:提升度( A -> B) = 置信度( A -> B) / (支持度 A)。
2. Apriori算法的基本思想
關(guān)聯(lián)規(guī)則挖掘的步驟分兩步:1.找所有的頻繁項(xiàng)集;2.根據(jù)頻繁項(xiàng)集生產(chǎn)強(qiáng)關(guān)聯(lián)規(guī)則。
頻繁項(xiàng)集產(chǎn)生:其目標(biāo)是發(fā)現(xiàn)滿足最小支持度閾值的所有項(xiàng)集,這些項(xiàng)集稱作頻繁項(xiàng)集(frequent itemset)。
規(guī)則的產(chǎn)生:其目標(biāo)是從上一步發(fā)現(xiàn)的頻繁項(xiàng)集中提取所有高置信度的規(guī)則,這些規(guī)則稱作強(qiáng)規(guī)則(strong rule)。
既然都知道了支持度的計(jì)算公式,那直接遍歷所有組合計(jì)算它們的支持度不就可以了嗎?是的,沒錯(cuò)。確實(shí)可以通過遍歷所有組合就能找出所有頻繁項(xiàng)集。但問題是遍歷所有組合花的時(shí)間太多,效率太低,假設(shè)有N個(gè)物品,那么一共需要計(jì)算2^N-1次。每增加一個(gè)物品,數(shù)量級是成指數(shù)增長。
通常,頻繁項(xiàng)集產(chǎn)生所需的計(jì)算開銷遠(yuǎn)大于產(chǎn)生規(guī)則所需的計(jì)算開銷。
而Apriori就是一種找出頻繁項(xiàng)集的高效算法。
Apriori定律1:如果一個(gè)集合是頻繁項(xiàng)集,則它的所有子集都是頻繁項(xiàng)集。
Apriori定律2:如果一個(gè)集合不是頻繁項(xiàng)集,則它的所有超集都不是頻繁項(xiàng)集。
Apriori算法的核心是基于兩階段頻集思想的遞推算法。該關(guān)聯(lián)規(guī)則在分類上屬于單維、單層、布爾關(guān)聯(lián)規(guī)則。
在Apriori算法中,尋找最大項(xiàng)目集(頻繁項(xiàng)集)的基本思想是:算法需要對數(shù)據(jù)集進(jìn)行多步處理。第一步,簡單統(tǒng)計(jì)所有含一個(gè)元素項(xiàng)目集出現(xiàn)的頻數(shù),并找出那些不小于最小支持度的項(xiàng)目集,即一維最大項(xiàng)目集。從第二步開始循環(huán)處理直到再?zèng)]有最大項(xiàng)目集生成。循環(huán)過程是:第k步中,根據(jù)第k-1步生成的(k-1)維最大項(xiàng)目集產(chǎn)生k維侯選項(xiàng)目集,然后對數(shù)據(jù)庫進(jìn)行搜索,得到侯選項(xiàng)目集的項(xiàng)集支持度,與最小支持度進(jìn)行比較,從而找到k維最大項(xiàng)目集。
算法舉例:https://www.cnblogs.com/pinard/p/6293298.html
3.?Apriori算法流程總結(jié)
輸入:數(shù)據(jù)集合D,支持度閾值α
輸出:最大的頻繁k項(xiàng)集
1)掃描整個(gè)數(shù)據(jù)集,得到所有出現(xiàn)過的數(shù)據(jù),作為候選頻繁1項(xiàng)集。k=1,頻繁0項(xiàng)集為空集。
2)挖掘頻繁k項(xiàng)集
a) 掃描數(shù)據(jù)計(jì)算候選頻繁k項(xiàng)集的支持度
b) 去除候選頻繁k項(xiàng)集中支持度低于閾值的數(shù)據(jù)集,得到頻繁k項(xiàng)集。如果得到的頻繁k項(xiàng)集為空,則直接返回頻繁k-1項(xiàng)集的集合作為算法結(jié)果,算法結(jié)束。如果得到的頻繁k項(xiàng)集只有一項(xiàng),則直接返回頻繁k項(xiàng)集的集合作為算法結(jié)果,算法結(jié)束。
c) 基于頻繁k項(xiàng)集,連接生成候選頻繁k+1項(xiàng)集。
3) 令k=k+1,轉(zhuǎn)入步驟2。
從算法的步驟可以看出,Aprior算法每輪迭代都要掃描數(shù)據(jù)集,因此在數(shù)據(jù)集很大,數(shù)據(jù)種類很多的時(shí)候,算法效率很低。
四、Apriori算法的優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
簡單、易理解、數(shù)據(jù)要求低
缺點(diǎn):
(1)在每一步產(chǎn)生侯選項(xiàng)目集時(shí)循環(huán)產(chǎn)生的組合過多,沒有排除不應(yīng)該參與組合的元素;
(2)每次計(jì)算項(xiàng)集的支持度時(shí),都對數(shù)據(jù)庫D中的全部記錄進(jìn)行了一遍掃描比較,如果是一個(gè)大型的數(shù)據(jù)庫的話,這種掃描比較會(huì)大大增加計(jì)算機(jī)系統(tǒng)的I/O開銷。而這種代價(jià)是隨著數(shù)據(jù)庫的記錄的增加呈現(xiàn)出幾何級數(shù)的增加。因此人們開始尋求更好性能的算法,如F-P算法。
五、Apriori算法的參數(shù)說明
from apyori import apriori
apriori(df, min_support=0.5,
? ? ? ? ? ? use_colnames=False,
? ? ? ? ? ? max_len=None)
參數(shù)說明:
df:數(shù)據(jù)集。
min_support:給定的最小支持度。
use_colnames:默認(rèn)False,則返回的物品組合用編號顯示,為True的話直接顯示物品名稱。
max_len:最大物品組合數(shù),默認(rèn)是None,不做限制。如果只需要計(jì)算兩個(gè)物品組合的話,便將這個(gè)值設(shè)置為2。
參考:
https://blog.csdn.net/u011067360/article/details/24368085
https://www.cnblogs.com/listenfwind/p/10280392.html
https://www.cnblogs.com/pinard/p/6293298.html
https://blog.csdn.net/qq_36523839/article/details/82191677