假设我们有3条规则:
[1] {A,B,D} -> {C}
[2] {A,B} -> {C}
[3] Whatever it is
规则[2]
是规则[1]
的子集(因为规则[1]
包含规则[2]
中的所有项目),因此应删除规则[1]
(因为规则[1]
过于具体,其信息包含在规则[2]
)
我在互联网上搜索,每个人都在使用这些代码来删除多余的规则:
subset.matrix <- is.subset(rules.sorted, rules.sorted)
subset.matrix[lower.tri(subset.matrix, diag=T)] <- NA
redundant <- colSums(subset.matrix, na.rm=T) >= 1
which(redundant)
rules.pruned <- rules.sorted[!redundant]
我不明白代码是如何工作的。
在代码的第2行之后,subset.matrix将变为:
[,1] [,2] [,3]
[1,] NA 1 0
[2,] NA NA 0
[3,] NA NA NA
下三角形中的单元格设置为NA,因为规则[2]
是规则[1]
的子集,所以相应的单元格设置为1.所以我有两个问题:
为什么我们必须将下三角设为NA?如果我们这样做,那么我们如何检查规则[2]
是否是规则[3]
的子集? (单元格已设置为NA)
在我们的案例中,规则[1]
应该是要删除的规则,但这些代码会删除规则[2]
而不是规则[1]
。 (因为第2列中的第一个单元格是1,并且根据代码的第3行,第2列的列总和&gt; = 1,因此将被视为冗余)
任何帮助将不胜感激!
答案 0 :(得分:9)
要使代码生效,您需要一个兴趣度量(置信度或提升量),rules.sorted
需要按置信度或提升量进行排序。无论如何,代码非常低效,因为is.subset()
创建了一个大小为n ^ 2的矩阵,其中n是规则的数量。此外,规则is.subset
合并规则的rhs和lhs,这是不正确的。所以不要过多担心实现细节。
更有效的方法现在在包arules中实现为函数is.redundant()
(在版本1.4-2中可用)。
该解释来自手册页:
如果更一般的规则具有相同或更高的规则,则规则是多余的 信心存在。也就是说,如果是更具体的规则则是多余的 与一般规则相比,只有同等甚至更低的预测性。一条规则 如果它具有相同的RHS但删除了一个或多个项目,则更为通用 来自LHS。形式上,规则X - >如果
,则Y是多余的对于某些X'子集X,conf(X' - > Y)&gt; = conf(X - > Y)。
这相当于由...定义的负或零改进 Bayardo等。 (2000年)。在此实施中的其他措施 信心,例如提升也可以使用。
查看? is.redundant
中的示例。
答案 1 :(得分:2)
使用arules包删除冗余规则...
运行apriori算法:
rules <- apriori(transDat, parameter = list(supp = 0.01, conf = 0.5, target = "rules", maxlen = 3))
删除多余:
rules <- rules[!is.redundant(rules)]
检查:
arules::inspect(rules)
创建数据框:
df = data.frame(
lhs = labels(lhs(rules)),
rhs = labels(rhs(rules)),
rules@quality)
答案 2 :(得分:0)
只需查看rstudio中is.redundant()的帮助,即可清楚地表明
假设有一个
规则1 X-> Y,置信度为cf1
rule2 X'-> Y,置信度为cf2,其中X'是X的子集
如果rule2具有比rule1高的置信度,即cf2> cf1(其中X'是X的子集),则说规则1是多余的
即,如果存在一个规则,其中lhs的子集可以更有把握地给出rhs,则先前的规则被称为冗余规则。
我们将下三角形设为na,以便规则不会成为其子集
信息不足,仅基于子集就不能说规则是冗余的,必须考虑置信度