¿Cómo entendemos las matrices como transformaciones lineales?
Las matrices pueden entenderse como transformaciones lineales que, al aplicarse a un espacio o un vector, generan una transformación. Cuando aplicamos una matriz, podemos afectar a un vector modificando su tamaño o incluso rotándolo. En el mundo de la programación, podemos llevar esto a la práctica utilizando Python y librerías como NumPy y Matplotlib para representar gráficamente estos cambios.
¿Cómo configuramos nuestro entorno en Python para visualizaciones?
Para empezar, necesitamos importar las librerías necesarias. Aquí va un pequeño fragmento de código en Python que nos permitirá ver los gráficos debajo de cada celda de nuestro notebook:
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
Posteriormente, definimos nuestras matrices y vectores usando numpy.
¿Cómo definimos y aplicamos una transformación con matrices?
Supongamos que tenemos la siguiente matriz:
A = np.array([[-1,3],[2,-2]])
Queremos investigar qué transformación genera esta matriz al aplicarla al siguiente vector:
v = np.array([2,1])
La transformación de un vector v usando una matriz A se realiza a través del producto interno de la matriz y el vector. Pero antes de eso, definamos una función para graficar los vectores.
¿Cómo graficamos vectores en Python?
Es útil tener una función versátil para graficar múltiples vectores. Aquí hay una base de cómo podemos definir y utilizar esta función:
Esta función ayuda a visualizar cómo han cambiado los vectores al ser transformados por la matriz. Los ejes cruzan en x=0 y el color de las líneas es gris.
¿Cómo se transforman los vectores utilizando matrices?
Cuando aplicamos la matriz A al vector v, podemos ver el cambio que se produce. Primero, realizamos el cálculo del producto interno:
Aquí, graficamos el vector original v junto con el vector v_transformado para observar la transformación visualmente, comparando sus posiciones y direcciones.
¿Por qué es importante entender estas transformaciones en Aprendizaje Automático?
Las transformaciones de matrices son fundamentales en el aprendizaje automático, especialmente cuando trabajamos con imágenes o datos que tienen representaciones matriciales. Las matrices permiten transformar estos datos de manera que pueden ser procesados más eficientemente por algoritmos de Deep Learning o Machine Learning.
Entender las representaciones de vectores y matrices y cómo podemos alargar, rotar o modificar su escala es clave para manipular datos estructurados como imágenes, en las cuales cada pixel puede ser parte de una matriz mayor. Cuando llevamos matrices a vectores, este proceso se llama "flatten" y es crucial para el tratamiento de datos en modelos computacionales.
¿Qué papel juegan los determinantes en estas transformaciones?
El determinante de una matriz nos ofrece información valiosa sobre la transformación. Un determinante negativo (como el -4 en nuestro ejemplo) puede indicarnos que la transformación involucra una inversión o un giro. Por otro lado, si las normas de los vectores antes y después de la transformación se mantienen iguales, puede señalar que hay vectores en el espacio que no cambian su longitud.
determinante = np.linalg.det(A)print(f"Determinante de la matriz A: {determinante}")
En esta exploración, continuamos profundizando en cómo las operaciones de matriz y producto escalar nos ayudan a dar forma a datos y patrones, sentando las bases para descubrimientos más intrincados en el vasto campo del análisis de datos y Machine Learning.
Por si no entendieron . Lo que el profe quiso transmitir es que las matrices aplicadas a vectores se les puede ver como una transformacion lineal a ese vector . En este caso la transformacion es una rotacion en el sentido antihorario .
Qué gran forma de resumirlo! Sí quedé un poco confundido acerca de qué era lo que habíamos hecho. Muchas gracias!
Esto es lo que nos indica el determinante de la matriz: si éste es negativo, el vector resultante (de la multiplicación matriz-vector (A.dot(vector))) se moverá en sentido antihorario; si es positivo, el vector se moverá en sentido horario.
Explicación para los que se inclinan más por el fundamento matemático:
Sea AxB=C
El producto interno entre Anxm y Boxp dónde n,o son las filas y m,p son las columnas, para que AxB pueda existir cómo producto, se debe cumplir que n=o, y las dimensiones de la matriz resultante (C) será siempre nxp, entonces, si vas probando a lápiz y papel con dimensiones que a ti se te ocurran (pares dimensionales que cumplan con la condicion de producto interno) te vas a dar cuenta que todas las operaciones tranforman, o bien a la primera matriz o a la segunda, la única excepción a esta regla, es que ambas matrices sean cuadradas, lo cuál nos deja la siguiente conclusión
Las matrices son intrínsecamente transformaciones lineales en dónde el espacio es transformado con ciertas excepciones
Muchas gracias..
No hay problema! Cualquier duda la puedes comentar y es muy probable que alguien te la responda (Si no es que la respondo yo) Un saludo!
Básicamente lo que hace el profe Sebastian es mostrarnos el resultado de la ecuación de un sistema de ecuaciones lineal con dos incógnitas A*x = b como se ve en la imagen. Donde A es la matriz [[-1,3], [2,-2]], x es el vector columna [[2],[1]] (graficado en azul) y b es el vector columna [[1], [2]] obtenido como respuesta (graficado en naranja).
El tiene que aplicar la función flatten() porque la función que él creó graficarVectores() no acepta vectores columna o matrices “normales”.
👍
Sería genial ver a este profe en todos los cursos de machine learning.
Para los que están trabajando con Google Colab, el método que uso para trabajar con archivos en carpetas internas es el siguiente:
Importar drive en el espacio de trabajo y vincular con su cuenta de google:
from google.colabimport drive
drive.mount('/content/drive')
Aquí para vincular les pedirá un código de acceso que obtendrán del link que se les mostrará al momento de ejecutar el código. Con esto ya están listos para importar el archivo:
%run 'ubicacion archivo drive'
En mi caso para la función graficarVectores, lo encuentro así:
%run '/content/drive/My Drive/Mau/cursos/Álgebra Lineal Aplicada para Machine Learning/funciones_auxiliares/graficarVectores.ipynb'
Y listo, ya pueden trabajar con su función.
Muchas Gracias amigo, su comentario me salvo
No lo estoy trabajando en drive, pero gracias, esos datos siempre aportan un montóon!
Notebook de la función para graficar:
# Recibirá los vectores, los colores y el nivel de trasparencia con el cual trabajaremos defgraficarVectores(vecs, cols, alpha =1):# Agregamos el eje vertical. Este se cruzará en x = 0, el color será gris y el orden de z será 0 plt.axvline(x =0, color ="grey", zorder =0)# Agregamos el eje horizontal. Este se cruzará en y = 0, el color será gris y el orden de z será 0 plt.axhline(y =0, color ="grey", zorder =0)# Ahora ara cada uno de los vectores en el parámetro for i inrange(len(vecs)):# Tomaremos que la x es la concatenación de esos valores como 0 0 que es lo que estamos tomando como punto de origen # Después de agregar el 0 0 le concatenamos el vector i x = np.concatenate([[0,0], vecs[i]])# Vamos a graficar y agregamos todas las coordenadas plt.quiver([x[0]],[x[1]],[x[2]],[x[3]],# Los ángulos estarán expresados en xy y la escuela de unidad será xy angles ='xy', scale_units ='xy',# La escala con la que graficaremos será 1 scale =1, color = cols[i], alpha = alpha
)
Para los que estan haciendo la prectica en Windows debe ir %run "funciones_auxiliares\graficarVectores.ipynb"
Gracias, ya me preguntaba por qué no me funcionaba
%run "..\FuncionesAuxiliares\graficarVectores.ipynb" Yo estoy en Windows y me sale así!
Matrices
Podemos ver a las matrices como transformaciones lineales del espacio sobre el que se aplican, es decir deforman los puntos del espacio sobre el que se aplican, trasladándolos, alargándolos o rotándolos.
Nota:
.flatten() → convierte el vector o matriz en un vector fila
para entender mejor todas las implicaciones de esto les recomiendo este video
también este en español solo hay que buscarlo
Una **transformación lineal ** es básicamente una función, solo que toma como parámetro de entrada a un vector y devuelve como salida a otro vector.
Se dice que una matriz representa una transformación lineal, porque si multiplicas a una matriz por un vector, obtienes como resultado otro vector.
Interesante análisis
Todo bien salvo que el espacio no esta girando para nada, se esta deformando de forma muy agresiva, imaginen que el vector unitario 'i' esta rotando en sentido antihorario como 120 grados duplicando su tamaño (aprox) para transformarse en 'u', y el 'j' también pero en sentido contrario casi triplicando su tamaño para transformarse en 'v'. Al final que [2 1] y [1 2] -medidos desde el plano cartesiano original- se parezcan (como que tengan misma norma) y parezca que uno rotó es pura coincidencia.
.
Introducción:
A las matrices las podemos pensar como transformaciones lineales que cuando las aplicamos a un espacio o a un vector generan una transformación. La transformación en el caso de un vector podría ser cuando se estira, se achica o incluso cuando generamos una rotación.
como sabemos que transformación debemos aplicarle a un problema?
Debes pensar la transformación lineal como una función pero en forma de matriz, y el vector como el valor que será evaluado.
Así que la matriz dependerá del problema que quieras resolver
La función graficarVectores que sale en el video, le falta una parte: color = cols[i]
def graficarVectores(vecs, cols, alpha = 1):
plt.axvline(x =0, color ="grey", zorder =0)plt.axhline(y =0, color ="grey", zorder =0)for i inrange(len(vecs)): x = np.concatenate([[0,0], vecs[i]]) plt.quiver([x[0]],[x[1]],[x[2]],[x[3]], angles ='xy', scale_units ='xy', scale =1, color = cols[i], alpha = alpha
)
Así es como quedaría al final para que se ejecute correctamente.
Por si no entendieron . Lo quiso transmitir es que las matrices aplicadas a vectores se les puede ver como una transformación lineal a ese vector.
En este caso la transformación es una rotación en el sentido antihorario .
Correcto salvo que en realidad la transformación no rota, viendo solo esos 2 vectores parece pero en realidad si haces la transformación con más vectores cercanos sobre todo con el 'i' [1,0] y el 'j' [0,1] y dibujas donde caen veras que el primero cayó en el Ii cuadrante y el segundo en el IV cuadrante (se cruzaron) y que sus normas también cambiaron.
.
El profesor tuvo un lapsus al mencionar que el espacio rotaba o que la transformacion giraba, por eso al final la arregla al decir que fue una coincidencia que la norma de esos dos vectores sean iguales.
.
Redundando, si el espacio hubiese solamente rotado, su determinante hubiese sido 1 pues significa que a pesar de rotar nada ha sido deformado. Interpretar a la determinante como el factor en como el area del espacio aumenta/disminuye respecto de transformar nada (o transformar con la matriz identidad). La matriz identidad tiene determinante 1.
Recomiendo el canal de youtube 3blue1brown. Tiene videos muy buenos como este para el cambio de base (parte de lo que vimos en esta clase).
Hola, si quieren correr el código desde Google colaboratory...
Para ubicarse en la carpeta donde esta el archivo '01 - Matrices y transformaciones lineales.ipynb' qu en mi caso esta en 'My Drive/Platzi/Algebra Lineal aplicada para ML', deben usar:
from google.colabimport drive
drive.mount('/content/drive/')%cd '/content/drive/My Drive/Platzi/Algebra Lineal aplicada para ML'
Y posteriormente suponiendo que la carpeta 'funciones_auxiliares' este en la misma ubicación, utilizan:
# Importamos las bibliotecas%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
# Definimos una matriz A = np.array([[-1,3],[2,-2]])print(A)# Generamos un vectorvector = np.array([[2],[1]])print(vector)# Miramos la ruta en donde estamosimport os
os.getcwd()# # Importamos nuestra función para graficar. %run ".\\Funciones auxiliares\graficarVectores.ipynb"# Mostramos que es lo que tenemos como vector print(vector)# Esta función nos devolverá como una fila nuestro vector que estaba definido como una columna print(vector.flatten())# Imprimimos la matriz normal print(A)# Ahora vemos como la función flatten nos muestra toda la matriz como una sola filaprint(A.flatten())# Graficamos vectores con nuestra función y le daremos como parámetro el vector flatten. graficarVectores([vector.flatten()], cols ='blue')plt.xlim(-0.5,3)plt.ylim(-0.5,2)# Definimos nuestro vector transformadovector_transformado = A.dot(vector)print(vector_transformado)# Graficamos vectores con nuestra función, de daremos como parámetro el vector flatten y el vector transformado graficarVectores([vector.flatten(), vector_transformado.flatten()], cols =['blue','orange'])plt.xlim(-0.5,2.5)plt.ylim(-0.5,2.5)# Obtenemos el determínate de una nuestra trasformación print(np.linalg.det(A))# Obtenemos las normas de los vectores. print(np.linalg.norm(vector))print(np.linalg.norm(vector_transformado))
gracias, me ayudo muchisimo en entender mejor cada cosa
Les comparto una forma en la que yo lo comprendí mejor. Una transformación lineal la podríamos entender como un cambio en las coordenadas en las que estamos mostrando nuestro vector. Ya que el vector con las nuevas coordenadas (Transformado), va a representar lo mismo que en las antiguas.
Por ejemplo, el vector [1,1], en las coordenadas cartesianas a las que estamos acostumbrados se vería así, este es el vector rojo y las demas son guías para entender la modificación de las coordenadas :
Sin embargo, si yo hago una transformación lineal por medio de la matriz, donde [2,1] modifican el eje x y [2,4] el eje y.
Lo cual da como resultado un nuevo vector [1,1] bajo el nuevo sistema de coordenadas.
Si tenemos que después de la transofrmación lineal nuestro nuevo vector se encuentra en el mismo eje que el primero, ese sería un autovector de nuestra matriz y el auto valor representaría la magnitud de cambio de la longitud de nuestro vector dentro de ese autovector.