2016-08-05 4 views
4

Предположим, у нас есть 3 правила:правило ассоциации в R - удаление избыточного правила (arules)

[1] {A,B,D} -> {C} 

[2] {A,B} -> {C} 

[3] Whatever it is 

Правило [2] является подмножеством правило [1] (потому что правило [1] содержит все элементы в правиле [2]), поэтому правило [1] должны быть устранены (поскольку правило [1] слишком специфично и его информация содержится в правиле [2])

Я искал через Интернет, и каждый использует этот код для удаления избыточных правил:

subset.matrix <- is.subset(rules.sorted, rules.sorted) 
subset.matrix[lower.tri(subset.matrix, diag=T)] <- NA 
redundant <- colSums(subset.matrix, na.rm=T) >= 1 
which(redundant) 
rules.pruned <- rules.sorted[!redundant] 

Я не понимаю, как работает код.

После того, как строка 2 кода, то subset.matrix станет:

 [,1] [,2] [,3] 
[1,] NA 1 0 
[2,] NA NA 0 
[3,] NA NA NA 

клеток в нижнем треугольнике заданы равной Н.А. и так как правило [2] является подмножеством правила [1], соответствующая ячейка устанавливается на 1. Итак, у меня есть 2 вопроса:

  1. Почему мы должны установить нижний треугольник как NA? Если мы это сделаем, то как мы можем проверить, является ли правило [2] подмножеством правила [3] или нет? (Ячейка была установлена ​​в качестве NA)

  2. В нашем случае, правило [1] должен быть один, чтобы быть устранены, но это код устранить правило [2] вместо правила [1]. (Поскольку первая ячейка в колонке 2 равен 1, а по линии 3 кода, суммы столбцов колонке 2> = 1, следовательно, будет рассматриваться как избыточно)

Любая помощь будет оценена! !

+0

Никто не может помочь? – BigData

ответ

7

Для того, чтобы ваш код работал, вам нужна процентная ставка (доверие или лифт), а rules.sorted необходимо сортировать с уверенностью или поднятием. Во всяком случае, код ужасно неэффективен, так как is.subset() создает матрицу размера n^2, где n - количество правил. Кроме того, is.subset для правил слияния rhs и lhs правила, что неверно. Поэтому не беспокойтесь о деталях реализации.

Более эффективный способ сделать это теперь реализован как функция is.redundant() в пакетах arules (доступно в версии 1.4-2). Это объяснение исходит из справочной страницы:

Правило является излишним, если более общие правила, с тем же или более высокой доверия существует. То есть более конкретное правило является избыточным, если оно равно , равное или даже менее прогнозирующее, чем более общее правило. Правило является более общим, если оно имеет одинаковую RHS, но один или несколько предметов удалены от LHS. Формально правило X -> Y является избыточным, если

для некоторого X 'подмножества X, conf (X' -> Y)> = conf (X -> Y).

Это эквивалентно отрицательному или нулевому улучшению, как определено Bayardo et al. (2000).В этой реализации другие меры, чем доверия, например. также может быть использовано повышение лифта.

Ознакомьтесь с примерами в ? is.redundant.

+0

Я не знал, что есть такая функция. Благодарим за полезную информацию. – BigData

+0

Что делать, если у меня есть такие правила, как A -> B и B -> A, как я могу удалить один из них? Поскольку один из них является избыточным. «is.redundant», похоже, не может этого сделать. – BigData

+0

Как вы узнаете, какой из них вы хотите удалить и какой из них сохранить? Они оба будут иметь ту же поддержку и подъем. Я думаю, вы могли бы вызвать generateItemsets() в правилах, а затем использовать duplicated(), чтобы найти правила, которые содержат точно такие же элементы. –

1

Удалите излишние правила с пакетом arules ...

Run априорной алгоритм:

rules <- apriori(transDat, parameter = list(supp = 0.01, conf = 0.5, target = "rules", maxlen = 3)) 

Удалить избыточными:

rules <- rules[!is.redundant(rules)] 

Осмотр:

arules::inspect(rules) 

Создать dataframe :

df = data.frame(
lhs = labels(lhs(rules)), 
rhs = labels(rhs(rules)), 
[email protected])