Apriori算法是一種挖掘關聯規則的頻繁項集算法,其核心思想是經過候選集生成和情節的向下封閉檢測兩個階段來挖掘頻繁項集。html
關於這個算法有一個很是有名的故事:"尿布和啤酒"。故事是這樣的:美國的婦女們常常會囑咐她們的丈夫下班後爲孩子買尿布,而丈夫在買完尿布後又要順 手買回本身愛喝的啤酒,所以啤酒和尿布在一塊兒被購買的機會不少。這個舉措使尿布和啤酒的銷量雙雙增長,並一直爲衆商家所津津樂道。算法
關聯規則應用:數據庫
1. Apriori算法應用普遍,可用於消費市場價格分析,猜想顧客的消費習慣,好比較有名的「尿布和啤酒」的故事;安全
2.網絡安全領域中的入侵檢測技術;網絡
3.可用在用於高校管理中,根據挖掘規則能夠有效地輔助學校管理部門有針對性的開展貧困助學工做;數據結構
4.也可用在移動通訊領域中,指導運營商的業務運營和輔助業務提供商的決策制定。app
關聯規則算法的主要應用是購物籃分析,是爲了從大量的訂單中發現商品潛在的關聯。其中經常使用的一個算法叫Apriori先驗算法。ide
項集:在關聯分析中,包含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