Спектральное разложение матрицы python

Русские Блоги

Собственное разложение матрицы (вывод + ручное вычисление + вычисление на Python + собственное разложение симметричной матрицы)

Каталог статей

1. Введение

Чтобы изучить собственное разложение матрицы, вы можете заранее ознакомиться с некоторыми базовыми знаниями о матрице:
https://blog.csdn.net/qq_30232405/article/details/104588293

2. Углубленное знание матрицы

2.1 Собственное разложение (спектральное разложение) => может использоваться только на квадратных матрицах

2.1.1 Принцип декомпозиции признаков

Если вы скажете вектор v v v Фаланга A A A Собственный вектор обязательно будет выражен в следующем виде:
A v = λ v (2-1) Av=\lambda v \tag A v = λ v ( 2 — 1 )

  • Математический смысл этой формы: Описывает матрицу A A A Парный вектор v v v Эффект преобразования — это только растяжение, без вращения. (потому как λ \lambda λ Это числовое значение)
  • В этот момент λ \lambda λ Вектор признаков v v v Соответствующее собственное значение

Также можно рассматривать как матрицу A A A ,вектор v v v ,коэффициент λ \lambda λ Эти трое установили связь, но, очевидно, мы не можем использовать формулу (2-1) v v v с участием λ \lambda λ Средства A A A , Поскольку эта формула неполна, для ранга m m m Матрица A A A , Должен существовать m m m Для такой формулы полная формула должна быть:
A ( v 1 , v 2 , . . . , v m ) = ( λ 1 v 1 , λ 2 v 2 , . . . , λ m v m ) = ( v 1 , v 2 , . . . , v m ) [ λ 1 . . . 0 ⋮ ⋱ ⋮ 0 . . . λ m ] A(v_1,v_2. v_m)=(\lambda_1 v_1,\lambda_2 v_2. \lambda_m v_m)=(v_1,v_2. v_m) \begin \lambda_1 & . & 0 \\ \vdots & \ddots & \vdots \\ 0 & . & \lambda_m \\ \end A ( v 1 ​ , v 2 ​ , . . . , v m ​ ) = ( λ 1 ​ v 1 ​ , λ 2 ​ v 2 ​ , . . . , λ m ​ v m ​ ) = ( v 1 ​ , v 2 ​ , . . . , v m ​ ) ⎣ ⎢ ⎡ ​ λ 1 ​ ⋮ 0 ​ . . . ⋱ . . . ​ 0 ⋮ λ m ​ ​ ⎦ ⎥ ⎤ ​
A V = V Λ (2-2) AV=V\Lambda \tag A V = V Λ ( 2 — 2 )

Согласно формуле (2-2) матрица может быть получена A A A Формула характеристического разложения:

A = V Λ V − 1 (2-3) A=V\Lambda V^ \tag A = V Λ V − 1 ( 2 — 3 )

  • МатрицаНабор векторов признаков V V V Это набор ортогональных векторов.
  • из их V V V Эта матрица A A A Матрица собственных векторов, Λ \Lambda Λ Это диагональная матрица, и каждый элемент на диагонали является собственным значением.

Резюме: разложение функций, вы можете получить m m m Собственные векторы и собственные значения, используя это m m m Эта матрица может быть аппроксимирована характеристикой (представляющей наиболее важную характеристику этой матрицы).

2.1.2 Рациональность декомпозиции признаков

Матрица и матрицаНесобственный векторУмножение — это преобразование вращения вектора; матрицы и матрицыВектор признаковУмножение — это масштабное преобразование вектора, где степень масштабирования зависит от размера значения признака.

Матрица имеет функцию усиления (или ослабления) собственного вектора в направлении, указанном собственным вектором. То есть, если матрица продолжает итерацию по вектору, тогда вектор признаков будет выделен и использовать python для вычисления:

  • Сначала приведем пример, предположим, что матрица A A A И вектор V V V :
    A = [ 4 1 1 1 2 1 3 2 3 ] A= \begin 4 & 1 & 1 \\ 1 & 2 & 1 \\ 3 & 2 & 3 \\ \end A = ⎣ ⎡ ​ 4 1 3 ​ 1 2 2 ​ 1 1 3 ​ ⎦ ⎤ ​
    V = [ − 1 5 3 ] V = \begin -1 \\ 5 \\ 3 \\ \end V = ⎣ ⎡ ​ − 1 5 3 ​ ⎦ ⎤ ​
Читайте также:  Python array indexing range

