Apriori算法是一種挖掘關聯規則的頻繁項集算法,其核心思想是通過候選集生成和情節的向下封閉檢測兩個階段來挖掘頻繁項集。
關於這個算法有一個非常有名的故事:"尿布和啤酒"。故事是這樣的:美國的婦女們經常會囑咐她們的丈夫下班后為孩子買尿布,而丈夫在買完尿布后又要順 手買回自己愛喝的啤酒,因此啤酒和尿布在一起被購買的機會很多。這個舉措使尿布和啤酒的銷量雙雙增加,並一直為眾商家所津津樂道。
關聯規則應用:
1. Apriori算法應用廣泛,可用於消費市場價格分析,猜測顧客的消費習慣,比如較有名的“尿布和啤酒”的故事;
2.網絡安全領域中的入侵檢測技術;
3.可用在用於高校管理中,根據挖掘規則可以有效地輔助學校管理部門有針對性的開展貧困助學工作;
4.也可用在移動通信領域中,指導運營商的業務運營和輔助業務提供商的決策制定。
關聯規則算法的主要應用是購物籃分析,是為了從大量的訂單中發現商品潛在的關聯。其中常用的一個算法叫Apriori先驗算法。
項集:在關聯分析中,包含0個或多個項的集合被稱為項集(itemset)。如果一個項集包含k個項,則稱它為k-項集。例如:{啤酒,尿布,牛奶,花生} 是一個4-項集。空集是指不包含任何項的項集。
關聯規則(association rule):是形如 X → Y 的蘊含表達式,其中X和Y是不相交的項集,即:X∩Y=∅。關聯規則的強度可以用它的支持度(support)和置信度(confidence)來度量。
支持度:一個項集或者規則在所有事物中出現的頻率,確定規則可以用於給定數據集的頻繁程度。σ(X):表示項集X的支持度計數
項集X的支持度:s(X)=σ(X)/N;規則X → Y的支持度:s(X → Y) = σ(X∪Y) / N
通俗解釋:簡單地說,X==>Y的支持度就是指物品集X和物品集Y同時出現的概率。
概率描述:物品集X對物品集Y的支持度support(X==>Y)=P(X n Y)
實例說明:某天共有1000 個顧客到商場購買物品,其中有150個顧客同時購買了圓珠筆和筆記本,那么上述的關聯規則的支持度就是15%。
置信度:確定Y在包含X的事務中出現的頻繁程度。c(X → Y) = σ(X∪Y)/σ(X)
通俗解釋:簡單地說,可信度就是指在出現了物品集X 的事務T 中,物品集Y 也同時出現的概率有多大。
概率描述:物品集X對物品集Y的置信度confidence(X==>Y)=P(X|Y)
實例說明:上該關聯規則的可信度就回答了這樣一個問題:如果一個顧客購買了圓珠筆,那么他也購買筆記本的可能性有多大呢?在上述例子中,購買圓珠筆的顧客中有65%的人購買了筆記本, 所以可信度是65%。
定義:設W 中有e %的事務支持物品集B,e %稱為關聯規則A→B 的期望可信度度。
通俗解釋:期望可信度描述了在沒有任何條件影響時,物品集B 在所有事務中出現的概率有多大。
實例說明:如果某天共有1000 個顧客到商場購買物品,其中有250 個顧客購買了圓珠筆,則上述的關聯規則的期望可信度就是25 %。
概率描述:物品集A對物品集B的期望置信度為support(B)=P(B)
定義:提升度是可信度與期望可信度的比值
通俗解釋:提升度反映了“物品集A的出現”對物品集B的出現概率發生了多大的變化。
實例說明:上述的關聯規則的提升度=65%/25%=2.6
概率描述:物品集A對物品集B的期望置信度為lift(A==>B)=confidence(A==>B)/support(B)=p(B|A)/p(B)
支持度是一種重要的度量,因為支持度很低的規則可能只是偶然出現,低支持度的規則多半也是無意義的。因此,
支持度通常用來刪去那些無意義的規則;
置信度度量是通過規則進行推理具有可靠性。對於給定的規則X → Y,置信度越高,Y在包含X的事物中出現的可能性就越大。即Y在給定X下的條件概率P(Y|X)越大。
一句話關聯規則:關聯規則是展現項集(itemsets)間關聯(association)與相關性(correlation)的規則!
如何來度量一個規則是否夠好?
有兩個量,置信度(Confidence)和支持度(Support)。
支持度:就是概率(一項就是其出現的概率,多項就是其同時出現的概率)
置信度:條件概率(A出現后,B也出現的概率)
總之,可信度是對關聯規則的准確度的衡量,支持度是對關聯規則重要性的衡量。支持度說明了這條規則在所有事務中有多大的代表性,顯然支持度越大,關聯規則越重要。有些關聯規則可信度雖然很高,但支持度卻很低,說明該關聯規則實用的機會很小,因此也不重要。
在關聯規則挖掘中,滿足一定最小置信度以及支持度的集合成為頻繁集(frequent itemset),或者強關聯。關聯規則挖掘則是一個尋找頻繁集的過程。
幾個重要公式:
P(A)是包含A項的case(這里的cases即為數據庫中的transaction每筆交易記錄)百分比或概率!
使用Aprior算法挖掘頻繁項集,關聯規則或者關聯超邊(hyperedge),Aprior算法運用逐層(level-wise)方法搜索頻繁項集。
#####用法說明
apriori(data, parameter = NULL, appearance = NULL, control = NULL)
#####參數說明
Data:交易數據(transactions)類對象或任何能夠被轉化成transaction的數據結構
Parameter:APparameter類對象或命名列表。挖掘規則默認的行為是:支持度=0.1;置信度=0.8;輸出的最大規則長度;
Appearance:APappearance類對象或命名列表。
Control:APcontrol類對象或命名列表。控制挖掘算法的性能!
####細節說明
APparameter中minlen(最小規則數)默認的值是1,這意味着將會產生只有一項(item:比如,先前項/LHS)的規則:{}=>{beer}—這項規則說明,no matter what other items are involved the item in the RHS will appear with the probability given by the rule's confidence (which equals the support)。如果想要避免這些規則,可以使用參數:parameter=list(minlen=2)!
####返回值說明:返回一個rules類對象或itemsets類對象。
實例:
library(arules) #載入arules包
library(grid)
library(arulesViz) # 加載可視化包
data("SunBai") #一個小例子數據庫作為類的一個對象提供的加權關聯規則挖掘
summary(SunBai) #summary的結果和具體含義如##中所示
#探索和准備數據:
#(1)事務型數據每一行指定一個單一的實例,每條記錄包括用逗號隔開的任意數量的產品清單
# 通過inspect()函數可以看到超市的交易記錄,每次交易的商品名稱;
# 通過summary()函數可以查看該數據集的一些基本信息。
#總共有6條交易記錄transaction,8個商品item。density=0.375表示在稀疏矩陣中1的百分比。最頻繁出現的商品item,以及其出現的次數。可以計算出最大支持度。
# 每筆交易包含的商品數目,以及其對應的5個分位數和均值的統計信息。如:一條交易包含一件商品;一條包含兩件;兩條包含三件;一條包含四件;一條包含五件。其下統計信息表明:最低一次交易只含一件商品,第一分位數是2.25,意味着25%的交易包含不超過2.25個item。中位數是3表面50%的交易購買的商品不超過3件。
<注> lhs=left hand side;rhs=right hand side.
2)關聯規則—調整參數
#如果只想檢查其它變量和客戶是否幸存的關系,那么需要提前設置變量rhs=c("Survived=No", "Survived=Yes")
inspect(SunBai[1:5]) #通過inspect函數查看SunBai數據集的前5次交易記錄
itemFrequency(SunBai[,1:3]) #itemFrequency()函數可以查看商品的交易比例
itemFrequencyPlot(SunBai,support = 0.1) # support = 0.1 表示支持度至少為0.1
itemFrequencyPlot(SunBai,topN = 20) # topN = 20 表示支持度排在前20的商品
head(transactionInfo(SunBai)) 利用transactionInfo函數查看前六數據
# 訓練模型
rules=apriori(SunBai,parameter = list(support=0.2,confidence=0.5))#設置支持度0.2,置信度0.5對數據進行關聯規則處理
# rules=apriori(SunBai,parameter = list(support=0.2,confidence=0.5,minlen = 2)) #minlen = 2 表示規則中至少包含兩種商品,這可以防止僅僅是由於某種商品被頻繁購買而創建的無用規則
summary(rules)
#提高模型的性能
# 根據購物籃分析的目標,最有用的規則或許是那些具有高支持度、信度和提升度的規則。arules包中包含一個sort()函數,通過指定參數by為"support","confidence"或者"lift"對規則列表進行重新排序。 在默認的情況下,排序是降序排列,可以指定參數decreasing=FALSE反轉排序方式。
inspect(head(sort(rules, by = "lift"), 3))#lift(提升度),表示用來度量一類商品相對於它的一般購買率,此時被購買的可能性有多大 (Lift)是避免了一些不平衡數據標簽的偏差性,Lift越大,則數據質量較好;Lift越小,則數據越不平衡。在此處設置lift值為3.
library(arulesViz) # 加載可視化包
plot(rules, method = "grouped")
plot(rules, method='scatterplot') # 散點圖判斷大量規則的支持度與置信度分布情況
plot(rules,interactive=TRUE) #可以使用interactive=TRUE來實現散點圖的互動功能,可以選中一些點查看其具體的規則
還有類似“氣泡圖”的展現形式:提升度lift是圈的顏色深淺,圈的大小表示支持度support的大小。LHS的個數和分組中最重要(頻繁)項集顯示在列的標簽里。lift從左上角到右下角逐漸減少。
plot(rules, method='graph', shading = "lift", control = list(type='items')) # 關聯圖看相互關系
# measure 定義圓圈大小,shading 控制顏色深淺
通過箭頭和圓圈來表示關聯規則,利用頂點代表項集,邊表示規則中關系。圓圈越大表示支持度support越大,顏色越深表示提升度lift越大。但是如果規則較多的話會顯得很混亂,難以發現其中的規律,因此,通常只對較少的規則使用這樣的圖;
# 提取關聯規則的子集:可以通過subset()函數提取我們感興趣的規則
sub_rules<-subset(rules,items %in% "C");sub_rules
inspect(sub_rules[1:5])
插播—函數介紹:
Is.subset(x,y=NULL, proper=FALSE, sparse=FALSE,...) #is.subset和is.superset函數用於在關聯和項集矩陣對象中發現子集或父集!
Lower.tri(x,diag=FALSE) #返回一個與給定矩陣(在上三角或下三角中TRUE)相同大小的邏輯矩陣
提升度(lift)
Lift(A->B) = Confidence(A->B)/Support(B) 即A出現后,B也出現的條件概率除以B出現的概率。
為什么需要提升度呢?
比如:100條購買記錄中,有60條包含牛奶,75條包含面包,其中有40條兩者都包含。關聯規則(牛奶,面包)的支持度為0.4,看似很高,但其實這個關聯規則是一個誤導。在用戶購買了牛奶的前提下,有(40/60 = ) 0.67的概率去購買面包,而在沒有任何前提條件時,用戶反而有(75/100 = ) 0.75的概率去購買面包。也就是說,設置了購買牛奶的前提會降低用戶購買面包的概率,也就是說面包和牛奶是互斥的。
如果lift=1,說明兩個事項沒有任何關聯;如果lift<1,說明A事件的發生與B事件是相斥的。一般在數據挖掘中當提升度大於3時,我們才承認挖掘出的關聯規則是有價值的。
參考來源於:http://www.cnblogs.com/dm-cc/p/5737147.html
http://sanwen.net/a/kezpeoo.html
http://www.cdadata.com/14444