627 votos

Relación entre SVD y PCA. Cómo utilizar la SVD para realizar el PCA?

El análisis de componentes principales (ACP) suele explicarse mediante una descomposición propia de la matriz de covarianza. Sin embargo, también puede realizarse mediante la descomposición del valor singular (SVD) de la matriz de datos $\mathbf X$ . ¿Cómo funciona? ¿Cuál es la relación entre estos dos enfoques? ¿Cuál es la relación entre SVD y PCA?

O, en otras palabras, ¿cómo utilizar la SVD de la matriz de datos para realizar la reducción de la dimensionalidad?

14 votos

Escribí esta pregunta tipo FAQ junto con mi propia respuesta, porque se está preguntando con frecuencia en varias formas, pero no hay un hilo canónico y así cerrar los duplicados es difícil. Por favor, proporcione meta comentarios en este hilo meta que lo acompaña .

3 votos

2 votos

Además de una excelente y detallada respuesta de la ameba con sus enlaces adicionales podría recomendar para comprobar este donde el PCA se considera junto a otras técnicas basadas en el SVD. La discusión allí presenta un álgebra casi idéntica a la de ameba con la única diferencia de que el discurso allí, al describir PCA, va sobre la descomposición SVD de $\mathbf X/\sqrt{n}$ [o $\mathbf X/\sqrt{n-1}$ ] en lugar de $\bf X$ - que es simplemente conveniente ya que se relaciona con el PCA realizado a través de la eigendecomposición de la matriz de covarianza.

764voto

zowens Puntos 1417

Que la matriz de datos $\mathbf X$ ser de $n \times p$ tamaño, donde $n$ es el número de muestras y $p$ es el número de variables. Supongamos que es centrado es decir, las medias de las columnas se han restado y ahora son iguales a cero.

Entonces el $p \times p$ matriz de covarianza $\mathbf C$ viene dada por $\mathbf C = \mathbf X^\top \mathbf X/(n-1)$ . Es una matriz simétrica y, por tanto, se puede diagonalizar: $$\mathbf C = \mathbf V \mathbf L \mathbf V^\top,$$ donde $\mathbf V$ es una matriz de vectores propios (cada columna es un vector propio) y $\mathbf L$ es una matriz diagonal con valores propios $\lambda_i$ en el orden decreciente de la diagonal. Los vectores propios se denominan ejes principales o direcciones principales de los datos. Las proyecciones de los datos sobre los ejes principales se denominan componentes principales , también conocido como Puntuaciones de PC ; estos pueden ser vistos como nuevas variables transformadas. La página web $j$ -El componente principal número uno viene dado por $j$ -en la columna de $\mathbf {XV}$ . Las coordenadas del $i$ -en el nuevo espacio de PC vienen dadas por el $i$ -en la fila de $\mathbf{XV}$ .

Si ahora realizamos la descomposición del valor singular de $\mathbf X$ obtenemos una descomposición $$\mathbf X = \mathbf U \mathbf S \mathbf V^\top,$$ donde $\mathbf U$ es una matriz unitaria y $\mathbf S$ es la matriz diagonal de valores singulares $s_i$ . Desde aquí se puede ver fácilmente que $$\mathbf C = \mathbf V \mathbf S \mathbf U^\top \mathbf U \mathbf S \mathbf V^\top /(n-1) = \mathbf V \frac{\mathbf S^2}{n-1}\mathbf V^\top,$$ lo que significa que los vectores singulares derechos $\mathbf V$ son direcciones principales y que los valores singulares están relacionados con los valores propios de la matriz de covarianza mediante $\lambda_i = s_i^2/(n-1)$ . Los componentes principales vienen dados por $\mathbf X \mathbf V = \mathbf U \mathbf S \mathbf V^\top \mathbf V = \mathbf U \mathbf S$ .

