【发布时间】:2025-12-25 23:30:11
【问题描述】:
我尝试使用余弦相似度来编写相似度矩阵,并且使用了嵌套循环。我知道嵌套循环在 R 中并不总是惯用的,而且这种实现需要很长时间才能执行。
我想知道如何将此代码转换为没有嵌套循环的代码。
cosine.sim <- function(data)
{
data <- t(data)
cos.sim <- matrix (data = 1, nrow = ncol(data), ncol = ncol(data))
for(i in 1:(ncol(data)-1))
{
for(j in (i+1):ncol(data))
{
A <- sqrt ( sum (data[,i] ^2) )
B <- sqrt ( sum (data[,j] ^2) )
C <- sum ( data[,i] * data[,j] )
cos.sim [i,j] <- C / (A * B)
cos.sim [j,i] <- C / (A * B)
}
}
return (cos.sim)
}
【问题讨论】:
-
R 中的循环很好,只要您预先分配所有必要的对象。您的示例不可重现。粘贴一些数据并向我们展示输出的样子。如果您用文字或伪算法描述您正在尝试实现目标的内容和方式,也会有所帮助。
-
另外,最好避免使用函数作为变量名,例如
data。 -
如果要计算相关系数,则不需要编写这样的程序,直接使用已有的即可,例如 library(Hmisc) rcorr(x, type="pearson")或检查其他类型
-
我会将 A 计算移出嵌套循环(因为它对每个 j 给出相同的结果),并且可能测试 i 和 j 是否相同以避免设置对角线两次(但不确定这一点会更快)。
-
您是否尝试过一个已经在完整矩阵中计算余弦距离的包?这是一个帖子,你可以找到关于它的讨论*.com/questions/2535234/find-cosine-similarity-in-r>。
标签: r