1. 程式人生 > >機器學習演算法(一)——關聯規則Apriori演算法及R語言實現方法

機器學習演算法(一)——關聯規則Apriori演算法及R語言實現方法

關聯規則演算法算是一種十分常用的機器學習演算法,無論是面試還是日後工作中都會經常出現,那麼本篇小博就記錄一下自己學習關聯規則經典演算法Apriori的筆記。

1、概述

Apriori演算法是用一種稱為逐層搜尋的迭代方法,從項集長度k=1開始,選出頻繁的k=1項集,根據先驗性質:頻繁項集的子集一定是頻繁的(逆否命題:非頻繁項集的超集一定是非頻繁的,通俗的說就是某件事發生的概率很低,比這件事發生條件更嚴苛的事情發生的概率會更低),篩選k=2項集中的頻繁項集,以此迭代k=3...。每迭代一次都要完整的掃描一次資料庫。

2、關聯規則三度:

支援度:佔比

置信度:條件概率

提升度:相關性

3、R語言示例程式碼如下:

(小眾語言的辛酸:選項裡沒有。。)

library(arules)
#從rattle包中讀入資料
dvdtrans <- read.csv(system.file("csv", "dvdtrans.csv",package="rattle"))
str(dvdtrans)
#將資料轉化為合適的格式
data <- as(split(dvdtrans$Item,dvdtrans$ID),"transactions")
data

#用 apriori命令生成頻繁項集,設其支援度為0.5,置信度為0.8
rules <- apriori(data, parameter=list(support=0.5,confidence=0.8,minlen = 2))

#用inspect命令檢視提取規則
inspect(rules)
常用資料形式有data.frame格式和list格式,前者即A項集為一列B項集為另一列,後者為A和B放在同一個購物籃中。

去除冗餘規則以及提取子規則程式碼如下:

redundant.rm <- function(rule,by="lift")
{
	#rule:需要進行簡化的規則
	#by:在清除的時候根據那個變數來選擇,
	#可能取值為"support","lift","confidence"
	a <- sort(rule,by=by)
	m<- is.subset(a,a,proper=TRUE)
	m[lower.tri(m, diag=TRUE)] <- NA
	r <- colSums(m, na.rm=TRUE) >= 1
	finall.rules <- a[!r]
	return(finall.rules) 
}
rules <- redundant.rm(rules)
rules.sub <- subset(rules, subset = lhs %in% "篩選項集名稱" & lift > 1)

關聯規則視覺化程式碼如下:
require(arulesViz)
plot(x = sort(finall.rule,by = "support")[1:20], method="graph", control=list(type="items"))

平時學東西不用急,你並不是用了它就好了,你得知道它是怎麼實現的?為什麼要用這個而不用另外一個?優越在哪?可不可以優化?多想,想深一點,養成這個習慣

恩,上面這句話是某面經裡面的。。。

4、演算法優化

韓家煒經典《資料探勘概念與技術》中提出了若干基於Apriori的提升效率方法:

① 基於雜湊的技術:由k=1頻繁項集生成所有k=2頻繁項集並對映計數,過濾支援度低於閾值的k=2項集,壓縮需要考慮的k=2項集

② 事物壓縮

③ 劃分:合併所有子集的頻繁項集,從中尋找全域性頻繁項集,只需要掃描兩次

④ 抽樣:犧牲精度,效率優先

⑤ 動態項集計數

5、Apriori演算法的缺點:

① 可能仍然需要產生大量候選項集

② 可能需要重複的掃描整個資料庫

相關推薦

no