Para resumir:

  1. Si $\mathbf X = \mathbf U \mathbf S \mathbf V^\top$ , entonces las columnas de $\mathbf V$ son direcciones/ejes principales.
  2. Columnas de $\mathbf {US}$ son componentes principales ("puntuaciones").
  3. Los valores singulares están relacionados con los valores propios de la matriz de covarianza mediante $\lambda_i = s_i^2/(n-1)$ . Valores propios $\lambda_i$ muestran las varianzas de los respectivos PC.
  4. Las puntuaciones estandarizadas vienen dadas por columnas de $\sqrt{n-1}\mathbf U$ y las cargas vienen dadas por las columnas de $\mathbf V \mathbf S/\sqrt{n-1}$ . Véase, por ejemplo aquí y aquí por qué no hay que confundir las "cargas" con las direcciones principales.
  5. Lo anterior es correcto sólo si $\mathbf X$ está centrado. Sólo entonces la matriz de covarianza es igual a $\mathbf X^\top \mathbf X/(n-1)$ .
  6. Lo anterior es correcto sólo para $\mathbf X$ teniendo las muestras en filas y las variables en columnas. Si las variables están en filas y las muestras en columnas, entonces $\mathbf U$ y $\mathbf V$ interpretaciones de intercambio.
  7. Si se quiere realizar el PCA sobre una matriz de correlación (en lugar de una matriz de covarianza), entonces las columnas de $\mathbf X$ no sólo deben estar centrados, sino también estandarizados, es decir, divididos por sus desviaciones estándar.
  8. Para reducir la dimensionalidad de los datos de $p$ a $k<p$ , seleccione $k$ primeras columnas de $\mathbf U$ y $k\times k$ parte superior izquierda de $\mathbf S$ . Su producto $\mathbf U_k \mathbf S_k$ es el requerido $n \times k$ matriz que contiene primero $k$ PCs.
  9. Multiplicando además la primera $k$ PC por los ejes principales correspondientes $\mathbf V_k^\top$ produce $\mathbf X_k = \mathbf U_k^\vphantom \top \mathbf S_k^\vphantom \top \mathbf V_k^\top$ matriz que tiene el original $n \times p$ tamaño pero es de menor rango (de rango $k$ ). Esta matriz $\mathbf X_k$ proporciona una reconstrucción de los datos originales de la primera $k$ PCs. Tiene el menor error de reconstrucción posible, ver mi respuesta aquí .
  10. Estrictamente hablando, $\mathbf U$ es de $n\times n$ tamaño y $\mathbf V$ es de $p \times p$ tamaño. Sin embargo, si $n>p$ entonces el último $n-p$ columnas de $\mathbf U$ son arbitrarios (y las filas correspondientes de $\mathbf S$ son constantes cero); por lo tanto, hay que utilizar un tamaño económico (o fino ) SVD que devuelve $\mathbf U$ de $n\times p$ tamaño, eliminando las columnas inútiles. Para los grandes $n\gg p$ la matriz $\mathbf U$ sería innecesariamente enorme. Lo mismo se aplica para una situación opuesta de $n\ll p$ .

Otros enlaces

Rotating PCA animation

4 votos

+1 para ambos Q&A. Gracias por compartirlas. Tengo una pregunta: ¿por qué hay que asumir que la matriz de datos está centrada inicialmente?

0 votos

Después de leer tu punto de resumen #5, replanteo mi pregunta como: ¿por qué la matriz de covarianza es igual a esta cantidad sólo si la matriz de datos está centrada inicialmente?

21 votos

@Antoine, la matriz de covarianza es por definición igual a $\langle (\mathbf x_i - \bar{\mathbf x})(\mathbf x_i - \bar{\mathbf x})^\top \rangle$ donde los paréntesis angulares denotan el valor medio. Si todos los $\mathbf x_i$ se apilan como filas en una matriz $\mathbf X$ entonces esta expresión es igual a $(\mathbf X - \bar{\mathbf X})(\mathbf X - \bar{\mathbf X})^\top/(n-1)$ . Si $\mathbf X$ está centrado entonces se simplifica a $\mathbf X \mathbf X^\top/(n-1)$ . Piensa en la varianza; es igual a $\langle (x_i-\bar x)^2 \rangle$ . Pero si $\bar x=0$ (es decir, los datos están centrados), entonces es simplemente el valor medio de $x_i^2$ .

44voto

Benno Puntos 1062

Escribí un snippet de Python y Numpy que acompaña la respuesta de @amoeba y lo dejo aquí por si le sirve a alguien. Los comentarios están tomados en su mayoría de la respuesta 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)

