ejemplo code matlab machine-learning pca

code - PCA en matlab seleccionando los mejores componentes



pca matlab code (3)

Quiero seleccionar los principales componentes principales N=10,000 de una matriz. Después de que se complete el pca, MATLAB debería devolver una matriz pxp , ¡pero no lo hace!

>> size(train_data) ans = 400 153600 >> [coefs,scores,variances] = pca(train_data); >> size(coefs) ans = 153600 399 >> size(scores) ans = 400 399 >> size(variances) ans = 399 1

Debería ser coefs:153600 x 153600 ? y scores:400 X 153600 ?

Cuando uso el siguiente código, me da un error de falta de memoria ::

>> [V D] = eig(cov(train_data)); Out of memory. Type HELP MEMORY for your options. Error in cov (line 96) xy = (xc'' * xc) / (m-1);

No entiendo por qué MATLAB devuelve una matriz dimensional menor. Debería devolver un error con pca: 153600 * 153600 * 8 bytes = 188 GB

Error con eigs:

>> eigs(cov(train_data)); Out of memory. Type HELP MEMORY for your options. Error in cov (line 96) xy = (xc'' * xc) / (m-1);


Prefacio

Creo que está siendo víctima del problema XY , ya que tratar de encontrar 153.600 dimensiones en sus datos es completamente no físico, pregunte sobre el problema (X) y no sobre la solución propuesta (Y) para obtener una respuesta significativa. Usaré esta publicación solo para decirle por qué PCA no es una buena opción en este caso. No puedo decirte qué resolverá tu problema, ya que no nos has dicho qué es eso.

Este es un problema matemáticamente poco sólido, como trataré de explicar aquí.

PCA

PCA es, como dijo el usuario3149915, una forma de reducir las dimensiones. Esto significa que en algún lugar de tu problema tienes ciento cincuenta y tres mil seiscientos dimensiones flotando. Eso es mucho. Un montón de mucho. Explicar una razón física para la existencia de todos ellos podría ser un problema mayor que tratar de resolver el problema matemático.

Intentar ajustar tantas dimensiones a solo 400 observaciones no funcionará, ya que incluso si todas las observaciones son vectores lineales independientes en su espacio de características, aún puede extraer solo 399 dimensiones, ya que el resto simplemente no se puede encontrar ya que no hay observaciones. Como máximo puede ajustar dimensiones únicas de N-1 a través de N puntos, las otras dimensiones tienen un número infinito de posibilidades de ubicación. Como tratar de ajustar un plano a través de dos puntos: hay una línea que puede pasar a través de ellos y la tercera dimensión será perpendicular a esa línea, pero indefinida en la dirección de rotación. Por lo tanto, te queda un número infinito de planos posibles que se ajustan a través de esos dos puntos.

No creo que esté tratando de ajustar el "ruido" después de los primeros 400 componentes, creo que está ajustando un vacío después de eso. Usó todos sus datos para obtener las dimensiones y no puede crear más dimensiones . Imposible. Todo lo que puede hacer es obtener más observaciones, alrededor de 1.5M, y hacer el PCA nuevamente.

Más observaciones que dimensiones

¿Por qué necesitas más observaciones que dimensiones? usted puede preguntar Fácil, no puede ajustar una línea única a través de un punto, ni un plano único a través de dos puntos, ni un hiperplano dimensional 153.600 único a través de 400 puntos.

Entonces, si obtengo 153.600 observaciones, ¿estoy listo?

Tristemente no. Si tiene dos puntos y ajusta una línea a través de él, obtendrá un ajuste del 100%. No hay error, jay! Hecho por el día, ¡vamos a casa a ver televisión! Lamentablemente, su jefe lo llamará a la mañana siguiente ya que su ajuste es basura. ¿Por qué? Bueno, si tuviera, por ejemplo, 20 puntos dispersos, el ajuste no estaría exento de errores, pero al menos estaría más cerca de representar sus datos reales, ya que los dos primeros podrían ser atípicos, vea esta figura muy ilustrativa, donde los puntos rojos serían sus dos primeras observaciones:

Si tuviera que extraer los primeros 10.000 componentes, serían 399 ajustes exactos y 9601 dimensiones cero. Es mejor que ni siquiera intente calcular más allá de la 399a dimensión, y pegarlo en una matriz cero con 10.000 entradas.

TL; DR No puede usar PCA y no podemos ayudarlo a resolver su problema siempre que no nos diga cuál es su problema.


Matlab intenta no desperdiciar demasiados recursos informándolo. Pero aún puede hacer lo que quiera, solo use:

pca(train_data,''Economy'',''off'')


PCA es un algoritmo de reducción de dimensiones, como tal, trata de reducir el número de características a componentes principales (PC) que representan una combinación lineal de las características totales. Todo esto se hace para reducir las dimensiones del espacio de características, es decir, transformar el espacio de características grande en uno que sea más manejable pero que aún conserve la mayoría, si no toda, la información.

Ahora, para su problema, está tratando de explicar la varianza entre sus 400 observaciones utilizando las funciones 153600, sin embargo, no necesitamos tanta información. 399 PC explicarán el 100% de la varianza en su muestra (me sorprendería mucho si eso no es el caso). La razón de esto es básicamente sobreajustar, su algoritmo encuentra ruido que explica cada observación en su muestra.

Entonces, lo que el rayryeng le estaba diciendo es correcto, si desea reducir su espacio de funciones a 10,000 PC, necesitará 100,000 observaciones para que las PC signifiquen algo (eso es una regla general pero bastante estable).

Y la razón por la que matlab le estaba dando 399 PC porque pudo extraer correctamente 399 combinaciones lineales que explicaban un #% de la varianza en su muestra.

Si, por otro lado, lo que busca son las características más relevantes, entonces no está buscando flujos de reducción dimensional, sino procesos de eliminación de características. Estos mantendrán solo la característica más relevante y anularán las irrelevantes.

Entonces, para dejar en claro, si su espacio de características es basura y no hay información allí solo ruido, la variación explicada será irrelevante y, de hecho, será inferior al 100%, por ejemplo, consulte lo siguiente

data = rand(400,401); [coefs,scores,variances] = pca(data); numel(variances) disp(''Var explained '' num2str(cumsum(variances)) ''%''])

Nuevamente, si desea reducir el espacio de sus funciones, hay formas de hacerlo incluso con una m pequeña, pero PCA no es una de ellas.

Buena suerte