簡體   English   中英

稀疏矩陣中的有效訪問

[英]Efficient accessing in sparse matrices

我正在使用推薦系統,但是我在為稀疏矩陣的訪問時間而苦苦掙扎。

在這種情況下,我正在實現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.033s,因此要對35,000個額定值進行一次迭代,則意味着要等待19分鍾的每次迭代(SGD),而對於至少25次迭代,我們所說的是8小時。 此外,在這里我只是在談論訪問,如果我包括分解部分,則大約需要2天。

當您為稀疏矩陣建立索引時,尤其是僅要求行或列時,它不僅必須選擇值,而且還必須構造一個新的稀疏矩陣。 np.ndarray構造是在編譯后的代碼中完成的,但是大多數稀疏構造都是純Python。 nonzero()[1]構造要求將矩陣轉換為coo格式,並選擇rowcol屬性(請參閱其代碼)。

我認為您可以通過查看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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM