如何在R

时间:2017-04-11 05:20:38

标签: r format sparse-matrix long-integer

编辑:我发现Matrix包可以完成我需要的一切。超快速,灵活。具体来说,相关功能是

数据< - sparseMatrix(i = Data [,1],j = Data [,2],x = Data [,3])

或只是

数据< - Matrix(data = Data,sparse = T)

一旦你在这个矩阵类中有了矩阵,一切都应该像常规矩阵一样平滑(无论如何,大多数情况下)。

=============================================== =======

我现在有一个“长格式”的数据集,这意味着它有3列:行名,列名和值。所有“缺失的”行 - 列对都等于零。

我需要想出一种有效的方法来计算所有可能的行对之间的余弦相似度(甚至只是常规点积)。完整的数据矩阵是19000 x 62000,这就是我需要使用Long格式的原因。

我提出了以下方法,但它太慢了。关于最大化效率的任何提示,或者总体上更好的方法的任何建议,都将非常感激。谢谢!

Data <- matrix(c(1,1,1,2,2,2,3,3,3,1,2,3,1,2,4,1,4,5,1,2,2,1,1,1,1,3,1), 
ncol = 3, byrow = FALSE)
Data <- data.frame(Data)

cosine.sparse <- function(data) {

a <- Sys.time()

colnames(data) <- c('V1', 'V2', 'V3')
nvars <- length(unique(data[,2]))
nrows <- length(unique(data[,1]))

sim <- matrix(nrow=nrows, ncol=nrows)

for (i in 1:nrows) {

    data.i <- data[data$V1==i,]

    length.i.sq <- sum(data.i$V3^2)

    for (j in i:nrows) {

        data.j <- data[data$V1==j,]
        length.j.sq <- sum(data.j$V3^2)

        common.vars <- intersect(data.i$V2, data.j$V2)

        row1 <- data.i[data.i$V2 %in% common.vars,3]
        row2 <- data.j[data.j$V2 %in% common.vars,3]

        cos.sim <- sum(row1*row2)/sqrt(length.i.sq*length.j.sq)

        sim[i,j] <- sim[j,i] <- cos.sim

    }

    if (i %% 500 == 0) {cat(i, " rows have been calculated.")}
}

b <- Sys.time()
time.elapsed <- b - a
print(time.elapsed)

return(sim)
}

cosine.sparse(Data2)

0 个答案:

没有答案