Estoy un poco confundido con mis resultados de cálculo de SVD para la matriz A.
$$ A= \left( \begin{array}{ccc} 4 & 2 & 1\\ 5 & 3 & -10\\ 9 & -12 & 11 \end{array} \right) \\\\ A = UDV^{T} \mbox{ for real matrix} $$
Como sé que $U$ contiene vectores propios ortonormales de $AA^{T}$ y $V$ contiene vectores propios ortonormales de $A^{T}A$ . Usando python he encontrado los valores propios y el SVD real:
import numpy as np
A = np.matrix([[4, 2, 1],
[5, 3, -10],
[9, -12, 11]])
# Calculating SVD via eigenvectors
aaeigval, aaeigvec = np.linalg.eig(A*A.T)
ateigval, ateigvec = np.linalg.eig(A.T*A)
MU = aaeigvec
MD = np.diag(np.sqrt(aaeigval))
MV = ateigvec.T
# Calculating SVD via embedded function
U, d, V = np.linalg.svd(A)
D = np.diag(d)
print("SVD MATRICES VIA NP.LINALG.SVD")
print(U)
print(D)
print(V)
print("\r\nSVD MATRICES VIA EIGENVECTORS")
print(MU)
print(MD)
print(MV)
La salida es:
SVD MATRICES VIA NP.LINALG.SVD
[[-0.04227372 -0.27992453 -0.95909081]
[ 0.36803649 -0.89680917 0.24552484]
[-0.92884987 -0.34260117 0.1409339 ]]
[[ 19.67398841 0. 0. ]
[ 0. 10.02047314 0. ]
[ 0. 0. 3.67753968]]
[[-0.33996976 0.61836777 -0.70854912]
[-0.86694055 0.08591785 0.4909503 ]
[-0.36446486 -0.78117822 -0.50687863]]
SVD MATRICES VIA EIGENVECTORS
[[-0.95909081 0.27992453 0.04227372]
[ 0.24552484 0.89680917 -0.36803649]
[ 0.1409339 0.34260117 0.92884987]]
[[ 3.67753968 0. 0. ]
[ 0. 10.02047314 0. ]
[ 0. 0. 19.67398841]]
[[-0.33996976 0.61836777 -0.70854912]
[ 0.86694055 -0.08591785 -0.4909503 ]
[ 0.36446486 0.78117822 0.50687863]]
Como puede ver, algunas columnas están invertidas, pero ese no es el problema. El problema está en los diferentes signos de las columnas. Por ejemplo, la columna 1 de $U$ y la columna 3 de $MU$ (tienen que ser el mismo vector propio) tienen signos diferentes en sus elementos. Por supuesto la verdadera descomposición es la de la función svd. Sin embargo sigo sin saber donde me equivoco.