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

匿名 (未验证) 提交于 2019-12-03 08:54:24

问题:

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!

回答1:

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

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

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


回答2:

you have to use float or doubles. you seem to be using unsupported matrix type DOK of ints?.

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



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!