稀疏矩阵中的高效访问
Efficient accessing in sparse matrices
我正在使用推荐系统,但我正在为 scipy 稀疏矩阵的访问时间而苦苦挣扎。
在这种情况下,我正在实施 TrustSVD 因此我需要一个高效的结构来在列和行(CSR、CSC)中进行操作。我考虑过使用这两种结构、字典……但是无论哪种方式,这总是太慢,尤其是与 numpy 矩阵运算相比。
for u, j in zip(*ratings.nonzero()):
items_rated_by_u = ratings[u, :].nonzero()[1]
users_who_rated_j = ratings[:, j].nonzero()[0]
# More code...
额外:
每个循环大约需要 0.033 秒,因此通过 35,000 个评级迭代一次意味着每次迭代等待 19 分钟 (SGD),对于至少 25 次迭代,我们谈论的是 8 小时。而且,这里我只是说访问,如果我包括分解部分,大约需要2天。
当您索引一个稀疏矩阵时,尤其是只查询一行或一列时,它不仅要 select 值,而且还必须构造一个新的稀疏矩阵。 np.ndarray
构造是在编译代码中完成的,但大多数稀疏构造是纯粹的 Python。 nonzero()[1]
构造需要将矩阵转换为 coo
格式并选择 row
和 col
属性(查看其代码)。
我认为您可以通过查看 lil
格式或其转置的 rows
属性来更快地访问您的行列:
In [418]: sparse.lil_matrix(np.matrix('0,1,0;1,0,0;0,1,1'))
Out[418]:
<3x3 sparse matrix of type '<class 'numpy.int32'>'
with 4 stored elements in LInked List format>
In [419]: M=sparse.lil_matrix(np.matrix('0,1,0;1,0,0;0,1,1'))
In [420]: M.A
Out[420]:
array([[0, 1, 0],
[1, 0, 0],
[0, 1, 1]], dtype=int32)
In [421]: M.rows
Out[421]: array([[1], [0], [1, 2]], dtype=object)
In [422]: M[1,:].nonzero()[1]
Out[422]: array([0], dtype=int32)
In [423]: M[2,:].nonzero()[1]
Out[423]: array([1, 2], dtype=int32)
In [424]: M.T.rows
Out[424]: array([[1], [0, 2], [2]], dtype=object)
您也可以访问 csr
格式的这些值,但有点复杂
In [425]: M.tocsr().indices
Out[425]: array([1, 0, 1, 2], dtype=int32)
我正在使用推荐系统,但我正在为 scipy 稀疏矩阵的访问时间而苦苦挣扎。
在这种情况下,我正在实施 TrustSVD 因此我需要一个高效的结构来在列和行(CSR、CSC)中进行操作。我考虑过使用这两种结构、字典……但是无论哪种方式,这总是太慢,尤其是与 numpy 矩阵运算相比。
for u, j in zip(*ratings.nonzero()):
items_rated_by_u = ratings[u, :].nonzero()[1]
users_who_rated_j = ratings[:, j].nonzero()[0]
# More code...
额外: 每个循环大约需要 0.033 秒,因此通过 35,000 个评级迭代一次意味着每次迭代等待 19 分钟 (SGD),对于至少 25 次迭代,我们谈论的是 8 小时。而且,这里我只是说访问,如果我包括分解部分,大约需要2天。
当您索引一个稀疏矩阵时,尤其是只查询一行或一列时,它不仅要 select 值,而且还必须构造一个新的稀疏矩阵。 np.ndarray
构造是在编译代码中完成的,但大多数稀疏构造是纯粹的 Python。 nonzero()[1]
构造需要将矩阵转换为 coo
格式并选择 row
和 col
属性(查看其代码)。
我认为您可以通过查看 lil
格式或其转置的 rows
属性来更快地访问您的行列:
In [418]: sparse.lil_matrix(np.matrix('0,1,0;1,0,0;0,1,1'))
Out[418]:
<3x3 sparse matrix of type '<class 'numpy.int32'>'
with 4 stored elements in LInked List format>
In [419]: M=sparse.lil_matrix(np.matrix('0,1,0;1,0,0;0,1,1'))
In [420]: M.A
Out[420]:
array([[0, 1, 0],
[1, 0, 0],
[0, 1, 1]], dtype=int32)
In [421]: M.rows
Out[421]: array([[1], [0], [1, 2]], dtype=object)
In [422]: M[1,:].nonzero()[1]
Out[422]: array([0], dtype=int32)
In [423]: M[2,:].nonzero()[1]
Out[423]: array([1, 2], dtype=int32)
In [424]: M.T.rows
Out[424]: array([[1], [0, 2], [2]], dtype=object)
您也可以访问 csr
格式的这些值,但有点复杂
In [425]: M.tocsr().indices
Out[425]: array([1, 0, 1, 2], dtype=int32)