Использовать матрицу A A A Чтобы многократно умножить вектор V V V , Код Python выглядит следующим образом:

import numpy as np import copy A = np.array([[4, 1, 1], [1, 2, 1], [3, 2, 3]]) V = np.array([[-1], [5], [3]]) dot_nums = [1, 3, 5, 10] for i in range(len(dot_nums)): A_ = copy.copy(A) for _ in range(dot_nums[i] - 1): A_ = np.dot(A_, A) B = np.dot(A_, V) B = np.abs(B) C = B / np.sum(B) print("dot number: %d" % dot_nums[i]) print(C) 

python

Видно, что после непрерывного умножения на A преобразованный нормализованный вектор зависает около (0,33, 0,2, 0,46), что согласуется с нормализованным результатом для собственного вектора, соответствующего вычисленному максимальному собственному значению. Это также доказывает, что матрица имеет определенные постоянные характеристики. Итак, чтобы извлечь матрицуНеизменность«, или для описания основного направления преобразования (матричный штраф — линейное преобразование) очень необходимо.

2.1.3 Расчет разложения признаков

На основе формулы (2-1) внесем некоторые изменения:
A v = λ v → A v = λ I v → ( λ I − A ) v = 0 (2-4) Av=\lambda v \to Av=\lambda Iv \to (\lambda I-A)v = 0 \tag A v = λ v → A v = λ I v → ( λ I − A ) v = 0 ( 2 — 4 )
Согласно теории линейных уравнений, чтобы это уравнение имело ненулевое решение, матрица ( λ I − A ) (\lambda I-A) ( λ I − A ) Определитель должен быть равен нулю:
d e t ( λ I − A ) v = 0 (2-5) det(\lambda I-A)v = 0 \tag d e t ( λ I − A ) v = 0 ( 2 — 5 )
Вышеупомянутая формула также известна как A A A Характеристические уравнения, вычислить все λ \lambda λ После значения подставьте ( λ I − A ) v = 0 (\lambda I-A)v = 0 ( λ I − A ) v = 0 Решите соответствующие v v v

Примечание: обратите внимание на ситуацию, когда собственные значения являются кратными корнями. . . .

(1) Ручной расчет

Найдите матрицу A A A Собственные значения и собственные векторы:
∣ λ I − A ∣ = ∣ 4 1 1 1 2 1 3 2 3 ∣ = ( λ − 6 ) ( λ − 2 ) ( λ − 1 ) |\lambda I-A| = \begin 4 & 1 & 1 \\ 1 & 2 & 1 \\ 3 & 2 & 3 \\ \end = (\lambda-6)(\lambda-2)(\lambda-1) ∣ λ I − A ∣ = ∣ ∣ ∣ ∣ ∣ ∣ ​ 4 1 3 ​ 1 2 2 ​ 1 1 3 ​ ∣ ∣ ∣ ∣ ∣ ∣ ​ = ( λ − 6 ) ( λ − 2 ) ( λ − 1 )

Вы можете получить результат:
λ 1 = 6 , λ 2 = 2 , λ 3 = 1 \lambda_1 = 6, \lambda_2 = 2, \lambda_3=1 λ 1 ​ = 6 , λ 2 ​ = 2 , λ 3 ​ = 1

когда λ = 6 \lambda=6 λ = 6 Время, ( 6 I − A ) v = 0 (6I-A)v=0 ( 6 I − A ) v = 0 :
( 4 1 1 1 2 1 3 2 3 ) ( v 1 v 2 v 3 ) = 0 \begin 4 & 1 & 1 \\ 1 & 2 & 1 \\ 3 & 2 & 3 \\ \end \begin v_1 \\ v_2 \\ v_3 \\ \end = 0 ⎝ ⎛ ​ 4 1 3 ​ 1 2 2 ​ 1 1 3 ​ ⎠ ⎞ ​ ⎝ ⎛ ​ v 1 ​ v 2 ​ v 3 ​ ​ ⎠ ⎞ ​ = 0
r e s u l t : v 1 = 5 , v 2 = 3 , v 3 = 7 result: v_1 = 5, v_2=3, v_3=7 r e s u l t : v 1 ​ = 5 , v 2 ​ = 3 , v 3 ​ = 7

когда λ = 2 \lambda=2 λ = 2 Время, ( 2 I − A ) v = 0 (2I-A)v=0 ( 2 I − A ) v = 0 :
r e s u l t : v 1 = 1 , v 2 = − 1 , v 3 = 1 result: v_1 = 1, v_2=-1, v_3=1 r e s u l t : v 1 ​ = 1 , v 2 ​ = − 1 , v 3 ​ = 1