0 votos

¿El código está escrito en Python 2? Si es así, creo que se puede añadir una versión de Python 3 a la respuesta.

0 votos

Por cierto, aquí hay una versión de Jupyter: davidvandebunte.gitlab.io/executable-notes/notes/se/

34voto

rocklobster Puntos 38

Permítanme comenzar con el PCA. Supongamos que tenemos n puntos de datos compuestos por d números (o dimensiones) cada uno. Si se centran estos datos (se resta el punto de datos medio $\mu$ de cada vector de datos $x_i$ ) puedes apilar los datos para hacer una matriz

$$ X = \left( \begin{array}{ccccc} && x_1^T - \mu^T && \\ \hline && x_2^T - \mu^T && \\ \hline && \vdots && \\ \hline && x_n^T - \mu^T && \end{array} \right)\,. $$

La matriz de covarianza

$$ S = \frac{1}{n-1} \sum_{i=1}^n (x_i-\mu)(x_i-\mu)^T = \frac{1}{n-1} X^T X $$

mide hasta qué punto las diferentes coordenadas en las que se dan los datos varían conjuntamente. Así que quizá no sea sorprendente que el ACP, que está diseñado para captar la variación de los datos, pueda darse en términos de la matriz de covarianza. En particular, la descomposición de valores propios de $S$ resulta ser

$$ S = V \Lambda V^T = \sum_{i = 1}^r \lambda_i v_i v_i^T \,, $$

donde $v_i$ es el $i$ -a Componente principal o PC, y $\lambda_i$ es el $i$ -valor propio de $S$ y también es igual a la varianza de los datos a lo largo del $i$ -Cuarto PC. Esta descomposición proviene de un teorema general del álgebra lineal, y de algunos trabajos hace que hay que hacer para motivar al relatino a la PCA.

PCA of a Randomly Generated Gaussian Dataset

La SVD es una forma general de entender una matriz en términos de su espacio de columnas y espacio de filas. (Es una forma de reescribir cualquier matriz en términos de otras matrices con una relación intuitiva con el espacio de filas y columnas). Por ejemplo, para la matriz $A = \left( \begin{array}{cc}1&2\\0&1\end{array} \right)$ podemos encontrar direcciones $u_i$ y $v_i$ en el dominio y el rango para que

SVD for a 2x2 example

Puede encontrarlos teniendo en cuenta cómo $A$ como una transformación lineal transforma una esfera unitaria $\mathbb S$ en su dominio a una elipse: los semiejes principales de la elipse se alinean con el $u_i$ y el $v_i$ son sus preimágenes.

En cualquier caso, para la matriz de datos $X$ arriba (en realidad, sólo hay que poner $A = X$ ), la SVD nos permite escribir

$$ X = \sum_{i=1}^r \sigma_i u_i v_j^T\,, $$

donde $\{ u_i \}$ y $\{ v_i \}$ son conjuntos ortonormales de vectores.Una comparación con la descomposición de valores propios de $S$ revela que los "vectores singulares derechos" $v_i$ son iguales a los PC, los "vectores singulares derechos" son

$$ u_i = \frac{1}{\sqrt{(n-1)\lambda_i}} Xv_i\,, $$

y los "valores singulares" $\sigma_i$ se relacionan con la matriz de datos a través de

$$ \sigma_i^2 = (n-1) \lambda_i\,. $$

Es un hecho general que los vectores singulares de la derecha $u_i$ abarcan el espacio de las columnas de $X$ . En este caso concreto, $u_i$ nos dan una proyección a escala de los datos $X$ en la dirección del $i$ -ésima componente principal. Los vectores singulares de la izquierda $v_i$ en general abarcan el espacio de filas de $X$ , lo que nos da un conjunto de vectores ortonormales que abarcan los datos de forma parecida a los PC.

Me refiero a algunos detalles más y a los beneficios de la relación entre PCA y SVD en este artículo más largo .

0 votos

Gracias por tu respuesta Andre. Sólo dos pequeñas correcciones de errores: 1. En el último párrafo confundes izquierda y derecha. 2. En la fórmula (en mayúsculas) de X, estás usando v_j en lugar de v_i.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X