使用R中的矩阵乘法计算逐行余弦相似度

Aveshen Pillay

在下面的示例中,我使用自定义函数和for循环计算了矩阵中数据的逐行余弦相似度。我想要的输出是一个对称矩阵。

我想使用不带for循环的矩阵乘法(线性代数)来实现此计算,因为我需要处理的实际输入矩阵要大得多,并且循环会太慢。

x = c(0, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 1)
x = matrix(x, nrow = 3, byrow = TRUE)

cosine_similarity = function(a, b){
  y = crossprod(a, b) / sqrt(crossprod(a) * crossprod(b))
  return(y)
}

N_row = dim(x)[1]

similarity_matrix = matrix(0, nrow = N_row, ncol = N_row)

for (i in 1:(N_row-1)) {
  for (j in (i + 1):N_row) {
    similarity_matrix[i,j] = cosine_similarity(x[i,], x[j,])
  }
}

similarity_matrix = similarity_matrix + t(similarity_matrix)

阿克伦

我们可以outer用来使它更快

outer(seq_len(nrow(x)), seq_len(nrow(x)), 
    FUN = Vectorize(function(i, j) cosine_similarity(x[i,], x[j, ])))

-输出

#          [,1]      [,2]      [,3]
#[1,] 1.0000000 0.5000000 0.4082483
#[2,] 0.5000000 1.0000000 0.4082483
#[3,] 0.4082483 0.4082483 1.0000000

或另一个选择是 combn

out <- diag(nrow(x)) * 0
out[upper.tri(out)] <-  combn(seq_len(nrow(x)), 2,
     FUN = function(i) c(cosine_similarity(x[i[1], ], x[i[2],])))
out <- out + t(out)
diag(out) <- 1

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

熊猫中余弦相似度的逐行计算

来自分类Dev

余弦相似度:函数无法计算矩阵

来自分类Dev

计算余弦相似度

来自分类Dev

计算余弦相似度

来自分类Dev

计算scala中的余弦相似度

来自分类Dev

通过R中的余弦相似度检索矩阵中每行的前k个相似行

来自分类Dev

使用Spark实现TextRank算法(使用Spark计算余弦相似度矩阵)

来自分类Dev

计算两个矩阵的余弦相似度

来自分类Dev

矩阵中每一行的余弦相似度

来自分类Dev

计算K均值在Julia中的余弦相似度

来自分类Dev

使用数据帧Scala Spark计算余弦相似度

来自分类Dev

Theano中的余弦相似度

来自分类Dev

使用TFIDF的余弦相似度

来自分类Dev

聚类余弦相似度矩阵

来自分类Dev

计算余弦相似度火花java

来自分类Dev

尝试在TFIDF向量上计算余弦相似度矩阵时出现内存错误

来自分类Dev

在matlab中向量化余弦相似度

来自分类Dev

在张量流中实现余弦相似度

来自分类Dev

Solr是否使用余弦相似度?

来自分类Dev

如何在Python中快速计算大量向量的余弦相似度?

来自分类Dev

如何遍历字典键以使用值计算余弦相似度?

来自分类Dev

没有嵌套循环的余弦相似度计算

来自分类Dev

合并两个 CountVectorizers 并计算余弦相似度

来自分类Dev

成对相似度/相似度矩阵计算优化

来自分类Dev

R中的矩阵乘法,无需使用%*%或crossprod

来自分类Dev

矩阵乘法(逐行)

来自分类Dev

R中矩阵的乘法

来自分类Dev

矩阵R中的乘法

来自分类Dev

使用JSON文件中的完整文章的连续对之间的余弦相似度