Функция linalg.eig() вычисляет собственные числа (значения) и собственные векторы квадратной матрицы.
Собственное число квадратной матрицы a и ее собственный вектор связаны равенством np.dot(a, v) = w*v .
Если у матрицы несколько собственных чисел и соответственно несколько собственных векторов, то данная функция возвращает массив собственных значений и массив собственных векторов (необязательно упорядоченных). В этом случае выполняются равенства np.dot(a[. ], v[:,i]) = w[i] * v[:,i] , для всех i из интервала [0, . M — 1] , где M — размер матрицы.
Параметры: a — массив NumPy или подобнй массиву объект. Это может быть толко «квадратный» двумерный массив, т.е. квадратная матрица. Если это многомерный массив, то две его последние оси должны быть равны, в этом случае он рассматривается как массив матриц и все вычисления выполняются отдельно для каждой из них. Возвращает: w — массив NumPy Собственные числа входной матрицы. v — массив NumPy Собственные векторы входной матрицы.
Видео:Собственные значения и собственные векторы матрицы (4)Скачать
Замечание
Видео:Собственные векторы и собственные числа линейного оператораСкачать
Примеры
Иногда, визуально кажется, что вышеописанные равенства не выполняются:
Однако, значения первых столбцов равны, а значения второго и третьего столбцов настолько малы, что могут быть приравнены к 0.
Всегда следует помнить об ошибках округления:
Но на самом деле w = [1.000000001, 0.999999999] .
Видео:Собственные векторы и собственные значения матрицыСкачать
Каков самый быстрый способ найти собственные значения/векторы в python?
В настоящее время im использует numpy, который выполняет задание. Но, поскольку я имею дело с матрицами с несколькими тысячами строк/столбцов, и позже эта цифра будет возрастать до десятков тысяч, мне было интересно, существует ли существующий пакет, который может выполнять такие вычисления быстрее?
Видео:7 4 Собственные векторы и собственные значенияСкачать
ОТВЕТЫ
Ответ 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 и в восемь.
Ответ 2
Если ваши матрицы разрежены, вы можете попробовать использовать функцию scipy sparse ownvalue, которая должна быть быстрее:
Вы также можете проверить специализированные пакеты, такие как SLEPc, которые имеют привязки python и могут выполнять вычисления параллельно с помощью mpi:
Видео:Собственные векторы и собственные числа линейного оператораСкачать
numpy.linalg.eig¶
Compute the eigenvalues and right eigenvectors of a square array.
Parameters a (…, M, M) array
Matrices for which the eigenvalues and right eigenvectors will be computed
Returns w (…, M) array
The eigenvalues, each repeated according to its multiplicity. The eigenvalues are not necessarily ordered. The resulting array will be of complex type, unless the imaginary part is zero in which case it will be cast to a real type. When a is real the resulting eigenvalues will be real (0 imaginary part) or occur in conjugate pairs
v (…, M, M) array
The normalized (unit “length”) eigenvectors, such that the column v[:,i] is the eigenvector corresponding to the eigenvalue w[i] .
If the eigenvalue computation does not converge.
eigenvalues of a non-symmetric array.
eigenvalues and eigenvectors of a real symmetric or complex Hermitian (conjugate symmetric) array.
eigenvalues of a real symmetric or complex Hermitian (conjugate symmetric) array.
Similar function in SciPy that also solves the generalized eigenvalue problem.
Best choice for unitary and other non-Hermitian normal matrices.
New in version 1.8.0.
Broadcasting rules apply, see the numpy.linalg documentation for details.
This is implemented using the _geev LAPACK routines which compute the eigenvalues and eigenvectors of general square arrays.
The number w is an eigenvalue of a if there exists a vector v such that a @ v = w * v . Thus, the arrays a, w, and v satisfy the equations a @ v[:,i] = w[i] * v[:,i] for (i in ) .
The array v of eigenvectors may not be of maximum rank, that is, some of the columns may be linearly dependent, although round-off error may obscure that fact. If the eigenvalues are all different, then theoretically the eigenvectors are linearly independent and a can be diagonalized by a similarity transformation using v, i.e, inv(v) @ a @ v is diagonal.
For non-Hermitian normal matrices the SciPy function scipy.linalg.schur is preferred because the matrix v is guaranteed to be unitary, which is not the case when using eig . The Schur factorization produces an upper triangular matrix rather than a diagonal matrix, but for normal matrices only the diagonal of the upper triangular matrix is needed, the rest is roundoff error.
Finally, it is emphasized that v consists of the right (as in right-hand side) eigenvectors of a. A vector y satisfying y.T @ a = z * y.T for some number z is called a left eigenvector of a, and, in general, the left and right eigenvectors of a matrix are not necessarily the (perhaps conjugate) transposes of each other.
G. Strang, Linear Algebra and Its Applications, 2nd Ed., Orlando, FL, Academic Press, Inc., 1980, Various pp.
(Almost) trivial example with real e-values and e-vectors.
Real matrix possessing complex e-values and e-vectors; note that the e-values are complex conjugates of each other.
💡 Видео
А.7.35 Собственные вектора и собственные значения матрицыСкачать
Собственные значения и собственные векторы. ТемаСкачать
Собственные значения и собственные векторыСкачать
#11. Произведение матриц и векторов, элементы линейной алгебры | NumPy урокиСкачать
Основы SciPy | Научные И Математические Вычисления На PythonСкачать
Собственные значения и собственные векторы. ПримерСкачать
Основы NumPy Python | Массивы, Матрицы И Операции Над НимиСкачать
Овчинников А. В. - Линейная алгебра - Собственные значения и собственные векторы линейного оператораСкачать
Собственные значения матрицыСкачать
Собственные векторы и собственные значенияСкачать
Айгенвектора и айгензначения | Сущность Линейной Алгебры, глава 10Скачать
Матрицы на пальцах. Основные операции с матрицами в Python [Математика для машинного обучения]Скачать
Практика 1. Часть 1. Собственные вектора и значения линейного оператора. Канонический вид.Скачать
А.7.40 Метод Якоби поиска собственных векторов и значений симметричных матрицСкачать
Матрицы в SymPyСкачать