我有两个矩阵,它们的列数很多。通常为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
系列功能?
答案 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)
}