1

当我尝试使用 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

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

文件 ../Core/cholmod_sparse.c 第 92 行的 Cholmod 错误“问题太大”。

但是,当我从原始矩阵中子集另一个稀疏矩阵时,使用所有行并运行脚本,只需要 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。

我想知道为什么会这样。

4

2 回答 2

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

说取前 210000 个元素并将my_sparse_matrix其转换为另一个矩阵。结果将有 210000 行和 1 列。

你可能想要

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

用逗号。

于 2017-06-23T14:50:37.520 回答
1

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

如上所述,您的子集不正确-您错过了逗号。所以你只对前 210000 个元素进行子集化。

于 2017-06-23T14:51:18.840 回答