为什么在使用两个看起来相同的稀疏矩阵创建 Jaccard 相似度矩阵时会得到两种不同的性能

Why do I get two different performances when creating Jaccard similarity matrix using two sparse matrices that seem to be the same

当我尝试使用 text2vec 包中的 sim2() 创建 Jaccard 相似度矩阵时,我被一个奇怪的性能问题弄糊涂了。 我有一个稀疏矩阵 [210,000 x 500],我想为此获得上面提到的 Jaccard 相似度矩阵。 当我直接尝试在 sim2 函数中使用矩阵时,它花费了 30 多分钟,并在错误消息中达到 culminutes

这是我使用的 R 脚本:

library(text2vec)
JaccSim <- sim2(my_sparse_mx, method = "jaccard", norm = "none")  # doesn't work

这是我在 运行 执行脚本半小时后收到的错误消息:

Cholmod error 'problem too large' at file ../Core/cholmod_sparse.c, line 92.

但是,当我从原始矩阵中提取另一个稀疏矩阵时,使用所有行和 运行 脚本,只需要 3 分钟,Jaccard 相似度矩阵(它本身就是一个稀疏矩阵)是生成成功。

spmx_1 <- Matrix(my_sparse_mx[1:210000], sparse = TRUE)
JaccSim <- sim2(spmx_1, method = "jaccard", norm = "none") #works!

这一 运行 成功。这里发生了什么?我所做的就是将 sparse_matrix 子集化为另一个矩阵(使用原始矩阵的所有行)并使用第二个稀疏矩阵。

澄清一下,my_sparse_mx 有 210,000 行 (我使用以下方法创建了那么多行:

my_sparse_mx <-Matrix(0,nrow = 210000,ncol = 500,sparse = TRUE))

然后在其他过程中相应地用 1 填充它。另外,当我执行 nrows(my_sparse_mx) 时,我仍然得到 210,000.

我想知道为什么会这样。

spmx_1 <- Matrix(my_sparse_mx[1:210000], sparse = TRUE)

说取my_sparse_matrix的前210000个元素,转成另一个矩阵。结果将有 210000 行和 1 列。

你可能想要

spmx_1 <- Matrix(my_sparse_mx[1:210000, ], sparse = TRUE)

用逗号。

sim2 函数计算成对的 jaccard 相似度,这意味着您的案例的结果矩阵将为 210000*210000。这个结果矩阵的稀疏性取决于数据,在某些情况下不会成为问题。我想对于你的情况来说,它非常密集,无法由底层 Matrix 例程处理。

您上面提到的子集设置不正确 - 您漏掉了逗号。所以你只对前 210000 个元素进行子集化。