Arules 中规则的并集和交集在算术上确实有意义

问题描述

union(setA,setB)= setA + setB - intersect(setA,setB) 的简单数学是无效的

在这里遗漏了什么?

这是我的两个规则集的总结。

> setA
set of 625 rules
 
> setB
set of 622 rules 

> union(setA,setB)
set of 626 rules 

> intersect(setA,setB)
set of 174 rules 

> setdiff(setA,setB)
set of 451 rules 

> setdiff(setB,setA)
set of 448 rules 
 

导出的规则

setA

setB

R模型

setA.Rdata

setB.Rdata

解决方法

这是一个棘手的问题。

load("setA.Rdata")
load("setB.Rdata")

all.equal(itemLabels(setA),itemLabels(setB))   
[1] "Lengths (261,263) differ (string compare on first 261)"
[2] "167 string mismatches" 

您有两个规则集使用不同的商品编码(即商品的不同顺序)。如果您从不同的数据集中挖掘它们并且不注意项目编码是否相同,就会发生这种情况。

arules 期望集合以相同的方式编码而无需检查。我认为需要添加支票。

您可以通过重新编码规则集以使用相同的 itemLabels 来修复规则集:

itemLabels <- union(itemLabels(setA),itemLabels(setB))

setA_fixed <- new("rules",lhs = recode(lhs(setA),itemLabels = itemLabels),rhs = recode(rhs(setA),itemLabels = itemLabels)
  )

setB_fixed <- new("rules",lhs = recode(lhs(setB),rhs = recode(rhs(setB),itemLabels = itemLabels)
)

现在你得到了预期的结果:

length(union(setA_fixed,setB_fixed))
[1] 626
length(c(setA_fixed,setB_fixed)) - length(intersect(setA_fixed,setB_fixed))
[1] 626

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...