Relation entre SVD et PCA. Comment utiliser SVD pour effectuer une PCA?

352

L'analyse en composantes principales (ACP) est généralement expliquée via une décomposition propre de la matrice de covariance. Toutefois, cela peut également être effectué via une décomposition en valeurs singulières (SVD) de la matrice de donnéesX . Comment ça marche? Quel est le lien entre ces deux approches? Quelle est la relation entre SVD et PCA?

Ou, en d'autres termes, comment utiliser la SVD de la matrice de données pour effectuer une réduction de dimensionnalité?

amibe
la source
8
J'ai écrit cette question de type FAQ avec ma propre réponse, car elle est fréquemment posée sous différentes formes, mais il n'y a pas de fil conducteur, ce qui rend difficile la duplication de doublons. Veuillez fournir des méta-commentaires dans ce méta-fil d'accompagnement .
amibe
2
En plus d'une excellente réponse détaillée de l'amibe avec ses liens supplémentaires, je pourrais recommander de vérifier ceci , où PCA est considérée côte à côte avec d'autres techniques basées sur la SVD. La discussion présente l'algèbre presque identique à celle des amibes avec une différence mineure: le discours décrit en PCA la décomposition en DVD de [ou ] au lieu de - ce qui est simplement pratique car il concerne l’ACP effectuée via la composition même de la matrice de covariance. X/X/n XX/n1X
jeudi
La PCA est un cas particulier de SVD. PCA a besoin de données normalisées, idéalement de la même unité. La matrice est nxn dans PCA.
Orvar Korvar
@OrvarKorvar: De quelle matrice nxn parlez-vous?
Cbhihe

Réponses:

412

Supposons que la matrice de données soit de taille , où représente le nombre d'échantillons et le nombre de variables. Supposons qu'il soit centré , c'est-à-dire que les moyennes des colonnes ont été soustraites et sont maintenant égales à zéro. n × p n pXn×pnp

Alors la matrice de covariance est donnée par . C'est une matrice symétrique et elle peut donc être diagonalisée: où est une matrice de vecteurs propres (chaque colonne est un vecteur propre) et est une matrice diagonale avec des valeurs propres dans l'ordre décroissant sur la diagonale. Les vecteurs propres sont appelés axes principaux ou directions principales des données. Les projections des données sur les axes principaux sont appelées composantes principales , également appelées scores PC.C C = XX / ( n - 1 ) C = V L V , V L λ i j j X V i i X Vp×pCC=XX/(n1)

C=VLV,
VLλi; celles-ci peuvent être considérées comme de nouvelles variables transformées. La ième composante principale est donnée par la ième colonne de . Les coordonnées du ième point de données dans le nouvel espace PC sont données par la ième ligne de .jjXViiXV

Si nous effectuons maintenant une décomposition en valeurs singulières de , nous obtenons une décomposition où est une matrice unitaire et est la matrice diagonale de valeurs singulières . A partir de là, on peut facilement voir que ce qui signifie que les vecteurs singuliers droits sont les directions principales et que les valeurs singulières sont liées aux valeurs propres de la matrice de covariance viaX = U S V , UX

X=USV,
Us i C = V S UU S V/ ( n - 1 ) = V S 2SsiVλi=
C=VSUUSV/(n1)=VS2n1V,
VX V = U S VV = U Sλi=si2/(n1) . Les composantes principales sont données parXV=USVV=US .

