为什么在使用两个看起来相同的稀疏矩阵创建 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 个元素进行子集化。
当我尝试使用 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 个元素进行子集化。