Функция linalg.svd
Функция linalg.svd выполняет сингулярное разложение (SVD) матрицы.
Она разлагает матрицу A размером M x N на три матрицы:
U, S и V^T, где A = U * S * V^T.
Первым параметром функция принимает двумерный массив. Вторым параметром можно
передать булево значение full_matrices, определяющее форму выходных матриц.
Синтаксис
np.linalg.svd(a, [full_matrices])
Пример
Выполним сингулярное разложение матрицы размером 2x3:
import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6]])
U, S, Vt = np.linalg.svd(arr)
print("U:")
print(U)
print("S:")
print(S)
print("Vt:")
print(Vt)
Результат выполнения кода:
U:
[[-0.3863177 -0.92236578]
[-0.92236578 0.3863177 ]]
S:
[9.508032 0.77286964]
Vt:
[[-0.42866713 -0.56630692 -0.7039467 ]
[ 0.80596391 0.11238241 -0.58119908]
[ 0.40824829 -0.81649658 0.40824829]]
Пример
Получим сингулярное разложение с полными матрицами, используя параметр full_matrices:
import numpy as np
arr = np.array([[1, 2], [3, 4], [5, 6]])
U, S, Vt = np.linalg.svd(arr, full_matrices=True)
print("U shape:", U.shape)
print("Vt shape:", Vt.shape)
Результат выполнения кода:
U shape: (3, 3)
Vt shape: (2, 2)
Пример
Восстановим исходную матрицу из сингулярного разложения:
import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
U, S, Vt = np.linalg.svd(arr)
S_mat = np.zeros((arr.shape[0], arr.shape[1]))
S_mat[:len(S), :len(S)] = np.diag(S)
res = U @ S_mat @ Vt
print(res)
Результат выполнения кода:
[[1. 2. 3.]
[4. 5. 6.]
[7. 8. 9.]]
Пример
Используем сингулярное разложение для низкоранговой аппроксимации матрицы:
import numpy as np
rng = np.random.default_rng(0)
arr = rng.random((5, 5))
U, S, Vt = np.linalg.svd(arr)
k = 2
U_k = U[:, :k]
S_k = np.diag(S[:k])
Vt_k = Vt[:k, :]
approx = U_k @ S_k @ Vt_k
print(approx.round(3))
Результат выполнения кода:
[[0.712 0.472 0.436 0.411 0.287]
[0.817 0.532 0.482 0.456 0.319]
[0.861 0.556 0.501 0.474 0.333]
[0.435 0.256 0.208 0.2 0.149]
[0.741 0.47 0.421 0.398 0.283]]
Смотрите также
-
функцию
eig,
которая вычисляет собственные значения и собственные векторы квадратной матрицы -
функцию
eigh,
которая вычисляет собственные значения и собственные векторы эрмитовой матрицы -
функцию
pinv,
которая вычисляет псевдообратную матрицу через сингулярное разложение -
функцию
matrix_rank,
которая вычисляет ранг матрицы на основе сингулярных чисел