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

时间:2017-06-23 08:36:55

标签: r sparse-matrix similarity text2vec

当我尝试使用text2vec包中的sim2()创建一个Jaccard相似度矩阵时,我对一个奇怪的性能问题感到困惑。 我有一个稀疏矩阵[210,000 x 500],我想要获得如上所述的Jaccard相似性矩阵。 当我直接尝试在sim2函数中使用矩阵时,它需要超过30分钟,并在错误消息中显示

这是我使用的R脚本:

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

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

  

Cholmod错误&#39;问题太大&#39;在文件../Core/cholmod_sparse.c,   第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。

我想知道为什么会这样。

2 个答案:

答案 0 :(得分:1)

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)

用逗号。

答案 1 :(得分:1)

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

您上面提到的子集不正确 - 您错过了逗号。所以你只需要前210000个元素。