Résumer:

  1. Si , les colonnes de sont des directions / axes principaux.X=USVV
  2. Les colonnes de sont des composantes principales ("scores").US
  3. Les valeurs singulières sont liées aux valeurs propres de la matrice de covariance via . Les valeurs propres montrent les variances des PC respectifs.λi=si2/(n1)λi
  4. Les scores standardisés sont donnés par les colonnes de et les chargements par les colonnes de . Voir par exemple ici et ici pour savoir pourquoi les "charges" ne doivent pas être confondues avec les directions principales.n1UVS/n1
  5. Ce qui précède n'est correct que si est centré. XAlors seulement, la matrice de covariance est-elle égale à .XX/(n1)
  6. Ce qui précède n’est correct que pour ayant des échantillons en lignes et des variables en colonnes. Si les variables sont dans les lignes et les échantillons dans les colonnes, alors et échangent leurs interprétations.XUV
  7. Si l'on veut effectuer une ACP sur une matrice de corrélation (au lieu d'une matrice de covariance), alors les colonnes de doivent non seulement être centrées, mais également normalisées, c'est-à-dire divisées par leurs écarts types.X
  8. Afin de réduire les dimensions des données à partir de à , sélectionner premières colonnes de , et la partie supérieure gauche de . Leur produit est la matrice requise contenant les premiers PC.k < ppk<pkUk×kSUkSkn×kk
  9. En outre multiplier les premiers ordinateurs par les axes principaux correspondant rendements matrice qui a l'original taille mais est de rang inférieur (de rang ). Cette matrice fournit une reconstruction des données originales des premiers PC. C'est l'erreur de reconstruction la plus faible possible, voir ma réponse ici .V k X k = U k S kkVkXk=UkSkVkn×pkXkk
  10. A proprement parler, est de taille et de taille . Cependant, si alors les dernières colonnes de sont arbitraires (et les lignes correspondantes de sont égales à zéro); il faut donc utiliser un SVD de taille économique (ou mince ) qui retourne de size, en supprimant les colonnes inutiles. Pour large, la matrice serait sinon inutilement énorme. Il en va de même pour une situation opposée deUn×nVp×pn>pnpUSUn×pnpUnp.

Autres liens

Rotation de l'animation PCA

amibe
la source
5
@Antoine, la matrice de covariance est par définition égale à , où les parenthèses indiquent la valeur moyenne . Si tous sont empilés sous forme de lignes dans une matrice , cette expression est égale à . Si est centré, alors cela se simplifie en . Pensez à la variance; c'est égal à . Mais si (c'est-à-dire que les données sont centrées), c'est simplement la valeur moyenne de .(xix¯)(xix¯)xiX(XX¯)(XX¯)/(n1)XXX/(n1)(xix¯)2x¯=0xi2
amibe
2
Un exemple de code pour PCA de SVD: stackoverflow.com/questions/3181593/…
optimist
1
Amibe, j'ai pris la responsabilité d'ajouter un lien supplémentaire en ligne avec les liens que vous avez fournis. J'espère que vous le trouverez approprié.
mardi
2
@ amoeba oui, mais pourquoi l'utiliser? Aussi, est-il possible d'utiliser le même dénominateur pour ? Le problème est que je vois des formules où et essaie de comprendre comment les utiliser? Sλi=si2
Dims
1
@sera Il suffit de transposer votre matrice et de vous débarrasser de votre problème. Sinon, vous ne pourrez que vous embrouiller.
amibe
22

J'ai écrit un extrait de Python & Numpy qui accompagne la réponse de @ amoeba et je le laisse ici au cas où il serait utile à quelqu'un. Les commentaires sont principalement tirés de la réponse de @ amoeba.

import numpy as np
from numpy import linalg as la
np.random.seed(42)


def flip_signs(A, B):
    """
    utility function for resolving the sign ambiguity in SVD
    http://stats.stackexchange.com/q/34396/115202
    """
    signs = np.sign(A) * np.sign(B)
    return A, B * signs


# Let the data matrix X be of n x p size,
# where n is the number of samples and p is the number of variables
n, p = 5, 3
X = np.random.rand(n, p)
# Let us assume that it is centered
X -= np.mean(X, axis=0)

# the p x p covariance matrix
C = np.cov(X, rowvar=False)
print "C = \n", C
# C is a symmetric matrix and so it can be diagonalized:
l, principal_axes = la.eig(C)
# sort results wrt. eigenvalues
idx = l.argsort()[::-1]
l, principal_axes = l[idx], principal_axes[:, idx]
# the eigenvalues in decreasing order
print "l = \n", l
# a matrix of eigenvectors (each column is an eigenvector)
print "V = \n", principal_axes
# projections of X on the principal axes are called principal components
principal_components = X.dot(principal_axes)
print "Y = \n", principal_components

