scipy.linalg.svd: формы VT и U: что такое full_matrices и зачем это нужно? - PullRequest
0 голосов
/ 04 марта 2019

scipy.linalg.svd разлагает "любой" массив от A до U, s, VT. Примером может быть:

from numpy import array
from scipy.linalg import svd
import numpy as np

# define a matrix
A = np.arange(200).reshape((100,2))
print ('A.shape',A.shape)
U, s, VT = svd(A)
print ('U.shape',U.shape)
print ('s.shape',s.shape)
print ('VT.shape',VT.shape)
s_diag = np.zeros((100,2))
np.fill_diagonal(s_diag, s) 
print(np.allclose(A,np.dot(np.dot(U,s_diag),VT)))

enter image description here.png

Когда A.shape == (m,n), формами массивов U и VT по умолчанию являются и (m, m) и (n, n).Я отмечаю, что есть вариант (full_matrices) того, что я ожидал бы, например: enter image description here Что я не могу понять, это , почему U и VT должны были бы быть (м, м) и (n, n)? При умножении, поскольку s_diag является «диагональю», единственные используемые части таблиц U и VT в любом случае меньше ... (например, в примере размер U может быть просто100,2 ...)

1 Ответ

0 голосов
/ 05 марта 2019

После некоторого чтения википедии и некоторого математического воспоминания, получается, что у этого есть веская причина быть таким ...

Итак, первая очевидная причина заключается в том, что в зависимости от того, какойменьше, m или n, одна из таблиц должна быть заполнена в любом случае.

Теперь математическая причина в математической теории: U и VT orthonormal , что означает np.dot(U,U.T)равно np.dot(U.T,U) равно единице Matrix.То же самое касается VT.Поэтому они имеют формы (m, m) и (n, n)

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

...