计算 R 中的余弦相异矩阵

机器算法验证 r 聚类 相似之处 余弦相似度 余弦距离
2022-02-10 13:10:12

我想创建基于余弦相异的热图。

我正在使用 R 并探索了几个包,但找不到生成标准余弦相异矩阵的函数。内置dist()函数不支持余弦距离,包内arules也有一个dissimilarity()函数,但它只适用于二进制数据。

有人可以推荐一个图书馆吗?或者演示了如何计算 R 中的余弦相异度?

4个回答

正如@Max 在评论 (+1) 中指出的那样,“编写自己的”比花时间在其他地方寻找它更简单。我们知道,两个向量之间的余弦相似度A,B长度n

C=i=1nAiBii=1nAi2i=1nBi2

这很容易在R. X是矩阵,其中行是我们要计算其相似性的值。然后我们可以使用以下R代码计算相似度矩阵:

cos.sim <- function(ix) 
{
    A = X[ix[1],]
    B = X[ix[2],]
    return( sum(A*B)/sqrt(sum(A^2)*sum(B^2)) )
}   
n <- nrow(X) 
cmb <- expand.grid(i=1:n, j=1:n) 
C <- matrix(apply(cmb,1,cos.sim),n,n)

然后矩阵C是余弦相似度矩阵,您可以将其传递给您喜欢的任何热图函数(我唯一熟悉的是image())。


这里的许多答案在计算上效率低下,试试这个;


对于余弦相似度矩阵

Matrix <- as.matrix(DF)
sim <- Matrix / sqrt(rowSums(Matrix * Matrix))
sim <- sim %*% t(sim)

转换为余弦相异矩阵(距离矩阵)。

D_sim <- as.dist(1 - sim)

您可以使用cosinelsa 包中的功能:http:
//cran.r-project.org/web/packages/lsa

在使用矩阵而不是一维向量时,以下函数可能很有用:

# input: row matrices 'ma' and 'mb' (with compatible dimensions)
# output: cosine similarity matrix

cos.sim=function(ma, mb){
  mat=tcrossprod(ma, mb)
  t1=sqrt(apply(ma, 1, crossprod))
  t2=sqrt(apply(mb, 1, crossprod))
  mat / outer(t1,t2)
}