¿Cómo abordar la maldición de la dimensión en análisis de datos?
La maldición de la dimensión es un problema común en estadística que surge al incrementar las variables en un conjunto de datos. Si añadimos más dimensiones, necesitaremos exponencialmente más muestras para mantener la relevancia estadística. Por lo tanto, comprender cómo eliminar dimensiones innecesarias es crucial para mejorar el análisis de datos.
¿Cómo generar una muestra de datos en Python?
En primer lugar, es fundamental configurar y definir correctamente nuestras muestras de datos antes de realizar experimentos. Utilizamos librerías como numpy y matplotlib para este propósito. Aquí te mostramos cómo puedes hacerlo:
import numpy as np
import matplotlib.pyplot as plt
# Definimos la semilla para reproducir el experimentonp.random.seed(0)# Generamos números aleatoriosX =3* np.random.rand(200,1)y =20+20* X +2* np.random.rand(200,1)# Formateamos las matricesX = X.reshape((200,1))y = y.reshape((200,1))# Concatenamos los vectoresXY = np.hstack((X, y))# Visualizamos la dispersión de los puntosplt.scatter(XY[:,0], XY[:,1], marker='o', color='b')plt.xlabel('X')plt.ylabel('Y')plt.show()
Este código genera muestras y visualiza la correlación entre las variables.
¿Cómo transformar el sistema de referencia para reducir dimensiones?
El paso clave en la reducción de dimensiones es centrar los datos, lo que implica restar la media de los datos originales. Luego, usando las Componentes Principales (PCA), podemos identificar las direcciones de mayor varianza que permiten una representación más sencilla de los datos.
# Centramos los datosX_centered = X - np.mean(X, axis=0)Y_centered = y - np.mean(y, axis=0)# Recalculamos el producto internocov_matrix = np.dot(X_centered.T, X_centered)# Calculamos los autovalores y autovectoreseigenvalues, eigenvectors = np.linalg.eigh(cov_matrix)# Graficamos los autovectoresvector_colors =['r','b']plt.quiver(*np.mean(X_centered, axis=0),*eigenvectors[:,0], scale=eigenvalues[0], color=vector_colors[0])plt.quiver(*np.mean(y, axis=0),*eigenvectors[:,1], scale=eigenvalues[1], color=vector_colors[1])plt.show()
En este código se calcula y grafica la transformación resultante, mostrando cómo los autovectores definen la dirección de máxima varianza.
¿Cómo interpretar la proyección en el espacio reducido?
La proyección en un nuevo sistema de referencia revela mucho sobre la información subyacente en los datos. Si logramos reescribir nuestra nube de puntos en función de los autovectores, podemos reducir las dimensiones sin perder demasiada información.
# Proyectamos en el sistema de autovectoresX_transformed = np.dot(X_centered, eigenvectors)# Visualizamos la transformaciónplt.scatter(X_transformed[:,0], X_transformed[:,1], marker='o', c='g')plt.axhline(0, color='red', lw=2)plt.axvline(0, color='red', lw=2)plt.xlabel('PC 1')plt.ylabel('PC 2')plt.show()
Esta proyección nos permite reducir nuestras dimensiones, centrándonos en las variables que explican la mayor parte de la varianza.
Reflexiones finales sobre la reducción de dimensiones
Cuando se trabaja con conjuntos de datos extensos y variables interrelacionadas, la reducción de dimensiones, como la que se consigue mediante PCA, es esencial. Esto no solo mejora la eficiencia del análisis, sino que también facilita la interpretación de los resultados. Un enfoque cuidadoso y metodológico garantiza que mantengamos la esencia de los datos mientras eliminamos la redundancia innecesaria.
Si te interesa profundizar y dominar estas técnicas, te animo a seguir explorando y experimentando con diferentes conjuntos de datos. La práctica constante y el estudio te ayudarán a convertirte en un experto en análisis de datos. ¡Sigue adelante y nunca dejes de aprender!
La maldición de la dimensión: Esto dice que por cada variable que agrego en el conjunto de datos vamos a necesitar exponencialmente más muestras para poder tener la misma relevancia estadística.
Cuál es el autovector relacionado con el autovalor más grande? Es el autovalor quien define cual es la dirección que contiene más información.
Gracias buen amigo, por comentar siempre el resumen de la clase me ha sido de gran ayuda siempre
Igualmente, me he apoyado mucho de tus anotaciones en cada clase, muchas gracias.
En palabras sencillas el PCA es una técnica del análisis multivariado (estadística muy avanzada) que combina conceptos de álgebra lineal y estadistica y la finalidad de este método es REDUCIR, ojo!, no eliminar sino reducir la misma información de todas nuestras variables (dimensiones) a unas nuevas variables que les vamos a llamar componentes principales, y estas variables van a 1. explicar la misma información que las variables más fuertes o con más variabilidad 2. contener adicionalmente la mayor información posible de las otras dimensiones que no arrojen tanta información o no haya tanta correlación,
POR EJEMPLO
Observemos que en la imagen estamos en R3 es decir tenemos 3 dimensiones pero observamos que realmente la correlación y la mayor informacion se concentran mas en dos ciertas regiones donde se pueden obtener eigenvectores que describan la direccion de estos datos, PERFECTO esto va a ser nuestro nuevo eje un eje en R2 donde la información de la info de nuestra 3er dimension ahora se junto con las otras dos dimensiones para no estar en un plano R3 sino R2.
¿Se conserva el 100% de nuestra misma información original? NO, pero es útil si supongamos que realizamos una experimentación muy costosa en la que la tercera acción para nuestra encuesta no es muy relevante, un PCA antes de nos ayuda a ver cuales son LOS COMPONENTES PRINCIPALES por los que vale la pena enfocarnos.
Ok, este material es muuuuuy bueno, gracias por compartirlo!
Muy buen aporte, muchas gracias
Hola a todos comenté cada una de las líneas, espero les sirva. Si tengo un error por favor corregirme. Un abrazo a todos
# PCA, es lograr reducir la dimensionalidad de nuestros datos perdiendo la menor cantidad de información posible.Para esto, lo que se hace es encontrar un vector que pueda capturar la mayor varianza de los datos y proyectarlos en él para reducir la dimensionalidad.# Graficamos nuestros datos.plt.plot(xy[:,0], xy[:,1],'.')plt.show()# Para partir, debemos centrar los datos en sus respectivos ejes.# Esto lo hacemos restandoles su media.# Buena práctica para simplificar el cómputo de los números.# Aparte de lo anterior, veo que es porque en el siguiente paso
# obtenemos la matriz de covarianza, para obtener estas,# necesitamos las distancias del dato hasta la media.# y como ahora está centrado en la media, el valor del dato,,# indica por si solo la distancia a la media.xy_centrado= xy - np.mean(xy, axis=0)# Graficamos nuestros datos centrados en la media.plt.plot(xy_centrado[:,0], xy_centrado[:,1],'.')plt.show()# El siguiente paso es calcular nuestra matriz de covarianza
# y calcular sus autovectores y autovalores.# la matriz de covarianza se resuelve así xy_centrado.T.dot(xy_centrado)# falta dividirla por la cantidad de datos para obtener el promedio
# pero es un escalar y no nos afecta para obtener nuestros
# autovectores y autovalores, ya que obentemos un múltiplo del
# autovector, pero su dirección sigue siendo la misma.autovalores, autovectores = np.linalg.eig(xy_centrado.T.dot(xy_centrado))print(autovectores)%run "../Funciones_auxiliares/graficarVectores.ipynb"# Graficamos nuestros autovectores.# juntos a los datos centrados en la media.graficarVectores(autovectores.T,['blue','red'])plt.plot(xy_centrado[:,0], xy_centrado[:,1]/20,'.')plt.show# Vemos los autovalores.# El autovalor mayor indica que el autovector asociado a este,# captura la mayor varianza de los datos,# o sea la mayor cantidad de información, por lo que este
# es el autovector que debe ser elegido.print(autovalores)
# luego de elegir debemos proyectar los datos perpendicularmente
# en el autovector, para esto podemos usar el producto punto.# Lo que hace el profesor acá es proyectar los datos con cada
# autovector.xy_nuevo= autovectores.T.dot(xy_centrado.T)#Podemos ver acá que la nube de datos cambió y podemos ver que
# el eje y captura la mayor varianza, o sea la mayor información
# de los datos.Lo que calza con la elección de nuestro autovector.plt.plot(xy_nuevo[0,:], xy_nuevo[1,:],'.')plt.show()
El video es buenisimo, y enriquece mucho de la informacion de este curso
Neta que buen video, me aclaro muchas dudas, gracias bro :D
Por cada variable que se agrega en el conjunto de datos vamos a necesitar exponencialmente más muestras para poder tener la misma relevancia estadística. En este sentido, se busca reducir las dimensionalidades haciendo que se capture la mayor cantidad de información.
Para buscar la dimensión que contenga la mayor cantidad de información se siguen los siguientes pasos:
Hallar los autovalores y autovectores de la información centralizada. autovalores, autovectores = np.linalg.eig(xy_centrado.T.dot(xy_centrado))
Encontrar el autovalor de mayor valor. Este autovalor está asociado al autovector que contiene más información y es sobre esta dirección reescribiran los datos.
Me pregunto si el profesor convence a alguien sobre el contenido de esta clase.... Nada de lo esperable de un PCA ocurre aqui... Se supone que PCA nos debería entregar los vectores que maximizan la varianza de los datos proyectados sobre sus ejes.
Dado que y ~ 20 x, lo esperable era conseguir un autovector con una relación similar (ejemplo [1,20] o [-1,-20], pero normalizados). ¿Y qué vemos en los gráficos de esta clase? Vectores que siquiera se acercan a la recta esperada y nuevamente al profesor moviendo las manos tratando de justificar lo injustificable... Me preocupa bastante la calidad de esta clase y del profesor... Todos, somos humanos y nos equivocamos, pero cuando no paras ni un minuto a reflexionar sobre tus resultados siendo profesor.... Nosé...
En fin, resulta que entre transpuesta y transpuesta, el profesor obtiene los autovectores con los ejes cambiados (X es Y e Y es X). Lo comprobé con un método, independiente: Usando singular value decomposition (Los vectores y valores singulares contienen la información que describe el sistema de ecuaciones)
Me preocupa de igual manera, he estado estudiando las últimas 3 clases por alrededor de una semana o más para conseguir base entre libros, videos y preguntas de foros. Hay muchas fórmulas y consecuencias que el profesor se las saca de la manga, no hay esfuerzo por un guión para explicarlas intuitivamente cuando muchas se pueden, las aplica diferente en su código, o a veces -como en esta clase- no las usa en código. Me da pena también por estudiantes que posiblemente estén pérdidos y no hacen más que llevarse afirmaciones en su cabeza y apuntes que creen que son ciertas. Entiendo que entrar en profundidad matemática en tan pocos videos es imposible y se escapa de la sumilla de la plataforma, pero creo en que se puede hacer una narrativa redonda que no deje pérdidos a estudiantes que están siguiendo la misma ruta de la plataforma incentivandolos a buscar otros enlaces también por supuesto.
.
En especial a esta clase de PCA, le he estado dando muchas vueltas, y el algoritmo general del profesor es correcto solo que su resultado gráfico no lo es. Me explico:
.
Partiendo de que su base de datos (llamaré X) esta centrada, las muestras son las filas (200), y las variables son las columnas (2)...
Aplicar X.T @ X devuelve la matriz de covarianza (llamaré C, 2x2, solo falto dividir entre N-1 pero este escalar no influye en los vectores pues te los devuelven ortogonales)
Para luego hallar los eigenvalues y eigenvectors de C (falto ordenarlos descendientemente, afecta solo el último gráfico donde los puntos están transformados siendo el eje 'x' el 'y', y el 'y' el 'x', pero no el afecta el gráfico previo de las principales direcciones)
Terminando en interpretar que los eigenvectors deben ser las Direcciones principales
.
Es el procedimiento a través de la covarianza, en mi colab funcionó y me salieron bien los gráficos, como los tuyos; aclaro que no uso GraficarVectores(). Con el SVD también lo he usado, solo es diferente a tu código en que lo he usado por la derecha (usando la misma base de datos que se explica en el punto 1).
.
Entonces, con esta información e indagando tengo la sospecha de que el problema está en el código matplotlib del profesor, posiblemente en la función GraficarVectores (particularmente yo no la estoy llamando, de frente escribo quiver). Creo que el problema esta en plt.quiver, que tiene el parámetro angles por defecto en 'uv', y para sincronizarse con los otros plots debe estar 'xy'. Solo me sale el resultado del profesor cuando angles esta por defecto y no uso algun método para proporcionar la figura a 1:1. Todo cuadra hasta que en la clase 2 el profesor sí puso 'xy' en GraficarVectores() como debería estar pero eso no da fe a que ahora este igual o este modificado. Es mi sospecha pues a mi sí me salió.
.
Visto por otro lado, la matriz de eigenvectors de la clase es [ [ -0.998 -0.049 ] [ 0.049 -0.998 ] ], por lo tanto los vectores son [ -0.998 0.049 ] y [ -0.049 -0.998 ], estos coinciden con las 'screen coordinates' de 'uv' (numpy.quiver documentation), y especialmente el segundo vector ([ -0.049 -0.998 ]) es el vector de la proporción (-1:-20) que esperabas encontrar. El problema esta en que mientras la figura y la base de datos está deformada, las flechas de quiver no lo están por estar como 'uv'. Se arregla especificando quiver a 'xy' o aplicando un ajuste a la figura que la haga proporción 1:1 por ejemplo "plt.axis('equal')". Plot twist.
PD. Lo de la nube de puntos final, no le vi sentido a sus transpuestas. No comparto
Recomiendo ver este video. El que hizo este video, hace un resumen de todos losconceptos necesarios para entender PCA. Si estás en este curso y en este punto, entenderás todo lo que dice.
En el examen final hay una pregunta relacionada con la normalizacion de los datos. Considero que el curso no menciona con claridad las razones de fondo para esta practica. Por lo mismo me gustaria compartir un pequegno articulo relacionado para que puedan adquirar ideas adicionales y llegar a nuevas conclusiones sobre este tema. ;)
Una duda, por qué calcula los autovalores y autovectores de xy_centrado.T.dot(xy_centrado) y no solo de xy_centrado?
gracias
No me había dado cuenta de que este producto punto xy_centrado.T.dot(xy_centrado) da la matriz de covarianza y varianza (falta dividirlo por la cantidad de puntos, pero eso es un escalar), y es lo que se necesita para saber cuál es el vector con mayor varianza que ocuparemos :O
Primera vez que alguien se ensucia un poco las manos explicando seriamente que es un PCA. Lo siento realmente por aquellos que no tienen bases matemáticas fuertes. Les toca estudiar bastante
El nivel, la explicación o los detalles no tienen sentido en el contexto del curso.
reshape() : Esta función devuelve un nuevo array con los datos del array cedido como primer argumento y el nuevo tamaño indicado.
No dice a que se refiere a d?
¿Qué ocasiona en sí 'seed()'?
Hola 👋🏼
Me imagino que te refieres a random.seed() de numpy.
Lo que pasa es que la función random en realidada no genera números totalmente random sino pseudo-random, es decir, se genera una serie de números a partir de un valor semilla. Este valor semilla lo defines en seed().
Lo que esto te permite es replicar experimentos porque mientras eligas el mismo valor semilla la serie númerica que se genera será la misma.
Realmente no me queda clara la clase, y es la primera en que me ocurre esto en este curso, en que punto del código terminamos encontrando d ? y cuándo aplicamos d.T.dot(d) = 1 ?, en dónde termina lo que pedía la traza de ciertas operaciones con d y una x que tampoco sabría cual fue en el código. Sólo entiendo que la meta era eliminar la variable que menos afectara los datos, y que esta fue la de la dirección del autovector que tenía el autovalor de menor peso.
En ningún momento uso el d, ni siquiera se dijo qué es, supongo que es parte de la demostración; por decir que debe ser maximizada debe referirse a la proyección de un punto en el vector del supuesto eje, hallar una traza tendra sentido pues se esta sumando.
.
El d.T @ d = 1 para que su longitud sea 1 pues es parte de aquello que salió de la manga también.
.
Al final uso u otro algoritmo o la consecuencia de ese procedimiento que no se usó.
No termine de entender lo que explica en el minuto 12:40, ¿Como es que determina que el autovalor más grande determina cual es el eje que contiene más información, si tanto -x- como -y- varían de igual manera?
no varian igualmente, ya que el eje x tiene un rango mucho menor [-2, 2] y el eje y tiene un rango mucho mayor [-60, 60] (sin la transformación que se hizo de dividir entre 20), al ser mayor el rango la dispersión de los valores es mucho mayor y por ende es probable que su varianza sea mucho mayor (esto no se cumple siempre), al ser los datos tan variados, si le quitas esa información a tu dataset perderias muchisima capacidad de entender que es lo que pasa y te quedarias con datos muy sesgados.
En la funcion original y=20x+2np.random.rand(200) , no varían de igual manera, varia en Y de 0 60 y en x de 0 a 3 mira esta funcion no la que el profesor centro en el cero, xy_centrado=xy-np.mean(xy, axis=0) aca no se aprecia , sino que parece como variaran de igual manera
help!!! . recomendaciones externas sobre este tema alguien ? . Esta clase si esta difícil .