Pregunta

He implementado el algoritmo PCA y lo entendí muy bien, pero aún así tengo algunas preguntas. Mi código está debajo y es una implementación muy simple.

import numpy as np

x = np.loadtxt('CCPP', delimiter=',')
row, column = x.shape

# Mean normalization
for i in range(column):
    x[:,i] = (x[:,i] - x[:,i].mean()) / (x[:,i].max() - x[:,i].min())

sigma = x.transpose().dot(x) / row
u, s, v = np.linalg.svd(sigma, 0)
z = x.dot(u[:,:3]) ## new features

new_x = z.dot(u[:,:3].transpose()) ##reconstruction

Primera pregunta

Como puede ver arriba, mi variable Sigma es

X.Transpose (). Dot (x) / fila

Me está dando una matriz NXN (n es el número de características). Pero la fórmula de Sigma es $$ sigma = frac {1} {n} sum_ {i = 1}^nx^{(i)} {x^{i)}}^t $$

¿Por qué hay un símbolo de suma en fórmula? Quiero decir, si uso esta formulación Sigma, Sigma será un número, no una matriz. Tengo que conseguir NXN Matrix, ¿verdad? Entonces, ¿es correcta mi implementación de Sigma? ¿O me estoy perdiendo algo sobre la fórmula?

Segunda pregunta

Cuando estamos reconstruyendo x (en la parte inferior del código), ¿debería New_x igual a mi primera x? Quiero decir, reducí la dimensión del conjunto de datos, luego lo reconstruí, el conjunto de datos original y el conjunto de datos reconstruidos deben ser el mismo, ¿verdad? Esta es mi segunda pregunta.

Tercera pregunta

Este es fácil. ¿Debo usar la compresión de datos para cada uno de mi conjunto de datos que tiene 1000, 100000 o más funciones? Quiero decir, ¿puedo usarlo siempre? ¿Es una buena opción usarlo cada vez?

¿Fue útil?

Solución

Con respecto a la primera pregunta.

En la fórmula anterior, si no me equivoco, X es una matriz de elementos. Entonces, lo que la fórmula quiere de usted es sumar todos los productos de puntos de cada línea con su transposición. Esto te dará escalar.

x = np.array([1, 2, 3, 4])
res = x.dot(x.transpose())
# res = 30

Entonces mi sugerencia sería cambiar esa línea de código a:

for i in range(row):
    sigma += x[i].transpose().dot(x[i])
sigma = sigma/row

Segunda pregunta

Debido a que redujo la dimensionalidad, la matriz x_new no será la misma.

Tercera pregunta

Cuándo usar el PCA es una cosa del problema de dominio. El punto de reducción de dimensionalidad es obtener un nuevo conjunto de datos, que no será tan difícil de procesar, pero perderá cierta información. Entonces, si usted es su "resultado"/"tiempo para procesar" es bueno, no creo que deba usarlo.

Otros consejos

Primera pregunta: Computación $ Sigma $

En realidad, realiza el mismo cálculo pero utiliza una operación de matriz en lugar de una operación escalar. Puede ser engañado por su notación de la matriz de características $ x $ que escribe $ x $ porque de hecho $$ x = (x_j^{(i)}) _ {i, j} = big (x^{(((( 1)} ... x^{(i)} ... x^{(n)} big)^t $$ Es decir, $ i $ -th fila de la matriz $ x $ contiene $ x ^{(i)} $ la muestra $ i $ -th.

Entonces, cuando desea calcular la matriz de covarianza empírica $ sigma $ (que de hecho es $ n times n $ matrix), tiene: $$ sigma = frac {1} {n} sum_ {i = 1}^nx^{(i)} {x^{(i)}}^t = frac {1} {n} x^tx $$ Puede verificar que este es exactamente el mismo cálculo.

En su código, en realidad está calculando directamente $ Sigma $ usando la operación de matriz (es decir, $ sigma = frac {1} {n} x^tx $) y esto le da un $ n times n $ matrix. Entonces, tanto su implementación como la fórmula es correcta.

Segunda pregunta: Reconstruir $ x $

Su nueva función Matrix $ Z $ es A $ N Times 3 $ Matrix según su código. De hecho, como su código no muestra el tamaño original del espacio de funciones, veremos los dos casos aquí:

  1. $ X $ también es un $ n times 3 $ matrix, entonces no realiza ningún tipo de reducción de dimensiones y debe tener $ x_ {nuevo} = x $ (al menos en teoría, en la práctica puede tener un pequeño pequeño Error de aproximación numérica, pero básicamente será el mismo)
  2. $ X $ es un $ n times d $ matrix con $ d> 3 $, luego realiza una reducción de dimensiones y, en este caso, elimina la información contenida en los datos originales y, en este caso, $ x_ {new} neq x $

En su caso, supongo que tiene $ D> 3 $ y, por lo tanto, está en la segunda situación.

Tercera pregunta: cuándo aplicar PCA

Bueno, eso depende de hecho ...

En primer lugar, PCA realiza un SVD que puede volverse muy costoso si tiene muchas características. De hecho, hay varias formas de calcular PCA, su camino está más cerca de la teoría matemática, pero en la práctica calcular un SVD directamente en $ x $ evita calcular $ x^tx $, que es costoso y permite recuperar el mismo espacio. Pero en cualquier caso, en alguna situación, puede ser costoso y lento y, por lo tanto, no práctico.

Como PCA clasifica el nuevo espacio de características de acuerdo con el valor de los valores propios, es decir, la varianza de las nuevas direcciones, eliminar la última dirección podría en algunos casos eliminar algo de ruido que puede ayudar. Sin embargo, al mismo tiempo, puede descartar información discrimativa valiosa, es por eso que otros métodos como LDA pueden ser interesantes.

Entonces, para resumir, la respuesta a la pregunta es no, no es una buena opción usarla cada vez, depende de su problema.

Licenciado bajo: CC-BY-SA con atribución
scroll top