# we now perform singular value decomposition of X
# "economy size" (or "thin") SVD
U, s, Vt = la.svd(X, full_matrices=False)
V = Vt.T
S = np.diag(s)

# 1) then columns of V are principal directions/axes.
assert np.allclose(*flip_signs(V, principal_axes))

# 2) columns of US are principal components
assert np.allclose(*flip_signs(U.dot(S), principal_components))

# 3) singular values are related to the eigenvalues of covariance matrix
assert np.allclose((s ** 2) / (n - 1), l)

# 8) dimensionality reduction
k = 2
PC_k = principal_components[:, 0:k]
US_k = U[:, 0:k].dot(S[0:k, 0:k])
assert np.allclose(*flip_signs(PC_k, US_k))

# 10) we used "economy size" (or "thin") SVD
assert U.shape == (n, p)
assert S.shape == (p, p)
assert V.shape == (p, p)
utilisateur115202
la source
21

Permettez-moi de commencer par PCA. Supposons que vous avez n points de données composés de d nombres (ou dimensions) chacun. Si vous centrez ces données (soustrayez le point de données moyen de chaque vecteur de données ), vous pouvez empiler les données pour créer une matrice.μxi

X=(x1TμTx2TμTxnTμT).

La matrice de covariance

S=1n1i=1n(xiμ)(xiμ)T=1n1XTX

mesures dans quelle mesure les différentes coordonnées dans lesquelles vos données sont données varient ensemble. Il n’est donc peut-être pas surprenant que l’ACP - conçue pour capturer la variation de vos données - puisse être donnée en termes de matrice de covariance. En particulier, la décomposition en valeurs propres de s’avère êtreS

S=VΛVT=i=1rλiviviT,

où est la ième composante principale , ou PC, et est la ième valeur propre de et est égale à la variance des données le long du ième PC. Cette décomposition découle d'un théorème général en algèbre linéaire, et un travail doit être effectué pour motiver le relatino à l'APC.viiλiiSi

PCA d'un jeu de données gaussien généré de manière aléatoire

SVD est un moyen général de comprendre une matrice en termes d’espace colonne et rangée. (C'est un moyen de réécrire n'importe quelle matrice en termes d'autres matrices avec une relation intuitive à l'espace des lignes et des colonnes.) Par exemple, pour la matrice nous pouvons trouver les directions et dans le domaine et la plageA=(1201)uivi

SVD pour un exemple 2x2

Vous pouvez les trouver en considérant comment tant que transformation linéaire, transforme une sphère unité dans son domaine en une ellipse: les demi-axes principaux de l'ellipse alignés sur le et le sont leurs pré-images.ASuivi

Dans tous les cas, pour la matrice de données ci-dessus (en réalité, définissez simplement ), SVD nous permet d’écrireXA=X

X=i=1rσiuivjT,

où et sont des ensembles de vecteurs orthonormés.Une comparaison avec la décomposition en valeurs propres de révèle que les "vecteurs singuliers droits" sont égaux aux PC, les "vecteurs singuliers droits" sont{ v i } S v i{ui}{vi}Svi

ui=1(n1)λiXvi,

et les "valeurs singulières" sont liées à la matrice de données viaσi

σi2=(n1)λi.

Il est un fait général que les vecteurs singuliers couvrent l'espace des colonnes de . Dans ce cas particulier, nous donne une projection échelonnée des données sur la direction de la ième composante principale. Les vecteurs singuliers de gauche couvrent en général l’espace de rangée de , ce qui nous donne un ensemble de vecteurs orthonormés qui recouvrent les données de la même manière que les ordinateurs personnels. x u i x i v i xuiXuiXiviX

Je vais dans quelques détails plus et avantages de la relation entre PCA et SVD dans cet article plus long .

André P
la source
Merci pour ton anser Andre. Juste deux petites corrections: 1. Dans le dernier paragraphe, vous confondez gauche et droite. 2. Dans la formule (capitale) pour X, vous utilisez v_j au lieu de v_i.
Alon