R arules:生成封闭的关联。有外观限制的规则

时间:2017-08-03 17:25:13

标签: r arules

我有一组事务,其中包含来自两个类(A和B)的项目,我想要生成封闭的关联规则,其中前提只包含来自A类的项目和来自B类的结果。例如,我正在寻找形式的规则:

  • {A1} => {B2}
  • {A2,A3} => {B1}
  • {A3,A1} => {B3}

我可以很容易地独立完成其中任何一项,但是在制作具有这两种限制的规则时遇到了麻烦。

rules <- apriori(
  trans,
  parameter = list(minlen=2, maxlen=4),
  appearance = list(lhs = class_A, rhs = class_B, default='none')
)

上面的代码生成符合外观约束但未关闭的规则。我无法找到apriori的参数来生成已关闭的规则。

我可以使用以下代码生成已关闭的规则,但在传递ruleInduction外观参数方面却未成功。

closed_is <- apriori(
  trans,
  parameter = list(minlen=2, maxlen=4, target="closed frequent itemsets"),
)

closed_rules <- ruleInduction(
  closed_is,
  transactions = trans
)

我试图在生成关闭规则后使用subset来应用所需的lhs / rhs类约束,但是不成功。例如,

target_lhs_rules <- subset(closed_rules, subset = lhs %in% as.character(class_A))

给出所有规则,其中至少有一个来自A类的项目,但不仅仅是A类。

target_lhs_rules <- subset(closed_rules, subset = lhs %ain% as.character(class_A))

没有规则,因为A类中的所有项目都没有出现在任何规则中。

肯定arules包涵盖了这种情况,但我无法找到这样做的方法。任何克服这一点的帮助都将非常感激!

1 个答案:

答案 0 :(得分:0)

%ain%不是正确的运算符,因为正如您所说,它需要所有项目都在项目集中。您需要以下代码:

setGeneric("%oin%",
    function(x, table) standardGeneric("%oin%"))

setMethod("%oin%", signature(x = "itemMatrix", table = "character"),
  function(x, table) {
    pos <- match(table, itemLabels(x))
    if (any(is.na(pos)))
      stop("table contains an unknown item label" )
    size(x[, -pos]) == 0
  }
)
只要itemset 包含%oin%中指定的项目,

table就会返回true。我将把这段代码添加到arules的下一个版本中。