Как я могу получить частоты общих наборов предметов от вызова apriori в R? - PullRequest
4 голосов
/ 14 января 2012

Проблема:

Функция apriori пакета arules выводит правила связывания из транзакций ввода и сообщает о поддержке , достоверность и подъем каждого правила. Правила ассоциации получены из частых наборов элементов. Я хотел бы получить наиболее частые наборы элементов во входных транзакциях. В частности, я хотел бы получить все наборы элементов с заданной минимальной поддержкой. Поддержка набора элементов - это отношение количества транзакций, содержащих набор элементов, к общему количеству транзакций.

Требования:

  1. Я бы предпочел найти наиболее часто встречающиеся наборы предметов из промежуточных результатов функции apriori . То есть я бы предпочел не писать программу с нуля только для того, чтобы вычислять наиболее часто встречающиеся наборы элементов, потому что функция apriori уже вычисляет ее как промежуточный этап. Тем не менее, если действительно нет разумного способа доступа к промежуточным результатам функции apriori , я открыт для других решений.
  2. Я бы предпочел не выполнять строковые операции с результатом функции apriori , потому что этот подход будет слишком зависеть от строкового представления результата функции apriori . Опять же, если окажется, что нет лучших альтернатив, я могу прибегнуть к такому подходу.
  3. Мне известна функция itemFrequency, предоставляемая пакетом arules . К сожалению, эта функция просто сообщает наборы элементов с одним элементом. Мне интересны все наборы любой длины с минимальной поддержкой.
  4. Я бы хотел, чтобы выходные данные были отсортированы по числовой поддержке, а затем по лексикографическому набору элементов.

Пример ввода:

a,b
a,b,c

Программа:

# The following is how I'm using apriori to infer the association rules.
library(package = "arules")
transactions = read.transactions(file = file("stdin"), format = "basket", sep = ",")
rules = apriori(transactions, parameter = list(minlen=1, sup = 0.001, conf = 0.001))
WRITE(rules, file = "", sep = ",", quote = TRUE, col.names = NA)

Токовый выход:

"","rules","support","confidence","lift"
"1","{} => {c}",0.5,0.5,1
"2","{} => {b}",1,1,1
"3","{} => {a}",1,1,1
"4","{c} => {b}",0.5,1,1
"5","{b} => {c}",0.5,0.5,1
"6","{c} => {a}",0.5,1,1
"7","{a} => {c}",0.5,0.5,1
"8","{b} => {a}",1,1,1
"9","{a} => {b}",1,1,1
"10","{b,c} => {a}",0.5,1,1
"11","{a,c} => {b}",0.5,1,1
"12","{a,b} => {c}",0.5,0.5,1

Желаемый выход:

"itemset","support"
"{a}",1
"{a,b}",1
"{b}",1
"{a,b,c}",0.5
"{a,c}",0.5
"{b,c}",0.5
"{c}",0.5

1 Ответ

7 голосов
/ 15 января 2012

Я нашел функцию generatingItemsets в справочном руководстве пакета arules.

library(package = "arules")
transactions = read.transactions(file = file("stdin"), format = "basket", sep = ",")
rules = apriori(transactions, parameter = list(minlen=1, sup = 0.001, conf = 0.001))
itemsets <- unique(generatingItemsets(rules))
itemsets.df <- as(itemsets, "data.frame")
frequentItemsets <- itemsets.df[with(itemsets.df, order(-support,items)),]
names(frequentItemsets)[1] <- "itemset"
write.table(frequentItemsets, file = "", sep = ",", row.names = FALSE)
...