R中两个矩阵(数据帧)的列的余弦相似度

时间:2019-07-25 10:58:20

标签: r matrix cosine-similarity

我有两个矩阵,它们的列数很多。通常为1000 x 40000。我需要获得对应行之间的余弦相似度。以前,我使用apply(M, 2, FUN=function(v)return(cossim(m, V),其中M是矩阵,而V是向量。我无法弄清楚如何直接将向量V转换为矩阵,然后仅获得必需的(对应)列。目前,我使用的是for循环,但效率极低。这是我的代码的样子:

for (i in 1:nrow(m1)) {
    m1$CosSim[i] = cossim(as.numeric(m1[i,1:39998]),
        as.numeric(m2[i,1:39998]))
}

请问我如何正确使用apply系列功能?

1 个答案:

答案 0 :(得分:1)

尽可能避免在矩阵上使用for()循环和apply。这会减慢一切。我知道的这个规则的唯一例外是,矩阵的其中一个维度是否比另一个维度小得多,并且您的循环正好在较小的维度上进行。

以下代码在矩阵上直接计算余弦距离。它返回一个长度为nrow(xMat)的向量,其中包含第n个行向量的余弦作为第n个元素。当然nrow(xMat) = nrow(yMat) 是假定的。

cosine_dist <- function(xMat, yMat){
     numerator <- rowSums(xMat * yMat)
     denominator <- sqrt(rowSums(xMat^2))*sqrt(rowSums(yMat^2))
     return(numerator / denominator)
}