Как извлечь самое длинное априорное правило (правило ассоциации)

При использовании следующего примера:

library("arules")
data("Adult")
## Mine association rules.
rules <- apriori(Adult,parameter = list(supp = 0.5, conf = 0.9, target = "rules"))
> labels(rules)

Вы увидите, что следующие правила:

[5] "{sex=Male} => {capital-gain=None}"  
[20] "{race=White,sex=Male} => {capital-gain=None}"
[22] "{sex=Male,native-country=United-States} => {capital-gain=None}" 

имеют одинаковые RHS, но отличаются своими LHS. Я хотел бы получить только самые длинные правила LHS и опустить короткие. В приведенном выше примере я хотел бы опустить правило [5], так как оно включено в [20] и [22]. ({sex=Мужской} включен в [20] и [22]). Я хотел бы остаться только с самыми длинными правилами (в других примерах самые длинные могут иметь 3 или более компонентов).


person Avi    schedule 29.05.2016    source источник


Ответы (1)


Используйте is.subset, чтобы получить логическую матрицу, и используйте эту матрицу, чтобы найти неподмножества:

subsets <- is.subset(rules, proper = TRUE)
subsets[lower.tri(subsets, diag=TRUE)] <- 0 # set lower triangle to 0
notsubsets <- rowSums(subsets) == 0L
labels(rules[notsubsets])


# [1] "{capital-gain=None,hours-per-week=Full-time} => {capital-loss=None}"                      
# [2] "{capital-loss=None,hours-per-week=Full-time} => {capital-gain=None}"                      
# [3] "{race=White,sex=Male} => {capital-gain=None}"                                             
# [4] "{race=White,sex=Male,native-country=United-States} => {capital-loss=None}"                
# [5] "{race=White,sex=Male,capital-loss=None} => {native-country=United-States}"                
# [6] "{sex=Male,capital-loss=None,native-country=United-States} => {race=White}"                
# [7] "{sex=Male,capital-gain=None,native-country=United-States} => {capital-loss=None}"         
# [8] "{workclass=Private,race=White,native-country=United-States} => {capital-loss=None}"       
# [9] "{workclass=Private,race=White,capital-loss=None} => {native-country=United-States}"       
#[10] "{workclass=Private,race=White,capital-gain=None} => {capital-loss=None}"                  
#[11] "{workclass=Private,race=White,capital-loss=None} => {capital-gain=None}"                  
#[12] "{workclass=Private,capital-gain=None,native-country=United-States} => {capital-loss=None}"
#[13] "{workclass=Private,capital-loss=None,native-country=United-States} => {capital-gain=None}"
#[14] "{race=White,capital-gain=None,native-country=United-States} => {capital-loss=None}"       
#[15] "{race=White,capital-loss=None,native-country=United-States} => {capital-gain=None}"       
#[16] "{race=White,capital-gain=None,capital-loss=None} => {native-country=United-States}"

is.subset считает правую часть при оценке того, является ли это дубликатом, и это проблема с этим подходом. Как упоминалось в комментарии, в приведенном выше подходе пропущено правило {sex=Male,native-country=United-States} => {capital-gain=None}:

labels(rules[c(22, 43)])
#[1] "{sex=Male,native-country=United-States} => {capital-gain=None}"                  
#[2] "{sex=Male,capital-gain=None,native-country=United-States} => {capital-loss=None}"
is.subset(rules[22], rules[43])

Чтобы получить эти случаи, вы можете использовать <= 1L вместо == 0L, но тогда вы также получите ложное срабатывание ("{sex=Male,capital-gain=None} => {capital-loss=None}" является подмножеством {sex=Male,capital-gain=None,native-country=United-States} => {capital-loss=None}.

person Jota    schedule 29.05.2016
comment
Спасибо @Jota, но в вашем решении я не могу найти правило {sex=Male,native-country=United-States} =› {capital-gain=None}? Это правило не входит ни в какие другие правила? - person Avi; 29.05.2016
comment
Я получаю следующую ошибку: › подмножества ‹- is.subset(правила, правильные = ИСТИНА) Ошибка в is.subset(правила, правильные = ИСТИНА): неиспользуемый аргумент (правильные = ИСТИНА) - person Avi; 29.05.2016
comment
@Avi, причина, по которой пропущено упомянутое вами правило, {sex=Male,native-country=United-States} => {capital-gain=None} объясняется в редактировании. Технически это подмножество {sex=Male,capital-gain=None,native-country=United-States} => {capital-loss=None}. - person Jota; 30.05.2016
comment
Спасибо, но почему это правильно логически? Так как у них разные RHS? - person Avi; 30.05.2016
comment
@Avi У меня код работает в Windows 10 в R 3.3.0 и R 3.2.15 с arules_1.4-1. - person Jota; 30.05.2016
comment
Я думаю, что причина того, что is.subset(rules[22], rules[43]) мы получаем true, связана с тем, что он относится к LHS, а не к RHS, используя is.subset. Имейте в виду, что я отношусь только к подмножествам, у которых RHS равны. Ваш код будет работать для этого требования? - person Avi; 30.05.2016
comment
@Avi см. labels(rules[c(3,4)]), где левая сторона такая же, но правая отличается, а затем посмотрите, что is.subset(rules[3], rules[4]) равно FALSE. Кроме того, посмотрите в разделе «Подробности» ?is.subset: для правил объединение левых и правых используется [так в оригинале] для набора элементов. - person Jota; 30.05.2016