我使用带有二进制矩阵的arules :: apriori,并且只想创建在RHS上有一个特定列的规则。这在文档中指定,但似乎不起作用。事后过滤它很容易得到这个但是我浪费了大量的计算时间来计算所有规则。
示例:
library(arules)
data = data.frame(matrix(rbinom(10000,1, 0.6), nrow=1000))
for(i in 1:ncol(data)) data[,i] = as.factor(data[,i])
dsRules = as(data, "transactions")
rules = apriori(dsRules,
parameter=list(support = 0.1, minlen = 3, maxlen = 3, target= "rules", confidence = 0.7),
appearance = list(rhs = c("X1=1")))
规则现在包含3378条规则
rules.sub = subset(rules, subset = (rhs %pin% "X1=1"))
rules.sub包含172条规则
在我的实际数据中,我从数百万的结果变为~4000,这是一个巨大的差异。
答案 0 :(得分:4)
Nsfy,有一种更简单的方法可以做到这一点。您需要添加default='lhs'
,如appearance=list(rhs='X1=1',default='lhs')
中所示。这会将rhs限制为仅X1=1
。
答案 1 :(得分:2)
原来我读错了文档。万一其他人偶然发现:
rhs的文档是字符向量,给出了可能只出现在规则/项目集的相应位置的项目标签。所以我的代码说项目X1只能出现在rhs并不是说rhs只能包含X1。
要解决此问题,请指定lhs中的所有其他元素,例如
keep = names(data)
keep = keep[-1] #remove 1st feature
keepnames = c(paste0(keep, "=1"), paste0(keep, "=0"))
rules = apriori(dsRules,
parameter=list(support = 0.1, minlen = 3, maxlen = 3, target= "rules", confidence = 0.7),
appearance = list(lhs = keepnames))