Разреженная матрица: ValueError: тип матрицы должен быть «f», «d», «F» или «D».

Я хочу сделать 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 )

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

Это мой первый раз, чтобы сделать это. Как мне это исправить? Есть идеи? Спасибо!


person Munichong    schedule 27.12.2011    source источник


Ответы (3)


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

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

matrix = matrix.asfptype()
U, s, V = linalg.svds( matrix )
person Karishma Malkan    schedule 23.11.2015

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

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

person Anycorn    schedule 27.12.2011
comment
Я думаю, что моя проблема в модуле calculate_svd. Раньше использовал обычную матрицу. Но я не уверен, как преобразовать в разреженную матрицу. - person Munichong; 28.12.2011
comment
возьмите свою разреженную матрицу и скопируйте ее в полную матрицу. афаик нет разреженного модуля свд. - person Anycorn; 28.12.2011
comment
Он имеет scipy.sparse.linalg.svds. docs.scipy.org/doc/scipy/reference/sparse.linalg. html - person Munichong; 28.12.2011
comment
ты прав, мой плохой, пропустил часть 's'. убедитесь, что используется тип float или double и что тип dok поддерживается svds. - person Anycorn; 28.12.2011

Исходный код

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

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

... тогда это сработает

person TECH GUY    schedule 25.03.2019