【问题标题】:Sparse Matrix: ValueError: matrix type must be 'f', 'd', 'F', or 'D'稀疏矩阵:ValueError:矩阵类型必须为“f”、“d”、“F”或“D”
【发布时间】:2012-01-28 19:37:59
【问题描述】:

我想使用 scipy 对稀疏矩阵进行 SVD:

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 )

compute_svd 函数是我的自定义模块,如下所示:

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

我得到一个例外:

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'

这是我第一次这样做。我应该如何解决它?有任何想法吗?谢谢!

【问题讨论】:

    标签: matrix scipy sparse-matrix


    【解决方案1】:

    添加到 Anycorn 的答案中,是的,您需要将矩阵向上转换为浮动或加倍。这可以使用以下函数来完成: asfptype() 来自 scipy.sparse.coo_matrix

    在调用 linalg.svds 之前添加此行以向上转换:

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

    【讨论】:

      【解决方案2】:

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

      可以通过将 Datatype 从 int 更改为 float 来消除此错误,如下所示:matrix = matrix.astype(float)

      ...那么这将起作用

      【讨论】:

        【解决方案3】:

        你必须使用浮点数或双精度数。你似乎在使用不受支持的矩阵类型 DOK 的整数?。

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

        【讨论】:

        • 我认为我的问题出在 compute_svd 模块中。我之前使用过普通矩阵。但我不确定如何转换为稀疏矩阵。
        • 获取稀疏矩阵并将其复制到完整矩阵。 afaik 没有稀疏 svd 模块。
        • 它有 scipy.sparse.linalg.svds。 docs.scipy.org/doc/scipy/reference/sparse.linalg.html
        • 你是对的,我的错,错过了's'部分。确保类型是 float 或 double 并且 svds 支持 dok 类型。
        猜你喜欢
        • 2018-01-19
        • 2018-07-18
        • 1970-01-01
        • 2023-04-10
        • 2021-11-25
        • 2017-07-02
        • 1970-01-01
        • 2019-06-07
        • 2017-07-20
        相关资源
        最近更新 更多