R小盐准备介绍R语言机器学习与预测模型的学习笔记
你想要的R语言学习资料都在这里, 快来收藏关注【科研私家菜】
01 什么是关联分析
我们把某种事物发生时其他事物也会发生的联系叫作关联。所谓关联分析,就是指在交易数据、关系数据或其他信息载体中,挖掘对象集合间的规律或模式的过程。关联分析的典型案例就是购物篮分析。该过程通过挖掘购物篮中各商品之间的联系,分析顾客的购买习惯,以针对性地制订营销策略,如此等等。
关联分析,又叫关联挖掘,通常按挖掘目标的不同,可以分为关联规则挖掘和序列模式挖掘。关联规则挖掘比较关注单项间在同一事务内的关系,而序列模式挖掘比较关注单项间在同一事务内以及事务间的关系。下面将分别详述。
关联规则是指形如X=>Y的蕴涵式,其中,X和Y分别称为关联规则的前项(LHS)和后项(RHS)。
关联规则挖掘所发现的模式通常用关联规则或频繁项集的形式来表示。用于关联规则挖掘的数据是事务数据集,它包括事务ID和项的子集两个属性。
常用关联规则挖掘算法包括Apriori算法和Eclat算法,其中Apriori算法是-种最有影响的挖掘布尔关联规则频繁项集的算法,其核心是基于两阶段频繁项集思想的递推算法,Apriori 算法可挖掘出规则;而Eclat算法是首个采用垂直数据表示的经典关联挖掘算法,以深度优先搜索为策略,以概念格理论为基础,利用前缀等价关系划分搜索空间,Eclat 算法不能直接得出规则,只能得出频繁项集。
02 Apriori算法
该算法将发现关联规则的过程分为两个步骤。首先,通过迭代搜索出事务数据集中所有频繁项集,即支持度不低于设定阈值的项集;其次,利用频繁项集构造出满足用户最小置信度的关联规则。
在发现频繁项集的过程中,该算法首先从事务数据集中找出所有的候选1项集, 记作Cq,通过剪枝频繁1项集,记作L,然后从L通过自连接生成候选2项集C2,再进行剪枝得到频繁2项集L2,这样依次循环下去,直到不能再找到任何频繁k项集为止。所谓自连接,就是由L与L按照一定的要
求进行两两组合,生成Ck+1的过程。参与组合的两个集合,必须有一个项目不-样,其他的完全相同。而剪枝的时候,通过判断Ck+1中的每- -个组合, 其k项子集是否都在Lp中,若有不存在的,则该组合不频繁,需要剪掉,同时不满足最小支持度的组合也要剪掉。挖掘或识别出所有频繁项集是该算法的核心所在,因此,在处理过程中Apriori算法主要是为了提高数据访问效率,提升发现频繁项集的速度。
R语言中,程序包arules 主要用于挖掘关联规则和频繁项集,并提供了用于表示、操作和分析事务数据和模式的基础框架。该包中的函数apriori使用Apriori算法挖掘频繁项集、关联规则或关联超边,并采用逐层搜索的方式来发现频繁项集,该算法的实现包含了一些改进(比如使用了前缀树、项分类)。
L<-NROW(AirPassengers)
ap.chain<-AirPassengers[2:L]/AirPassengers[1:(L-1)]
plot(ap.chain,pch=20)
lines(ap.chain)
abline(h=1.0,lty=2,col='red')
ap.chain.dez<-cut(ap.chain,breaks=4,include.lowest=T)
ap.chain.lab<-cut(ap.chain,breaks=4,include.lowest=T,labels=c("A","B","C","D"))
out<-data.frame(dez=ap.chain.dez,lab=ap.chain.lab,chain=ap.chain)
head(out)
#构建数据集
winSize=10
conMatrix=t(mapply(function(i)ap.chain.lab[i:(i+winSize-1)],
1:(NROW(ap.chain)-winSize+1)))
#由于数据都是按时间先后顺序整理的,因此可用前80%提取规则,用后20%验证规则
partVal<-round(dim(conMatrix)[1]*0.8,0)
trainData<-data.frame(conMatrix[1:partVal,])
validData<-conMatrix[(partVal+1):dim(conMatrix)[1],]
#使用Apriori算法,提取关联规则
library(arules)
apriori.obj<-apriori(trainData,parameter=list(supp=0.1,conf=0.5,target="rules"),appearance=list(rhs=c("X10=A","X10=B","X10=C","X10=D"),default="lhs"))
inspect(apriori.obj)
inspect(apriori.obj[which.max(quality(apriori.obj)$lift)])
## lhs rhs support confidence lift
## 6 {X4=B,X9=A} => {X10=A} 0.1028037 0.9166667 4.264493
rulesData=as(apriori.obj,"data.frame")
rulesData[which.max(rulesData$lift),]
效果如下:
03 Eclat算法
与Apriori算法不同, Eclat 算法把数据集中的事务划归到每个项下,采用垂直数据表示,并以此为基础挖掘事务集的频繁项集。这种数据结构又叫作Tidset垂直数据集。
Eclat算法的算法流程及实现步骤与Apriori 算法类似,这里就不多说了。在R语言中arules 包
中的eclat函数实现了Eclat 算法,它的函数定义及参数说明如表3-6-8所示。
Eclat算法的算法流程及实现步骤与Apriori 算法类似,这里就不多说了。在R语言中arules 包中的eclat函数实现了Eclat 算法。
alist=list(c('A','D'),
c('A','E','F'),
c('A','B','C','E','F'),
c('B','C','D'),
c('A','C','D','E','F'),
c('A','B','D','F')
)
#将alist强制转换成transactions对象
trans1 <- as(alist, "transactions")
#加载arules包,使用eclat函数提取频繁项集,最小支持度设置为0.5
library(arules)
items=eclat(trans1,parameter=list(support = 0.5),control=list(verbose=FALSE))
#查看提取的频繁项集
inspect(items)
## items support
## 1 {A,E,F} 0.5000000
## 2 {A,E} 0.5000000
## 3 {E,F} 0.5000000
## 4 {A,D} 0.5000000
## 5 {A,F} 0.6666667
## 6 {A} 0.8333333
## 7 {F} 0.6666667
## 8 {D} 0.6666667
## 9 {E} 0.5000000
## 10 {C} 0.5000000
## 11 {B} 0.5000000
items.data<-as(items,'data.frame')
items.data<-items.data[order(items.data$support,decreasing=T),]
a=items.data$support
names(a)=items.data$items
library("RColorBrewer")
barplot(a,ylim=c(0,1),col=brewer.pal(11,"RdYlBu"))
library(arulesSequences)
data(zaki)
s0<-cspade(zaki,parameter=list(support=0.5),control=list(verbose=TRUE))
#将序列模式转换成数据框
as(s0,'data.frame')
效果如下:
关注R小盐,关注科研私家菜,有问题请联系R小盐。让我们一起来学习 R语言机器学习与临床预测模型