Ce que je veux faire: Découvrez la décomposition en valeurs singulières de l'algèbre linéaire
Pour la matrice de colonnes $ m $ ligne $ n $ $ A $
Existe et les prises suivantes
A=U\Sigma \overline{V^T}
Où le surligne est le conjugué complexe et $ ^ T $ est la transposée.
A=\left(
\begin{matrix}
1 & 2 \\
3 & 4
\end{matrix}
\right)
> import numpy as np
> A = np.array([[1,2],[3,4]])
> A
array([[1, 2],
[3, 4]])
U, s, V = np.linalg.svd(A, full_matrices=True)
Il existe trois valeurs de retour.
> U
array([[-0.40455358, -0.9145143 ],
[-0.9145143 , 0.40455358]])
> s
array([ 5.4649857 , 0.36596619])
> V
array([[-0.57604844, -0.81741556],
[ 0.81741556, -0.57604844]])
D'une manière ou d'une autre, on a l'impression que $ s $ s'est effondré, mais la substance n'est que la composante diagonale, c'est-à-dire
> np.diag(s)
array([[ 5.4649857 , 0. ],
[ 0. , 0.36596619]])
Est une matrice d'entités.
A=U\Sigma \overline{V^T}
Je vérifierai.
>np.dot(np.dot(U, np.diag(s)),V)
array([[ 1., 2.],
[ 3., 4.]])
Ça fait du bien ♪ ⇒ Ici, puisque la matrice $ V $ est obtenue par la colonne d'exécution, il n'est pas nécessaire d'effectuer une conjugaison complexe, mais il semble que celle qui ne prend pas de translocation soit retournée comme valeur de retour.
> np.dot(U, U.T)
array([[ 1.00000000e+00, 2.77555756e-16],
[ 2.77555756e-16, 1.00000000e+00]])
Il est numériquement inévitable qu'une valeur autre que $ 0 $ soit saisie à un endroit qui n'est pas une composante diagonale.
> np.dot(V, V.T)
array([[ 1., 0.],
[ 0., 1.]])
Recommended Posts