Подтвердить что ты не робот

Каков самый быстрый способ найти собственные значения/векторы в python?

В настоящее время im использует numpy, который выполняет задание. Но, поскольку я имею дело с матрицами с несколькими тысячами строк/столбцов, и позже эта цифра будет возрастать до десятков тысяч, мне было интересно, существует ли существующий пакет, который может выполнять такие вычисления быстрее?

4b9b3361

Ответ 1

  • **, если ваша матрица разрежена, а затем создайте экземпляр своей матрицы, используя конструктор из scipy.sparse, затем используйте аналогичные собственные методы/собственные значения в spicy.sparse.linalg. С точки зрения производительности это имеет два преимущества:

    • ваша матрица, построенная из конструктора spicy.sparse, будет меньше по размеру, насколько она разрежена.

    • методы собственного значения/собственного вектора для разреженных матриц (eigs, eigsh) принимают необязательный аргумент, k, который является числом собственного вектора/пар собственных значений, которые вы хотите вернуть. Почти всегда число, необходимое для учетa > 99% дисперсии, намного меньше количества столбцов, которые вы можете проверить ex post; другими словами, вы можете сказать, что метод не вычисляет и не возвращает все пары собственных/собственных значений - за небольшим (обычно) небольшим подмножеством, необходимым для учета дисперсии, маловероятно, что вам нужно все остальное.

  • используйте библиотеку линейных алгебр в SciPy, scipy.linalg, вместо этого одноименной библиотеки NumPy. Эти две библиотеки одно и то же имя и использовать те же имена методов. Но есть разница в производительности. Это различие вызвано тем, что numpy.linalg является менее надежной оберткой на аналогичных процедурах LAPACK, которые пожертвовать некоторой производительностью для мобильности и удобства (т.е. чтобы соответствовать цели дизайна NumPy, что вся библиотека NumPy должен быть построен без компилятора Fortran). linalg в SciPy on другая сторона представляет собой гораздо более полную оболочку на LAPACK и которая использует f2py.

  • выберите функцию, подходящую для вашего использования; другими словами, не использовать функцию делает больше, чем вам нужно. В scipy.linalg существует несколько функций для вычисления собственных значений; различия невелики, хотя тщательный выбор функции для вычисления собственных значений вы должны увидеть повышение производительности. Для пример:

    • scipy.linalg.eig возвращает как собственные значения, так и собственные векторы
    • scipy.linalg.eigvals возвращает только собственные значения. Поэтому, если вам нужны только собственные значения матрицы, тогда не используйте linalg.eig, вместо этого используйте linalg.eigvals.
    • если у вас есть квадратные симметричные матрицы с вещественным значением (равные его транспонированию), то используйте scipy.linalg.eigsh
  • оптимизируйте свою Scipy-сборку. Создайте среду сборки SciPy. выполняется в основном в SciPy setup.py script. Возможно, наиболее важным вариантом является определение любого оптимизированного Библиотеки LAPACK, такие как ATLAS или инфраструктура Accelerate/vecLib (OS X только?), чтобы SciPy мог их обнаружить и построить против них. В зависимости от установки, которую вы сейчас используете, оптимизация вашего SciPy сборка, повторная установка может дать вам существенную производительность увеличение. Дополнительные примечания от основной команды SciPy: здесь.

Будут ли эти функции работать для больших матриц?

Я так думаю. Это методы разложения матрицы промышленной прочности и которые являются лишь тонкой оболочкой над аналогичной процедурой Fortran LAPACK.

Я использовал большинство методов в библиотеке linalg для разложения матриц, в которых количество столбцов обычно составляет от 5 до 50, а количество строк обычно превышает 500 000. Ни SVD, ни методы собственных значений, похоже, не имеют проблем с обработкой матриц такого размера.

Используя библиотеку SciPy linalg, вы можете рассчитать собственные векторы и собственные значения с помощью одного вызова с использованием любого из нескольких методов из этой библиотеки eig, eigvalsh и в восемь.

>>> import numpy as NP
>>> from scipy import linalg as LA

>>> A = NP.random.randint(0, 10, 25).reshape(5, 5)
>>> A
    array([[9, 5, 4, 3, 7],
           [3, 3, 2, 9, 7],
           [6, 5, 3, 4, 0],
           [7, 3, 5, 5, 5],
           [2, 5, 4, 7, 8]])

>>> e_vals, e_vecs = LA.eig(A)

Ответ 2

Если ваши матрицы разрежены, вы можете попробовать использовать функцию scipy sparse ownvalue, которая должна быть быстрее:

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

Вы также можете проверить специализированные пакеты, такие как SLEPc, которые имеют привязки python и могут выполнять вычисления параллельно с помощью mpi:

http://code.google.com/p/slepc4py/