这里我们采用上文的数据集,利用R来做一个简单的应用示例:
TID | 项集 |
T1 | I1, I2, I5 |
T2 | I2, I4 |
T3 | I2, I3 |
T4 | I1, I2, I4 |
T5 | I1, I3 |
T6 | I2, I3 |
T7 | I1, I3 |
T8 | I1, I2, I3, I5 |
T9 | I1, I2, I3 |
由事务生成频繁项集
install.packages("arules")
install.packages("arulesViz")
# 处理事务数据集,并将其转成transactions类的一个实例:
MyList<-list(
c("I1", "I2", "I5"),
c("I2", "I4"),
c("I2", "I3"),
c("I1", "I2", "I4"),
c("I1", "I3"),
c("I2", "I3"),
c("I1", "I3"),
c("I1", "I2", "I3", "I5"),
c("I1", "I2", "I3")
)
# 命名
探索频繁项集,生成有效关联规则
1.数据应事先组织在参数data指定的transactions类对象中,也可以组织在自动转换为transactions类对象的其他对象中(如列表、矩阵、数据框)。
2.参数parameter是一个关于参数的列表,包括的主要成分有:support,指定最小支持度(min_sup,默认值为0.1);confidence,指定最小置信度(min_conf,默认值为0.8);minlen,指定关联规则所包含的最小项目数(默认值为1);maxlen,指定关联规则所包含的最大项目数(默认值为10);target,指定输出怎样的搜索结果,“rules”表示给出简单关联规则,“frequent itemsets”表示给出所有的频繁项集,“maximally frequent itemsets”表示给出最大频繁项集。
下面我们看一下不指定minlen参数的情况(即默认值为1):
MyRules<-apriori(data=MyTrans,parameter=list(support=0.22,confidence=0.6,target="rules"))
inspect(MyRules)
size(x=MyRules)
# 利用sorted函数排序:
MyRules.sorted<-sort(x=MyRules,by="lift",decreasing=TRUE)
inspect(MyRules.sorted)
可以看到有形如”{} => {I1}“的关联规则出现,因为minlen是默认值,即允许规则中只包含一个项目;例如,前面说的{} => {I1}(S=0.6666667, C=0.6666667)表示I1会以2/3的概率出现在事务中,与前项无关。
下面我们更改一下minlen参数,令minlen=2,结果如下:
可以看到,根据提升度(lift)排序结果,后面两个关联规则小于1,应当认为这些规则缺乏实用性,可以剔除。我们可以发现,Apriori算法仅依据最小支持度和最小置信度给出有效的关联规则,对无用规则还需根据lift大小手工剔除。
# 由于前文没有提及到提升度的概念,这里需要补充一下提升度的概念。
# 在给出提升度的概念之前需要补充一下前项支持度和后项支持度的概念。
# 这里为了统一起见,对于规则A => B,前项支持度S(A) = T(A) / T,后项支持度S(B) = T(B) / T;其中T(A)、T(B)和T分别表示包含项A的事务数、包含项B的事务数和总事务数。
# 该规则的提升度(lift)定义为:规则置信度与后项支持度的比值,即:
L(A => B) = C / S(B) = S / (S(A)*S(B))
实际上,后项支持度是没有模型时研究后项的先验概率。规则的提升度则反映了项目A出现对项目B(即我们要研究的目标项)出现
的影响程度。从统计学的角度来看,如果项目A对项目B没有影响,项目A独立于项目B,则支持度S = S(A)*S(B),此时规则的提升度等于1。所以,有使用价值的简单关联规则应是规则提升度大于1的规则,意味着A的出现对B的出现有促进作用。规则提升度越大越好。
筛选关联规则
通常Apriori算法给出的关联规则较多,可以根据实际情况对其进行筛选。可利用subset函数提取关联规则的子集,其基本语法为:
subset(x=关联规则类对象名, subset=条件)
式中,参数subset后是一个逻辑表达式或正则表达式。
例如,对上面的关联规则输出只有两个项目的规则:
输出提升度大于1的规则:
关联规则的可视化
首先需要加载arulesViz包
可视化频繁项集
调用plot函数,借助有向网状图可视化频繁项集,基本语法如下:
plot(x=频繁项集类对象名,method="graph",control=list(main=图形主标题))
简单解释一下:
圆圈的大小表示支持度,中间字母表示项目,通过有向箭头指向一个支持度,表示相应项目组成的一个项集。例如,图形中部的I1和I2均通过有向箭头指向中部圆圈,表示{I1,I2}的支持度为0.4444444;I1、I2和I3均通过有向箭头指向一个小圈,表示{I1,I2,I2}的支持度为0.2222222。
可视化关联规则
调用plot函数可视化关联规则,基本语法如下:
plot(x=关联规则类对象名,method=图类型名,control=控制参数)
其中:
1.参数method可取“grouped”表示类似以气泡图的形式展示关联规则,取“graph”表示以有向网状图的形式展示关联规则,取“paracoord”表示以平行图形的形式展示关联规则。
2.参数control是个列表,可指定图的主标题、图中箭头的大小等。
- 绘制grouped图
图中横坐标为规则前项,纵坐标为规则后项,圆圈表示关联规则,圆圈大小表示支持度大小;颜色深浅代表规则提升度的高低。
例如:空项可以分别推出{I1}、{I2}、{I3},其中{I2}的支持度最大,且3个规则的提升度一样。
- 绘制paracoord图:
paracoord图通过由左至右的带箭头折线表示关联股则的前项和后项,用折线的粗细表示规则支持度的大小,灰度深浅表示提升度的高低。例如:
从图中可以看出{I3} = > {I1}、{I3} = > {I2}、{I1} = > {I2}、{I1} = > {I3}的支持度是最高的。(注意这里没有画出形如{} => {I1}的关联规则)
- 绘制graph图
图中节点为关联规则的前项和后项,带方向的箭头从前项指向后项。箭头宽度的大小表示规则支持度的大小,灰度深浅表示提升度的高低。例如:
图中,{} => {I2}的支持度显然比{I4} => {I2}的支持度大,但是其提升度没有后者高。