Разреженная матрица: ValueError: тип матрицы должен быть 'f', 'd', 'F' или 'D' - PullRequest
6 голосов
/ 28 декабря 2011

Я хочу сделать SVD для разреженной матрицы, используя 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 )

Функция 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'

Я делаю это впервые.Как мне это исправить?Есть идеи?Спасибо!

Ответы [ 3 ]

5 голосов
/ 23 ноября 2015

В дополнение к ответу Anycorn, да, вам нужно увеличить матрицу, чтобы она плавала или удваивалась. Это можно сделать с помощью функции: asfptype () из scipy.sparse.coo_matrix

Добавьте эту строку, чтобы выгрузить ее перед вызовом linalg.svds:

matrix.asfptype()
U, s, V = linalg.svds( matrix )
5 голосов
/ 28 декабря 2011

вы должны использовать float или doubles. Вы, кажется, используете неподдерживаемую матрицу типа DOK из целых чисел?.

разреженный свд: http://docs.scipy.org/doc/scipy/reference/generated/scipy.sparse.linalg.svds.html

1 голос
/ 25 марта 2019

Source code

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

Эту ошибку можно устранить, изменив тип данных с int на float следующим образом: matrix = matrix.astype(float)

... тогда это будет работать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...