когда λ = 1 \lambda=1 λ = 1 Время, ( I − A ) v = 0 (I-A)v=0 ( I − A ) v = 0 :
r e s u l t : v 1 = 0 , v 2 = 1 , v 3 = − 1 result: v_1 = 0, v_2=1, v_3=-1 r e s u l t : v 1 ​ = 0 , v 2 ​ = 1 , v 3 ​ = − 1

(2) расчет на питоне

Используйте библиотеку eig, которая поставляется с python, где V V V Матрица собственных векторов, D D D Значение характеристики. V V V Столбец — это соответствующий вектор признаков.

import numpy as np import copy A = np.array([[4, 1, 1], [1, 2, 1], [3, 2, 3]]) D, V = np.linalg.eig(A) if np.equal(np.dot(A, V), np.dot(V, np.diag(D))): print(True) 

python

Было обнаружено, что значение собственного вектора, вычисленное с помощью python, отличается от значения собственного вектора, вычисленного вручную, но соотношение такое же. Это связано с тем, что собственный вектор не является уникальным. Собственный вектор получается из решения системы однородных линейных уравнений, которая является базовой системой решения системы однородных линейных уравнений. Ненулевая линейная комбинация.

Читайте также:  Delete array object in javascript

2.1.4 Собственное разложение симметричной матрицы (это свойство будет использоваться при выводе SVD позже)

Теорема: матрица предположений A A A Является симметричной матрицей, то собственные векторы, соответствующие различным собственным значениям, попарно ортогональны

Сначала выполните разложение признаков:
A x i = λ i x i (2-6) Ax_i=\lambda_i x_i \tag A x i ​ = λ i ​ x i ​ ( 2 — 6 )
A x j = λ j x j (2-7) Ax_j=\lambda_j x_j \tag A x j ​ = λ j ​ x j ​ ( 2 — 7 )

Умножьте левую часть формулы (2-6) x j x_j x j ​ :
x j T A x i = λ i x j T x i (2-8) x_j^\mathrm Ax_i=\lambda_i x_j^\mathrm x_i \tag x j T ​ A x i ​ = λ i ​ x j T ​ x i ​ ( 2 — 8 )

Поскольку матрица A является симметричной матрицей, левая часть уравнения (2-8) может быть преобразована следующим образом:

x j T A x i = x j T A T x i = ( A x j ) T x i = ( λ j x j ) T x i = λ i x j T x i (2-9) x_j^\mathrm Ax_i=x_j^\mathrm A^\mathrm x_i = (Ax_j)^\mathrm x_i = (\lambda_j x_j)^\mathrmx_i = \lambda_i x_j^\mathrm x_i \tag x j T ​ A x i ​ = x j T ​ A T x i ​ = ( A x j ​ ) T x i ​ = ( λ j ​ x j ​ ) T x i ​ = λ i ​ x j T ​ x i ​ ( 2 — 9 )

Наконец, с помощью (2-9) мы можем получить:

( λ j x j ) T x i = λ i x j T x i → ( λ j − λ i ) x j T x i = 0 (2-10) (\lambda_j x_j)^\mathrmx_i = \lambda_i x_j^\mathrm x_i \to (\lambda_j — \lambda_i)x_j^\mathrmx_i = 0 \tag ( λ j ​ x j ​ ) T x i ​ = λ i ​ x j T ​ x i ​ → ( λ j ​ − λ i ​ ) x j T ​ x i ​ = 0 ( 2 — 1 0 )
, потому что λ j ≠ λ i \lambda_j \neq \lambda_i λ j ​  ​ = λ i ​ , x j T x i x_j^\mathrmx_i x j T ​ x i ​ Должен быть равен 0.
, потому что x j x_j x j ​ с участием x i x_i x i ​ Будут любыми двумя собственными векторами матрицы A, поэтому предложение доказано.

Источник

numpy.linalg.svd#

When a is a 2D array, and full_matrices=False , then it is factorized as u @ np.diag(s) @ vh = (u * s) @ vh , where u and the Hermitian transpose of vh are 2D arrays with orthonormal columns and s is a 1D array of a’s singular values. When a is higher-dimensional, SVD is applied in stacked mode as explained below.

Parameters : a (…, M, N) array_like

A real or complex array with a.ndim >= 2 .

