2016-05-06 22 views
0

Herstellung Ich versuche Empfehlung mit arules Paketarules Paket - Fehler: Index außerhalb der Grenzen für Empfehlungen

Ich habe machen diese Daten

Data 
     Client product N  Date 
    1  A Banana 1 01/01/2016 
    2  A Tomato 1 01/01/2016 
    3  A Tuna 1 01/01/2016 
    4  B Orange 2 01/01/2016 
    5  B Tomato 3 02/01/2016 
    6  C Kiwi 11 08/01/2016 

Next ich diesen Code verwendet

trans = as(split(Data$product, Data$Client), "transactions") 

Sales<- as(trans, "data.frame") 

rules = apriori(trans, parameter = list(support = 0.001, confidence = 0.005)) 
rules.sorted <- sort(rules, by="lift") 

# find redundant rules 
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] 
inspect(rules.pruned) 
rules = rules.pruned 

Ich bekomme folgende Regeln:

lhs   rhs  support confidence lift 
1 {Tuna} => {Banana} 0.3333333 1.0000000 3.0 
2 {Orange} => {Tomato} 0.3333333 1.0000000 1.5 
3 {Tuna} => {Tomato} 0.3333333 1.0000000 1.5 
4 {Banana} => {Tomato} 0.3333333 1.0000000 1.5 
5 {}  => {Kiwi} 0.3333333 0.3333333 1.0 
6 {}  => {Orange} 0.3333333 0.3333333 1.0 
7 {}  => {Tuna} 0.3333333 0.3333333 1.0 
8 {}  => {Banana} 0.3333333 0.3333333 1.0 
9 {}  => {Tomato} 0.6666667 0.6666667 1.0 

aber jetzt für alle Kunden, ich möchte 3 Produkte empfehlen:

for (i in 1:3) { 

     reco=function(x){ 
       rulesMatchLHS = is.subset([email protected],x) 
       suitableRules = rulesMatchLHS & !(is.subset([email protected],x)) 
       order.rules = sort(rules[suitableRules], by = "lift") 
       LIST([email protected])[[i]] 


     } 

     NewS <- sapply(1:length(trans), function(x) reco(trans[x])) 
     NewS <- as.data.frame(NewS) 
     Sales <-cbind(Sales,NewS) 

} 

Dieser Code erzeugt den Fehler

Error in LIST([email protected])[[i]] : subscript out of bounds

Ich denke, dass das passiert, weil ich nicht für alle Benutzer Empfehlung hatte , aber ich möchte, dass der Code fortfährt und in diesem Fall "keinen Vorschlag" gibt.

Was ist der beste Weg, das zu tun?

Antwort

1

Ich denke, Sie wollen Code wie folgt.

Daten lesen und meine Regeln:

library(arules) 

Data <- structure(list(Client = structure(c(1L, 1L, 1L, 2L, 2L, 3L), .Label = c("A", "B", "C"), class = "factor"), product = structure(c(1L, 4L, 5L, 3L, 4L, 2L), .Label = c("Banana", "Kiwi", "Orange", "Tomato", "Tuna"), class = "factor"), N = c(1L, 1L, 1L, 2L, 3L, 11L), Date = structure(c(1L, 1L, 1L, 1L, 2L, 3L), .Label = c("01/01/2016", "02/01/2016", "08/01/2016"), class = "factor")), .Names = c("Client", "product", "N", "Date"), class = "data.frame", row.names = c(NA, -6L)) 

trans <- as(split(Data$product, Data$Client), "transactions") 

rules <- apriori(trans, parameter = list(support = 0.001, confidence = 0.5, maxlen = 2)) 
inspect(rules) 

Ausgang:

lhs   rhs  support confidence lift 
1 {}  => {Tomato} 0.6666667 0.6666667 1.0 
2 {Orange} => {Tomato} 0.3333333 1.0000000 1.5 
3 {Tomato} => {Orange} 0.3333333 0.5000000 1.5 
4 {Tuna} => {Banana} 0.3333333 1.0000000 3.0 
5 {Banana} => {Tuna} 0.3333333 1.0000000 3.0 
6 {Tuna} => {Tomato} 0.3333333 1.0000000 1.5 
7 {Tomato} => {Tuna} 0.3333333 0.5000000 1.5 
8 {Banana} => {Tomato} 0.3333333 1.0000000 1.5 
9 {Tomato} => {Banana} 0.3333333 0.5000000 1.5 

Empfehlungen erstellen:

reco <- function(rules, newTrans){ 
    rules.sorted <- sort(rules, by="lift") 
    rhs_labels <- unlist(as(rhs(rules.sorted), "list")) 

    matches <- is.subset(lhs(rules.sorted), newTrans) & 
     !(is.subset(rhs(rules.sorted), newTrans)) 
    apply(matches, MARGIN = 2, FUN = function(x) unique(rhs_labels[x])) 
} 

reco(rules, trans) 

Ausgang für die drei Transaktionen (dh Kunden):

$`{Banana,Tomato,Tuna}` 
[1] "Orange" 

$`{Orange,Tomato}` 
[1] "Tuna" "Banana" 

$`{Kiwi}` 
[1] "Tomato" 

Ein paar Anmerkungen:

  • ich nur mein Regeln der Länge 1 und 2. Das ist effizienter, und es gibt keine Notwendigkeit für redundante Regeln zu suchen.
  • Ich erhöhte das Vertrauen.
  • Paket recommenderlab wird diese Art von Empfehlungen mit der Methode "AR" tun. Dies funktioniert derzeit nicht korrekt, aber es wird bald funktionieren.
+0

thks, es funktioniert :) – Kardu

+0

Wissen Sie, wann Recommenderlab mit Association Rules arbeiten wird? Weil normalerweise verwende ich recommenderlab mit Einzelteil zum Einzelteil und Benutzer zum Benutzer und ist groß, wenn ich Vereinigungsregeln auch benutzen kann. – Kardu

+0

@Kardu: Die Entwicklungsversion auf github (https://github.com/mhahsler/recommenderlab) funktioniert bereits . Ich werde in der nächsten Woche eine neue Version auf CRAN bringen. –

Verwandte Themen