2017-08-03 58 views
0

我有一组事务包含来自两个类(A和B)的项目,并且我希望生成封闭关联规则,其中前提条件仅包含来自A类的项目以及来自B类的后续项目例如,我寻找形式的规则:R arules:生成关联关系。有外观限制的规则

  • {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级。因为在A级的所有项目

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

结果中没有规则,不会出现在任何规则中。

当然arules包涵盖了这种情况,但我一直没能找到办法。任何帮助克服这一点将不胜感激!

回答

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 
    } 
) 

%oin%返回true,只要套装包含table指定的项目。我将把这段代码添加到下一个版本的arules中。