我想创建基于余弦相异的热图。
我正在使用 R 并探索了几个包,但找不到生成标准余弦相异矩阵的函数。内置dist()
函数不支持余弦距离,包内arules
也有一个dissimilarity()
函数,但它只适用于二进制数据。
有人可以推荐一个图书馆吗?或者演示了如何计算 R 中的余弦相异度?
我想创建基于余弦相异的热图。
我正在使用 R 并探索了几个包,但找不到生成标准余弦相异矩阵的函数。内置dist()
函数不支持余弦距离,包内arules
也有一个dissimilarity()
函数,但它只适用于二进制数据。
有人可以推荐一个图书馆吗?或者演示了如何计算 R 中的余弦相异度?
正如@Max 在评论 (+1) 中指出的那样,“编写自己的”比花时间在其他地方寻找它更简单。我们知道,两个向量之间的余弦相似度长度是
这很容易在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)
您可以使用cosine
lsa 包中的功能: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)
}