Python >> Tutoriel Python >  >> Python

Décomposition en valeurs singulières (SVD) en Python

La décomposition en valeurs singulières (SVD) est l'une des méthodes largement utilisées pour la réduction de la dimensionnalité . SVD décompose une matrice en trois autres matrices.

Si nous considérons les matrices comme quelque chose qui provoque une transformation linéaire dans l'espace, alors avec la décomposition en valeurs singulières, nous décomposons une seule transformation en trois mouvements.

dans cet article, nous verrons différentes méthodes pour implémenter SVD.

Les bases de la décomposition en valeurs singulières

SVD factorise une seule matrice en matrice U, D et V* respectivement.

où,

  • U et V* sont des matrices orthogonales.
  • D est une matrice diagonale de valeurs singulières.

Le SVD peut également être vu comme la décomposition d'une transformation complexe en 3 transformations plus simples (rotation, mise à l'échelle et rotation).

En termes de transformations

  • Les matrices U et V* provoquent une rotation
  • La matrice diagonale D provoque une mise à l'échelle.

Donc, fondamentalement, cela nous permet d'exprimer notre matrice d'origine sous la forme d'une combinaison linéaire de matrices de rang inférieur. Seules les premières valeurs singulières sont grandes.

Les termes autres que les premiers peuvent être ignorés sans perdre beaucoup d'informations et c'est pourquoi la SVD est appelée technique de réduction de dimensionnalité.

Implémentation de SVD en Python

Commençons par l'implémentation de SVD en Python. Nous travaillerons avec plusieurs bibliothèques pour montrer comment la mise en œuvre se déroulera.

1. Utiliser Numpy

Python Numpy ayant des capacités pour implémenter la plupart des méthodes d'algèbre linéaire offre une implémentation facile de SVD.

Nous utiliserons numpy.linalg module qui a svd classe pour effectuer SVD sur une matrice.

import numpy as np

#Creating a matrix A
A = np.array([[3,4,3],[1,2,3],[4,2,1]])

#Performing SVD
U, D, VT = np.linalg.svd(A)

#Checking if we can remake the original matrix using U,D,VT
A_remake = (U @ np.diag(D) @ VT)
print(A_remake)

D est un tableau 1D au lieu d'un tableau 2D. D est une matrice diagonale dont la plupart des valeurs finissent par être nulles, une telle matrice est appelée matrice creuse . pour économiser de l'espace, il est renvoyé sous forme de tableau 1D.

2. Utiliser scikit-learn

Nous utiliserons TruncatedSVD classe à partir de sklearn.decomposition module.

En TruncatedSVD nous devons spécifier le nombre de composants dont nous avons besoin dans notre sortie, donc au lieu de calculer des décompositions entières, nous calculons simplement les valeurs singulières requises et coupons le reste.

#Importing required modules
import numpy as np
from sklearn.decomposition import TruncatedSVD

#Creating array 
A = np.array([[3,4,3],[1,2,3],[4,2,1]])

#Fitting the SVD class
trun_svd =  TruncatedSVD(n_components = 2)
A_transformed = svd.fit_transform(A)

#Printing the transformed matrix
print("Transformed Matrix:")
print(A_transf)

Conclusion

Dans cet article, nous avons vu comment implémenter la décomposition en valeurs singulières (SVD) à l'aide de bibliothèques telles que Numpy et scikit-learn.

Bon apprentissage !