Sparse Matrix: ValueError: Matrix type must be 'f', 'd', 'F' or 'D'

I want to do SVD on a sparse matrix using scipy:

from svd import compute_svd print("The size of raw matrix: "+str(len(raw_matrix))+" * "+str(len(raw_matrix[0]))) from scipy.sparse import dok_matrix dok = dok_matrix(raw_matrix) matrix = compute_svd( dok ) 

The compute_svd function is my custom module as follows:

 def compute_svd( matrix ): from scipy.sparse import linalg from scipy import dot, mat # eg, matrix = [[2,1,0,0], [4,3,0,0]] # matrix = mat( matrix ); # print "Original matrix:" # print matrix U, s, V = linalg.svds( matrix ) print "U:" print U print "sigma:" print s print "VT:" print V dimensions = 1 rows,cols = matrix.shape #Dimension reduction, build SIGMA' for index in xrange(dimensions, rows): s[index]=0 print "reduced sigma:" print s #Reconstruct MATRIX' # from scipy import dot reconstructedMatrix= dot(dot(U,linalg.diagsvd(s,len(matrix),len(V))),V) #Print transform print "reconstructed:" print reconstructedMatrix return reconstructedMatrix 

I get an exception:

 Traceback (most recent call last): File "D:\workspace\PyQuEST\src\Practice\baseline_lsi.py", line 96, in <module> matrix = compute_svd( dok ) File "D:\workspace\PyQuEST\src\Practice\svd.py", line 13, in compute_svd U, s, V = linalg.svds( matrix ) File "D:\Program\Python26\lib\site-packages\scipy\sparse\linalg\eigen\arpack\arpack.py", line 1596, in svds eigvals, eigvec = eigensolver(XH_X, k=k, tol=tol ** 2) File "D:\Program\Python26\lib\site-packages\scipy\sparse\linalg\eigen\arpack\arpack.py", line 1541, in eigsh ncv, v0, maxiter, which, tol) File "D:\Program\Python26\lib\site-packages\scipy\sparse\linalg\eigen\arpack\arpack.py", line 519, in __init__ ncv, v0, maxiter, which, tol) File "D:\Program\Python26\lib\site-packages\scipy\sparse\linalg\eigen\arpack\arpack.py", line 326, in __init__ raise ValueError("matrix type must be 'f', 'd', 'F', or 'D'") ValueError: matrix type must be 'f', 'd', 'F', or 'D' 

This is my first time. How to fix it? Any ideas? Thanks!

+4
source share
2 answers

Adding Anycorn to the answer, yes, you need to increase your matrix to swim or double. This can be done using the function: asfptype () from scipy.sparse.coo_matrix

Add this line to speed it up before you call linalg.svds:

 matrix.asfptype() U, s, V = linalg.svds( matrix ) 
+5
source

you need to use float or double. you seem to be using the unsupported matrix type DOK for ints.

sparse svd: http://docs.scipy.org/doc/scipy/reference/generated/scipy.sparse.linalg.svds.html

+4
source

Source: https://habr.com/ru/post/1388210/


All Articles