【问题标题】:R: Calculate cosine distance between rows of two sparse matricesR:计算两个稀疏矩阵的行之间的余弦距离
【发布时间】:2017-01-13 23:59:59
【问题描述】:

我有两个 相同 MxN 维度的稀疏矩阵 A 和 B (slam::simple_triplet_matrix),其中 M = ~100K,N = ~150K。

我希望计算每对行之间的余弦距离(即矩阵 A 的第 1 行和矩阵 B 的第 1 行,矩阵 A 的第 2 行和矩阵 B 的第 2 行等)。

我可以使用 for 循环或使用 apply 函数来执行此操作,但这太慢了,例如:

library(slam)

A <- simple_triplet_matrix(1:3, 1:3, 1:3)
B <- simple_triplet_matrix(1:3, 3:1, 1:3)

cosine <- NULL
for (i in 1:(dim(A)[1])) {
    a <- as.vector(A[i,])
    b <- as.vector(B[i, ])
    cosine[i] <- a %*% b / sqrt(a%*%a * b%*%b)
}

我了解this 之前提出的问题可能对我有帮助,但是:

a) 这并不是我真正想要的,我只想要 M 行的 M 余弦距离,而不是给定稀疏矩阵的行之间的所有成对相关性。

b) 我承认我没有完全理解这个“矢量化”解决方案背后的数学原理,所以也许一些解释会派上用场。

谢谢。

编辑:这也不是 this 问题的重复,因为我不仅对两个简单向量上的常规余弦计算感兴趣(我清楚地知道如何做到这一点,见上文),我感兴趣更大规模的情况,特别是涉及 slam 稀疏矩阵。

【问题讨论】:

  • @DmitriySelivanov 几乎没有,除了询问余弦距离之外没有任何联系,而且我不只是询问余弦距离(我清楚地知道如何实现)我对大规模情况感兴趣稀疏矩阵。

标签: r sparse-matrix cosine-similarity


【解决方案1】:

根据文档,可以使用兼容的simple_triplet_matricesrow_sumssimple_triplet_matrices 的逐个元素(数组)乘法。使用这些运算符/函数,计算是:

cosineDist <- function(A, B){
  row_sums(A * B) / sqrt(row_sums(A * A) * row_sums(B * B)) 
}

注意事项:

  1. row_sums(A * B) 计算A 中每一行的点积及其在B 中的对应行,这是cosine 中的分子项。结果是一个向量(非稀疏),其元素是 A 和 B 中每个对应行的这些点积。
  2. row_sums(A * A) 计算 A 中每一行的平方 2 范数。结果是一个向量(不是稀疏的),其元素是 A 中每一行的这些平方 2 范数。
  3. 同样,row_sums(B * B) 计算 B 中每一行的平方 2 范数。结果是一个向量(不是稀疏的),其元素是 B 中每一行的这些平方 2 范数。
  4. 其余的计算对这些向量进行操作,这些向量的元素对应于 A 和/或 B 的每一行。

【讨论】:

    【解决方案2】:
    cosineDist <- function(x){
      as.dist(1 - x%*%t(x)/(sqrt(rowSums(x^2) %*% t(rowSums(x^2))))) 
    }
    

    【讨论】:

    • 这些是稀疏矩阵,我不能只对它们操作as.matrix。这也超出了要求,仅 M 行的 M 距离。谢谢。
    猜你喜欢
    • 2016-11-29
    • 1970-01-01
    • 1970-01-01
    • 2011-07-30
    • 2015-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-21
    相关资源
    最近更新 更多