Relazione tra SVD e PCA. Come usare SVD per eseguire PCA?


352

L'analisi dei componenti principali (PCA) viene di solito spiegata tramite una decomposizione degli automi della matrice di covarianza. Tuttavia, può anche essere eseguita mediante decomposizione in valori singolari (SVD) della matrice dati . Come funziona? Qual è la connessione tra questi due approcci? Qual è la relazione tra SVD e PCA?X

O in altre parole, come utilizzare SVD della matrice di dati per eseguire la riduzione della dimensionalità?


8
Ho scritto questa domanda in stile FAQ insieme alla mia risposta, perché spesso viene posta in varie forme, ma non esiste un thread canonico e quindi è difficile chiudere i duplicati. Fornisci meta commenti in questo meta thread allegato .
ameba,


2
Oltre alla risposta un eccellente e dettagliata di amebe con i suoi ulteriori collegamenti potrei consigliare di controllare questo , dove PCA è considerato fianco a fianco alcune altre tecniche SVD-based. La discussione qui presenta un'algebra quasi identica a quella dell'ameba con una piccola differenza che il discorso lì, nel descrivere PCA, parla della decomposizione svd di [o ] invece di - che è semplicemente conveniente in quanto si riferisce alla PCA effettuata tramite la composizione elettronica della matrice di covarianza. X/X/n XX/n1X
ttnphns,

PCA è un caso speciale di SVD. PCA ha bisogno di dati normalizzati, idealmente stessa unità. La matrice è nxn in PCA.
Orvar Korvar,

@OrvarKorvar: Di quale matrice nxn stai parlando?
Cbhihe,

Risposte:


412

Lascia che la matrice di dati abbia dimensioni , dove è il numero di campioni e è il numero di variabili. Supponiamo che sia centrato , cioè che le medie delle colonne siano state sottratte e siano ora uguali a zero. n × p n pXn×pnp

Quindi la matrice di covarianza è data da . È una matrice simmetrica e quindi può essere diagonale: dove è una matrice di autovettori (ogni colonna è un autovettore) e è una matrice diagonale con autovalori in ordine decrescente sulla diagonale. Gli autovettori sono chiamati assi principali o direzioni principali dei dati. Le proiezioni dei dati sugli assi principali sono chiamate componenti principali , note anche come punteggi PCC 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; questi possono essere visti come variabili nuove, trasformate. Il componente principale -th è dato dalla colonna -th di . Le coordinate -esimo punto dati nel nuovo spazio del PC sono fornite dalla -esima riga di .jjXViiXV

Se ora eseguiamo una scomposizione del valore singolare di , otteniamo una decomposizione dove è una matrice unitaria e è la matrice diagonale di valori singolari . Da qui si può facilmente vedere che il che significa che i vettori singolari giusti sono direzioni principali e che i valori singolari sono correlati agli autovalori della matrice di covarianza tramite . I componenti principali sono dati daX = U S V , U S s i C = V S UU S V/ ( n - 1 ) = V S 2X

X=USV,
USsiVλi=s 2 i /(n-1)XV=USVV=US
C=VSUUSV/(n1)=VS2n1V,
Vλi=si2/(n1)XV=USVV=US .

Riassumere:

  1. Se , le colonne di sono le direzioni / gli assi principali.X=USVV
  2. Le colonne di sono componenti principali ("punteggi").US
  3. I valori singolari sono correlati agli autovalori della matrice di covarianza tramite . Gli autovalori mostrano le varianze dei rispettivi PC.λi=si2/(n1)λi
  4. I punteggi standardizzati sono dati dalle colonne di e i caricamenti sono dati dalle colonne di . Vedere ad es. Qui e qui il motivo per cui i "caricamenti" non devono essere confusi con le direzioni principali.n1UVS/n1
  5. Quanto sopra è corretto solo se è centrato. XSolo allora la matrice di covarianza è uguale a .XX/(n1)
  6. Quanto sopra è corretto solo per con campioni in righe e variabili in colonne. Se le variabili sono in righe e campioni in colonne, allora e scambiano interpretazioni.XUV
  7. Se si desidera eseguire PCA su una matrice di correlazione (anziché su una matrice di covarianza), le colonne di non dovrebbero solo essere centrate, ma anche standardizzate, cioè divise per le loro deviazioni standard.X
  8. Per ridurre la dimensionalità dei dati da a , selezionare prime colonne di , e parte superiore sinistra di . Il loro prodotto è la matrice contenente i primi PC.pk<pkUk×kSUkSkn×kk
  9. Moltiplicando ulteriormente i primi PC per gli assi principali corrispondenti rese matrice che ha l'originale dimensione di ma è di rango inferiore (di rango ). Questa matrice fornisce una ricostruzione dei dati originali dai primi PC. Ha l'errore di ricostruzione più basso possibile, vedi la mia risposta qui .kVkXk=UkSkVkn×pkXkk
  10. Strettamente parlando, è di dimensioni e è di dimensioni. Tuttavia, se le ultime colonne di sono arbitrarie (e le righe corrispondenti di sono costanti zero); si dovrebbe quindi usare un SVD di dimensione economica (o sottile ) che restituisce di dimensioni, lasciando cadere le colonne inutili. Per grandi dimensioni la matrice sarebbe altrimenti inutilmente enorme. Lo stesso vale per una situazione opposta diUn×nVp×pn>pnpUSUn×pnpUnp.

