В настоящее время im использует numpy, который выполняет задание. Но, поскольку я имею дело с матрицами с несколькими тысячами строк/столбцов, и позже эта цифра будет возрастать до десятков тысяч, мне было интересно, существует ли существующий пакет, который может выполнять такие вычисления быстрее?
Каков самый быстрый способ найти собственные значения/векторы в python?
Ответ 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: