Как оценить ранг огромного, редкого csr_matrix, используя Python (и, вероятно, Scipy)? - PullRequest
0 голосов
/ 30 апреля 2020

У меня есть огромная, разреженная матрица типа scipy.sparse.csr.csr_matrix, которая мне нужна для оценки ее ранга. Я нашел это на scipy.org , которое кажется идеальным для этой работы, но оно не поддерживает csr_matrix.

from scipy.sparse import load_npz
from scipy.linalg.interpolative import estimate_rank

X = load_npz("https://drive.google.com/uc?export=download&id=1SSR6JWEqG4DXRU9qo78682D9pGJF3Wr0")
print("Rank:", estimate_rank(X, eps=100))

TypeError: недопустимый тип ввода (должен быть массив или LinearOperator)

Разреженная матрица содержит более 50 тыс. строк и почти 40 тыс. столбцов. Преобразование его в массив numpy сначала кажется бессмысленным. Что я должен сделать, чтобы это работало?


Следующее также не работает.

from scipy.sparse import load_npz, linalg
from scipy.linalg.interpolative import estimate_rank

X = load_npz("https://drive.google.com/uc?export=download&id=1SSR6JWEqG4DXRU9qo78682D9pGJF3Wr0")
print("Rank:", estimate_rank(linag.aslinearoperator(X), eps=100))

enter image description here ValueError Traceback (последний последний вызов) в () 3 4 print ( type (X)) ----> 5 print («Ранг матрицы термина документа:», оценка_ранка (aslinearoperator (X), eps = 1))

1 кадр / usr / local / lib /python3.6/dist-packages/scipy/linalg/_interpolative_backend.py в idd_findrank (eps, m, n, matvect) 659: rtype: int 660 "" "-> 661 k, ra, ier = _id. idd_findrank (eps, m, n, matvect) 662, если ier: 663, повышение _RETCODE_ERROR

ValueError: не удалось создать намерение (cache | hide) | необязательный массив-- должен иметь определенные измерения, но получил (-1216667648,)

1 Ответ

1 голос
/ 30 апреля 2020

Я использовал разреженный, но не использовал estimate_rank. Но я могу читать ошибки и документы.

In [23]: from scipy import sparse                                                                      
In [24]: from scipy.sparse import linalg                                                               
In [25]: M = sparse.random(100,100,.2, 'csr')   

In [36]: inter.estimate_rank(M,.001)                                                                   
---------------------------------------------------------------------------
...
TypeError: invalid input type (must be array or LinearOperator)

проверка опции массива:

In [37]: inter.estimate_rank(M.A,.1)                                                                   
Out[37]: 100

проверка опции линейного оператора:

In [38]: from scipy.sparse import linalg                                                               
In [39]: L = linalg.aslinearoperator(M)                                                                
In [40]: L                                                                                             
Out[40]: <100x100 MatrixLinearOperator with dtype=float64>
In [41]: inter.estimate_rank(L,.001)                                                                   
Out[41]: 99
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...