2015-03-08 2 views
1

У меня есть огромная разреженная матрица AЛинейные зависимые строки: Огромные разреженные матрицы

<5000x5000 sparse matrix of type '<type 'numpy.float64'>' 
    with 14979 stored elements in Compressed Sparse Column format> 

, для которого нужен удалить линейно зависимые строки. У меня есть предшествующий, что строки j будут зависеть. Мне нужно

  • выяснить, какие наборы строк являются линейно зависимыми
  • для каждого набора, держать одну произвольную строку и удалить другие

Я пытался следовать this question, но соответствующий метод для разреженных матриц, scipy.sparse.linalg.eigs говорит, что

к: количество собственных значений и собственных векторов желательно , k должно быть меньше N. Невозможно вычислить все собственные векторы матрицы .

Как продолжить?

+0

Возможно, правильным инструментом является [QR-декомпозиция] (https://en.wikipedia.org/wiki/QR_decomposition). Scipy имеет только для плотных матриц. Однако ортонормализация [Gram-Schmid ортонормирования] (https://en.wikipedia.org/wiki/Gram%E2%80%93Schmidt_process#Algorithm) должна быть относительно простой для программирования для разреженных матриц, хотя ее быстрое выполнение, вероятно, потребует больших усилий , Линейно зависимые строки обозначаются строками, которые становятся нулевыми (или близкими к нулю) во время ортонормирования. Это вы можете обнаружить и записать индекс строки - это те, которые вы хотите удалить. –

ответ

1

scipy.sparse.linalg.eigs использует неявно перезапущенную итерацию Арнольди. Алгоритм предназначен для быстрого поиска нескольких собственных векторов и не может найти всех из них.

5000x5000, однако не это большой. Вы считали, что используете только numpy.linalg.eig или scipy.linalg.eig? Вероятно, это займет несколько минут, но это не совсем невозможно. Вы ничего не получаете, используя разреженную матрицу, но я не уверен, что есть алгоритм для эффективного поиска всех собственных векторов разреженной матрицы.

+0

Я полагаю, существует альтернативная процедура, которая не предполагает вычисления собственных значений? Это часть кода, который должен повторяться примерно в 50-100 раз. Ах, и я начинаю (по какой-то другой причине) с разреженной матрицы, поэтому я не создавал ее специально для этой цели. – FooBar

Смежные вопросы