I want to do SVD on a sparse matrix by 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 function compute_svd is my customized module like this:
def compute_svd( matrix ): from scipy.sparse import linalg from scipy import dot, mat # e.g., 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 to do this. How should I fix it? Any ideas? Thank you!