PCA (Análisis de Componentes Principales) es el tema más interesante en QF. PCA está en el corazón del análisis de datos cuantitativos. Se utiliza en análisis factorial, cargas factoriales, para encontrar el componente principal de la estructura de tipos de interés para la derivación y fijación de precios de opciones, compresión de datos, eigenfaces (encontrar la mejor coincidencia de un conjunto de imágenes con una cara borrosa, por ejemplo), lo que sea. Por lo tanto, es importante entender los conceptos básicos porque ayudará a comprender los conceptos más avanzados en los cálculos de PCA.
Espero que la respuesta y el pensamiento detrás de la lógica sean atractivos y coincidan con los tuyos.
Hay muchas maneras de hacer esto. Estoy utilizando SVD, descomposición en valores propios, lo cual funcionará con la matriz A siendo positiva semidefinida. RMT es un campo relativamente nuevo. Para cubrir los conceptos básicos, este es un buen comienzo. Normalmente, la relación de vectores y valores propios se muestra como $$ A \text{v} = \lambda \text{v}$$ donde $\text{v}$ es vector propio y $\lambda$ es valor propio.
Una propiedad interesante del vector propio es que si lo multiplicas por un escalar, y lo multiplicas por A a la izquierda, encontrarás el vector reproducido en el lado derecho, con un factor k, con los mismos valores propios. (Ejercicio).
Cabe señalar que sería un error creer que los vectores propios son iguales a los componentes principales, sin embargo, están relacionados como se muestra a continuación.
Si tienes un conjunto de datos aleatorios X como se muestra a continuación, ¿cuál es el componente principal y cómo se relacionan los datos con la matriz A? Ejemplo numérico muestra el uso de MATLAB.
X = [269.8 38.9 50.5
272.4 39.5 50.0
270.0 38.9 50.5
272.0 39.3 50.2
269.8 38.9 50.5
269.8 38.9 50.5
268.2 38.6 50.2
268.2 38.6 50.8
267.0 38.2 51.1
267.8 38.4 51.0
273.6 39.6 50.0
271.2 39.1 50.4
269.8 38.9 50.5
270.0 38.9 50.5
270.0 38.9 50.5
];
[n m]=size(A)
n =
15
m =
3
Convirtamos X a puntuaciones z, podemos hacer B=zscore(X) o para mayor claridad B = (X - repmat(mean(X),[n 1])) ./ repmat(std(X),[n 1])
B =
-0.0971 -0.0178 0.0636
1.3591 1.5820 -1.5266
0.0149 -0.0178 0.0636
1.1351 1.0487 -0.8905
-0.0971 -0.0178 0.0636
-0.0971 -0.0178 0.0636
-0.9932 -0.8177 -0.8905
-0.9932 -0.8177 1.0178
-1.6653 -1.8842 1.9719
-1.2173 -1.3509 1.6539
2.0312 1.8486 -1.5266
0.6870 0.5155 -0.2544
-0.0971 -0.0178 0.0636
0.0149 -0.0178 0.0636
0.0149 -0.0178 0.0636
> cov(B)
ans =
1.0000 0.9902 -0.8433
0.9902 1.0000 -0.8831
-0.8433 -0.8831 1.0000
> corr(B)
ans =
1.0000 0.9902 -0.8433
0.9902 1.0000 -0.8831
-0.8433 -0.8831 1.0000
> corr(X)
ans =
1.0000 0.9902 -0.8433
0.9902 1.0000 -0.8831
-0.8433 -0.8831 1.0000
Una nota interesante: para datos estandarizados la media = 0, varianza = 1, $$A=cov(B)=corr(B)=corr(X)$$ Sin embargo, ten en cuenta que $$cov(B) <> cov(X)$$ Por lo tanto, ten cuidado con cómo calculas la matriz de covarianza.
Nota aquí que A usada al principio es la matriz de covarianza de la entrada estandarizada.
La descomposición de la matriz A o cov(B) nos da vectores propios V y valores propios D como se muestra a continuación.
[V D]=eig(cov(B))
V =
0.6505 0.4874 -0.5825
-0.7507 0.2963 -0.5904
-0.1152 0.8213 0.5587
D =
0.0066 0 0
0 0.1809 0
0 0 2.8125
Interesante notar que B'*B te da una matriz proporcional a cov(B).
B'*B
ans =
14.0000 13.8622 -11.8068
13.8622 14.0000 -12.3640
-11.8068 -12.3640 14.0000
Está desplazada por un factor de 14.
B'*B/14
ans =
1.0000 0.9902 -0.8433
0.9902 1.0000 -0.8831
-0.8433 -0.8831 1.0000
Dividiendo por 14 obtienes la matriz de covarianza, A o cov(B). ¿Por qué es así? Porque el estimador de covarianza se representa como: $$ \frac{1}{n-1} \sum_{i=1}^{n} (X_i- \overline{X}) {(X_i- \overline{X})}'$$ donde $ \overline{X}=0 $ obtenemos $$ Matriz de covarianza (estimador)=\frac{1}{n-1} B B' $$ Ese misterio está resuelto.
Nota que también se puede obtener la matriz A o cov(B) usando la Descomposición Espectral.
V*D*V'
ans =
1.0000 0.9902 -0.8433
0.9902 1.0000 -0.8831
-0.8433 -0.8831 1.0000
Los componentes principales se definen como puntuaciones en Matlab. Podemos obtener los componentes principales a partir de los valores propios.
> puntuacion=B*V
puntuacion =
-0.0571 -0.0003 0.1026
-0.1277 -0.1226 -2.5786
0.0157 0.0543 0.0373
0.0536 0.1326 -1.7779
-0.0571 -0.0003 0.1026
-0.0571 -0.0003 0.1026
0.0704 -1.4579 0.5637
-0.1495 0.1095 1.6299
0.1041 0.2496 3.1841
0.0319 0.3647 2.4306
0.1093 0.2840 -3.1275
0.0892 0.2787 -0.8467
-0.0571 -0.0003 0.1026
0.0157 0.0543 0.0373
0.0157 0.0543 0.0373
Arriba tenemos tres componentes principales. Nombremoslos de izquierda a derecha como PC1, PC2 y PC3. Si observas la última columna de los vectores propios verás
[-0.5825 -0.5904 0.5587]'
De la forma en que se obtiene la puntuación a partir de la multiplicación matricial entre B y V, puedes ver que PC3 consiste en -58,25% del primer factor (en B), -59,04% del segundo factor y 55,87% del tercer factor.
¿Cuál es el más dominante?
> var(puntuacion)
ans =
0.0066 0.1809 2.8125
El vector más a la derecha, PC3, explica la mayor parte de la varianza en los datos X. puedes hacer
varB=sort(var(puntuacion),'descend') varB =
2.8125 0.1809 0.0066
cumsum(varB) / sum(varB)
ans =
0.9375 0.9978 1.0000
Así que el componente principal dominante (PC3) explica el 94% de la varianza. Si estás buscando el componente principal que explica la varianza en los datos, entonces PCA funciona bien. Si estás utilizando PCA para datos que tienen otro contenido de información, entonces necesitas algo diferente. Además, la matriz de covarianza puede verse afectada por los valores atípicos, me parece interesante. ¿Y si estoy interesado solo en los valores atípicos? ¿Los valores atípicos podrían representar los Cisnes Negros?! Entonces quizás estés interesado en el PC menos importante. Puedes trazar las puntuaciones y ver cómo coinciden con los datos atípicos.
Una última cosa, ¿cómo recuperas los datos originales a partir de las puntuaciones o componentes principales? Como mostré anteriormente
> B = (X - repmat(mean(X),[n 1])) ./ repmat(std(X),[n 1])
así que
> X = (B .* repmat(std(X),[n 1]) + repmat(mean(X),[n 1])
Lo cual es realmente cómo obtenemos X a partir de B. ¿Y sobre la puntuación? Sabemos que la puntuación es B*V por lo que B=puntuación*V' porque entonces B=B*V*V' y V*V'=1 o matriz identidad. por lo tanto,
> X = (puntuacion*V' .* repmat(std(X),[n 1]) + repmat(mean(X),[n 1])
En forma de pseudoequación, PC: componente principal $$ datos \space originales = PC * vector\space propio' * std(X) + media $$
He respondido las siguientes preguntas en esto
- cómo obtener vectores propios, valores propios y PCA
- cómo relacionar vectores propios con los componentes de PCA
- determinar qué valores propios explican la mayor varianza
- cuánto contribuyen los factores al componente principal
- verificar nuevamente qué componente principal es dominante
- cómo recuperar los datos originales