2014-10-29 67 views
1

TOPN元件這是從recommenderlab包的代碼段,該取矩陣的評分,並返回每個用戶頂部5個元素 -快速的方式來獲得每個矩陣列

reclist <- apply(ratings, MARGIN=2, FUN=function(x) 
    head(order(x, decreasing=TRUE, na.last=NA), 5)) 

對於大型矩陣(> 10K列)運行時間太長,是否有任何方法可以重新編寫它以提高效率?也許通過使用dpyr或data.table包)?編寫C++代碼是不適合我

+0

有多少行,你呢? – Arun 2014-10-29 18:04:03

+0

在我的情況下,它只是100.但是,這裏的行代表銷售的商品,可能高達1M。所以這種情況對其他人來說可能很有趣 – RInatM 2014-10-30 09:42:26

回答

2

與data.table和基礎R

# 10000 column dummy matrix 
cols <- 10000 
mat <- matrix(rnorm(100*cols), ncol=cols) 

的回答隨着data.table一個選項:

library(data.table) 
dt1 <- data.table(mat) 
# sort every column, return first 5 rows 
dt1[, lapply(.SD, sort, decreasing=T)][1:5] 
system.time(dt1[, lapply(.SD, sort, decreasing=T)][1:5]) 

結果:

user system elapsed 
2.904 0.013 2.916 

在普通的老基地,它實際上更快! (感謝您的評論阿倫)

system.time(head(apply(mat, 2, sort, decreasing=T), 5)) 

user system elapsed 
0.473 0.002 0.475 

然而,無論是比上面的代碼示例更快,根據system.time()

system.time(
apply(mat, MARGIN=2, FUN=function(x) { 
    head(order(x, decreasing=TRUE, na.last=NA), 5) 
})) 

user system elapsed 
3.063 0.031 3.094 
+0

這裏使用'data.table'的好處是什麼? – Arun 2014-10-29 18:02:14

+0

是的,好點。自從OP提到它之後我就這樣做了,但是當我比較頭腦時,直接在矩陣上運行會更快。 – arvi1000 2014-10-29 18:09:38

+1

不用擔心。 'apply + sort'似乎很棒!也許嘗試使用'partial = 5L'的'sort.int' ...雖然這個瓶頸似乎是'排序/排序'。 'data.table'的內部基數順序'forderv'(尚未導出)可能是有用的,特別是如果還有很多行! – Arun 2014-10-29 18:21:15