2016-05-06 13 views
0

を製造するための範囲外の添字Iは、このデータを持っているarulesパッケージ - エラー:私は<code>arules</code>パッケージ</p> <p>に勧告を行うしようとしている勧告

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 

次の私は、このコード

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 
を使用

私は以下の規則を得ます:

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 

しかし、今、すべてのクライアントのために、私は3つの製品をお勧めしたい:

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) 

} 

をこのコードはエラー

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

を生成し、私はこの出来事私は、すべてのユーザーのための勧告を持っていなかったためだと思いますしかし、このコードでは、コードを続けて「提案なし」としたい。

これを行うにはどうすればよいですか?

答えて

1

私はあなたがこのようなコードをしたいと思う。

読み出しデータと鉱山のルール:

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) 

出力:

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 

作成勧告:

:3つのトランザクション(すなわち、クライアント)のための

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) 

出力

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

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

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

いくつかの注意事項:

  • 長さ1と2のIのみ鉱山ルールこれは、より効率的でかつ冗長なルールのために検索する必要はありません。
  • 私は自信を高めました。
  • パッケージrecommenderlabは、方法 "AR"を使用してこのタイプの推奨を行います。これは現在正しく動作していませんが、間もなく動作します。
+0

thks、それは動作します:) – Kardu

+0

recommenderlabがアソシエーションルールでいつ動作するかを知っていますか?なぜなら、私は、アイテムとユーザーとの間のアイテムと一緒にrecommenderlabを使用するので、アソシエーションルールを使用することができれば嬉しいです。 – Kardu

+0

@Kardu:github(https://github.com/mhahsler/recommenderlab)の開発バージョンは既に動作しています。私は来週中にCRANに新しいバージョンを入れます。 –

関連する問題