Ulteriori collegamenti

Animazione PCA rotante


5
@Antoine, la matrice di covarianza è per definizione uguale a , dove le parentesi angolari indicano il valore medio . Se tutti i sono impilati come righe in una matrice , allora questa espressione è uguale a . Se è centrato, si semplifica in . Pensa alla varianza; è uguale a . Ma se (ovvero i dati sono centrati), allora è semplicemente il valore medio di .(xix¯)(xix¯)xiX(XX¯)(XX¯)/(n1)XXX/(n1)(xix¯)2x¯=0xi2
amoeba,

2
Un esempio di codice per PCA di SVD: stackoverflow.com/questions/3181593/…
ottimista

1
Amoeba, mi sono preso la responsabilità di aggiungere un altro link in linea con i link forniti dall'utente. Spero lo trovi appropriato.
ttnphns,

2
@amoeba sì, ma perché usarlo? Inoltre, è possibile utilizzare lo stesso denominatore per ? Il problema è che vedo le formule in cui e cerco di capire come usarle? Sλi=si2
Dims

1
@sera Trasponi la tua matrice e sbarazzati del tuo problema. Altrimenti verrai confuso.
amoeba,

22

Ho scritto uno snippet Python & Numpy che accompagna la risposta di @ amoeba e lo lascio qui nel caso sia utile per qualcuno. I commenti sono per lo più presi dalla risposta di @ 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)

21

Vorrei iniziare con PCA. Supponiamo di avere n punti dati composti da d numeri (o dimensioni) ciascuno. Se si centrano questi dati (sottraendo il punto di dati medio da ciascun vettore di dati ) è possibile impilare i dati per creare una matriceμxi

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

La matrice di covarianza

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

misure a che livello le diverse coordinate in cui vengono forniti i tuoi dati variano insieme. Quindi, forse non sorprende che PCA - che è progettato per catturare la variazione dei tuoi dati - possa essere dato in termini di matrice di covarianza. In particolare, la decomposizione degli autovalori di risulta essereS

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

dove è l' -esimo componente principale , o PC, e è l' -esimo valore di ed è anche uguale alla varianza dei dati lungo l' -esimo PC. Questa decomposizione proviene da un teorema generale dell'algebra lineare e si deve fare del lavoro per motivare il relatino alla PCA.viiλiiSi

PCA di un set di dati gaussiano generato casualmente

SVD è un modo generale per comprendere una matrice in termini di spazio colonna e spazio riga. (È un modo per riscrivere qualsiasi matrice in termini di altre matrici con una relazione intuitiva con lo spazio di riga e colonna.) Ad esempio, per la matrice possiamo trovare le indicazioni e nel dominio e spaziare in modo taleA=(1201)uivi

SVD per un esempio 2x2

Puoi trovarli considerando come come trasformazione lineare trasforma una sfera unitaria nel suo dominio in un'ellisse: i semiassi principali dell'ellisse si allineano con e sono le loro preimmagini.ASuivi

In ogni caso, per la matrice di dati sopra (davvero, basta impostare ), SVD ci permette di scrivereXA=X

X=i=1rσiuivjT,

dove e sono insiemi di vettori ortonormali. Un confronto con la decomposizione degli autovalori di rivela che i "vettori singolari giusti" sono uguali ai PC, i "vettori singolari giusti" sono{ v i } S v i{ui}{vi}Svi

ui=1(n1)λiXvi,

e i "valori singolari" sono correlati alla matrice di dati tramiteσi

σi2=(n1)λi.

E 'un fatto generale che i vettori singolari giusti coprono lo spazio di colonna di . In questo caso specifico, ci fornisce una proiezione in scala dei dati sulla direzione -componente principale. I vettori singolari di sinistra in generale si estendono nello spazio di riga di , il che ci fornisce un insieme di vettori ortogonali che coprono i dati in modo molto simile ai PC. X u i X i v i XuiXuiXiviX

Vado in ulteriori dettagli e vantaggi della relazione tra PCA e SVD in questo articolo più lungo .


Grazie per la tua risposta Andre. Solo due piccole correzioni di errori di battitura: 1. Nell'ultimo paragrafo stai confondendo sinistra e destra. 2. Nella formula (maiuscola) per X, stai usando v_j invece di v_i.
Alon,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.