full_matrices bool, optional

If True (default), u and vh have the shapes (. M, M) and (. N, N) , respectively. Otherwise, the shapes are (. M, K) and (. K, N) , respectively, where K = min(M, N) .

compute_uv bool, optional

Whether or not to compute u and vh in addition to s. True by default.

hermitian bool, optional

If True, a is assumed to be Hermitian (symmetric if real-valued), enabling a more efficient method for finding singular values. Defaults to False.

Returns : When compute_uv is True, the result is a namedtuple with the following attribute names: U < (…, M, M), (…, M, K) >array

Unitary array(s). The first a.ndim — 2 dimensions have the same size as those of the input a. The size of the last two dimensions depends on the value of full_matrices. Only returned when compute_uv is True.

S (…, K) array

Vector(s) with the singular values, within each vector sorted in descending order. The first a.ndim — 2 dimensions have the same size as those of the input a.

Unitary array(s). The first a.ndim — 2 dimensions have the same size as those of the input a. The size of the last two dimensions depends on the value of full_matrices. Only returned when compute_uv is True.

Читайте также:  Php get headers не работает

If SVD computation does not converge.

Similar function in SciPy.

Compute singular values of a matrix.

Changed in version 1.8.0: Broadcasting rules apply, see the numpy.linalg documentation for details.

The decomposition is performed using LAPACK routine _gesdd .

SVD is usually described for the factorization of a 2D matrix \(A\) . The higher-dimensional case will be discussed below. In the 2D case, SVD is written as \(A = U S V^H\) , where \(A = a\) , \(U= u\) , \(S= \mathtt(s)\) and \(V^H = vh\) . The 1D array s contains the singular values of a and u and vh are unitary. The rows of vh are the eigenvectors of \(A^H A\) and the columns of u are the eigenvectors of \(A A^H\) . In both cases the corresponding (possibly non-zero) eigenvalues are given by s**2 .

If a has more than two dimensions, then broadcasting rules apply, as explained in Linear algebra on several matrices at once . This means that SVD is working in “stacked” mode: it iterates over all indices of the first a.ndim — 2 dimensions and for each combination SVD is applied to the last two indices. The matrix a can be reconstructed from the decomposition with either (u * s[. None, :]) @ vh or u @ (s[. None] * vh) . (The @ operator can be replaced by the function np.matmul for python versions below 3.5.)

If a is a matrix object (as opposed to an ndarray ), then so are all the return values.

>>> a = np.random.randn(9, 6) + 1j*np.random.randn(9, 6) >>> b = np.random.randn(2, 7, 8, 3) + 1j*np.random.randn(2, 7, 8, 3) 

Reconstruction based on full SVD, 2D case:

>>> U, S, Vh = np.linalg.svd(a, full_matrices=True) >>> U.shape, S.shape, Vh.shape ((9, 9), (6,), (6, 6)) >>> np.allclose(a, np.dot(U[:, :6] * S, Vh)) True >>> smat = np.zeros((9, 6), dtype=complex) >>> smat[:6, :6] = np.diag(S) >>> np.allclose(a, np.dot(U, np.dot(smat, Vh))) True 

Reconstruction based on reduced SVD, 2D case:

>>> U, S, Vh = np.linalg.svd(a, full_matrices=False) >>> U.shape, S.shape, Vh.shape ((9, 6), (6,), (6, 6)) >>> np.allclose(a, np.dot(U * S, Vh)) True >>> smat = np.diag(S) >>> np.allclose(a, np.dot(U, np.dot(smat, Vh))) True 

Reconstruction based on full SVD, 4D case:

>>> U, S, Vh = np.linalg.svd(b, full_matrices=True) >>> U.shape, S.shape, Vh.shape ((2, 7, 8, 8), (2, 7, 3), (2, 7, 3, 3)) >>> np.allclose(b, np.matmul(U[. , :3] * S[. , None, :], Vh)) True >>> np.allclose(b, np.matmul(U[. , :3], S[. , None] * Vh)) True 

Reconstruction based on reduced SVD, 4D case:

>>> U, S, Vh = np.linalg.svd(b, full_matrices=False) >>> U.shape, S.shape, Vh.shape ((2, 7, 8, 3), (2, 7, 3), (2, 7, 3, 3)) >>> np.allclose(b, np.matmul(U * S[. , None, :], Vh)) True >>> np.allclose(b, np.matmul(U, S[. , None] * Vh)) True 

Источник

Оцените статью