Producto matriz matriz en NumPy
Clase 10 de 16 • Curso de Álgebra Lineal para Machine Learning
Contenido del curso
Clase 10 de 16 • Curso de Álgebra Lineal para Machine Learning
Contenido del curso
Bryan Castano
Victor Alfonso Anaya Pineda
José Eder Guzmán Mendoza
Daniela Estupiñan
Daniel Erazo
Alex Xiomar Rubio Lopez
Darlinson Felipe Polania Camacho
Roberto Fernández Vega
Daniel Erazo
Pablo Joaquín Cruz
Fernando Ciano
Johan L
Daniel Erazo
Gabriel Obregón
Alejandro Molina
Daniel Erazo
Jorge Duran
Beicker Andres Yomayusa Diaz
Daniel Erazo
Hey Chicos, Esta clase es muy importante para Machine Learning, especialmente en el Deep Learning cuando vean la Clasica ecuacion :
Zi = Wij@aj + bi;
Si estamos en Una Capa oculta Li de una red neuronal Profundaque tiene m neuronas, y la capa anterior Li-1 tenia n neronas conectadas, entocnes la activacion de ellas a^l-1 seria un vector fila de dimesion 1xn, W es la matriz de pesos de dimesión mxn,
Cada fila i de esta matriz contienelos pesos que conectan a todas la Neuronas de la capa anterior "Li-1" con la Neurona i de la capa actual j.
\n Para que la Multiplicación de matrices sease posible "Producto punto @" el número de columnas de la primera matriz debe coincidir con el número de filas de la segunda.
\n Si usamos W.dot(a.T) ->" W.a^T" : donde a es la activación de las neuronas anteriores "output" tenemos (mxn)*(nx1) , por tanto El resultado es un vector columna de mx1.
Para que la multiplicación de matrices sea posible (el producto punto), el número de columnas de la primera matriz debe coincidir con el número de filas de la segunda.
Cada Elemento Zi secalcula como:
Zi = Sumatoria|<j=1 :n>( Wij@aj) + bi ;
\n Transponemos el vector de las activaciones de 1-n -> nx1 por una razón de alineación de espacios vectoriales .
\n Al hacerlo nx1 , tratamos a las activaciones como un objeto geométrico que será transformado (rotado y escalado) por la matriz de pesos: W.
\n Si no transpusiéramos, tendríamos que escribir la ecuación como $Z = a @ W^T$, lo cual también es común en algunas implementaciones de software (como en las capas Linear de PyTorch por eficiencia de memoria),
\n Pero matemáticamente, ver el peso $W$ a la izquierda es la notación estándar del álgebra lineal para transformaciones
$T(v) = Av$;
\n En NumPy Existe es una optimización matemática elegante. Podemos evitar sumar el vector $b$ "Bias" por separado "aumentando" nuestras matrices:
De esta forma la ecuacion fundamental de la Neurona : Z = W@a + b se reduce : W´@a.T´;
2Mi perosnlmente no me gusta mucho este truco del Broadcasting que ya vimos en el curso anteriro, siento que es un truco indecente, pero segun he leido optimiza mucho el tiempo de computo y los recusos de GPU.
\n El Broadcasting en NumPy es un comportamiento donde, si tienes una matriz de $m x k$ y le sumas un vector de $m x 1$, NumPy "estira" o replica ese vector automáticamente para que coincida con las dimensiones de la matriz.
\n Esto permite que la operación sea vectorizada en la CPU/GPU, eliminando los bucles for que harían que tu red fuera lenta.
\n EG : Si tienes una capa de 3 neuronas recibiendo señales de 2 neuronas anteriores:
\n Cada fila del resultado Z es el "potencial de membrana" de cada una de las 3 neuronas antes de pasar por la activación $a(Z)$. y asi en secuencia este proceso se repite L veces para cada neurona de las capas.
\n Entender esto es muy importante para el feed-forward y mas aun para elBack-forward.
\n Según he visto para el backprogration las libs como TensorFlow && Pytorch usan Tensores para agrupar todo los claculos de la Chain Rule que e otro ausnto mas complejo, En fin :
print("Nunca pares de Aprender\n")
Buenas tardes, Cordialmente comparto mi propuesta de solución para el ejercicio propuesto.
El tema es que me sale una matriz para el resultado, supongo que si quiero que me diga algo más concreto sobre a quien debo enviar la propuesta tendría que sacar la norma.
Buen curso.
El producto matriz-matriz es una operación fundamental en machine learning que permite transformar datos en bloque, siendo la base de procesos como la clasificación por lotes y el cálculo de similitudes. Si una matriz A tiene forma (M×N) y otra B (N×P), su multiplicación produce una nueva matriz (M×P), siempre que coincidan las dimensiones internas. Esta operación representa cómo los modelos aplican sus pesos aprendidos a múltiples ejemplos simultáneamente.
En aplicaciones prácticas, este producto permite obtener scores de clasificación (por ejemplo, asignar géneros a películas) o construir matrices de similitud entre usuarios y contenidos. Cuando las dimensiones no coinciden, la transposición (.T) es clave para alinear correctamente las matrices. Dominar estos conceptos implica entender cómo validar shapes, aplicar transformaciones lineales y escalar cálculos, habilidades esenciales para trabajar con modelos modernos de inteligencia artificial.
Gran ejemplo, sigue así! 😁
Reto: Multiplicación de matrices
Yo he añadido un condicional para comprobar que las dimensiones de las matrices a multiplicar son correctas y aplicar la transposición en caso de ser necesario:
A = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) B = np.array([[9, 8, 7], [6, 5, 4]]) print(f"forma de A: {A.shape}") print(f"forma de B: {B.shape}") if A.shape != B.shape: print("No se pueden multiplicar A y B directamente debido a las formas incompatibles.") B_transpuesta = B.T print(f"forma de B_transpuesta: {B_transpuesta.shape}") A_dot_B = A @ B_transpuesta if A.shape == B.shape: A_dot_B = A @ B print(f'La multiplicación de A y B es: {A_dot_B}\n') print(f'La forma de A_dot_B es: {A_dot_B.shape}')
Gran trabajo!
Creo que el if correcto sería:
if A.shape[1] != B.shape[0]: ...
import numpy as np
matriz_a = np.array([
[0.5, 0.2, 0.1],
[0.9, 0.3, 0.4],
[0.4, 0.7, 0.5],
[0.3, 0.8, 0.9]
])
matriz_b = np.array([
[0.6, 0.1],
[0.2, 0.9],
[0.8, 0.3]
])
print(f"Shape matriz_a: {matriz_a.shape}")
print(f"Shape matriz_b: {matriz_b.shape}")
matriz_similitud = np.dot(matriz_a, matriz_b)
print(f"Shape matriz_similitud: {matriz_similitud.shape}")
print(f"Matriz de similitud entre A y B:\n {matriz_similitud}")
Resultados:
---------------
Shape matriz_a: (4, 3)
Shape matriz_b: (3, 2)
Shape matriz_similitud: (4, 2)
Matriz de similitud entre A y B:
[[0.42 0.26]
[0.92 0.48]
[0.78 0.82]
[1.06 1.02]]
A = np.array([ [0.9, 0.2, 0.2], [0.9, 0.2, 0.2], [0.9, 0.2, 0.2], [0.9, 0.2, 0.2] ]) print(A.shape) B = np.array([ [0.1, 0.5], [0.1, 0.5], [0.4, 0.3], ]) print(B.shape) matriz_similitud_a_b = A @ B print(matriz_similitud_a_b.shape)
El resultado:
(4, 3) (3, 2) (4, 2)
Muy bien, es correcto, sigue así!
🧠📘Producto matriz–matriz en Machine Learning (NumPy)
➗ CONCEPTO CLAVE: PRODUCTO MATRIZ–MATRIZ
🔹 ¿Qué es? Una operación que combina dos matrices para generar una nueva.
🔹 Regla esencial de dimensiones
· A → forma M×N
· B → forma N×P
· Resultado → M×P
👉 Columnas de A = Filas de B
📐 SHAPE (FORMA): POR QUÉ ES TAN IMPORTANTE
🔍 El shape te permite:
✔️ Ver si una operación es válida
✔️ Evitar errores antes de ejecutar código
✔️ Interpretar correctamente el resultado
💡 Siempre revisa el shape antes de multiplicar.
🔁 MATRICES Y CAPAS EN REDES NEURONALES
🧠 Cada producto matriz–matriz representa:
➡️ Una transformación lineal
➡️ Una capa que convierte datos de entrada en nuevas representaciones
🎬 EJEMPLO 1: CLASIFICACIÓN POR LOTES (PELÍCULAS)
🎯 OBJETIVO
Clasificar varias películas en distintos géneros con una sola operación.
📥 DATOS DE ENTRADA
🎞️ peliculas_features (3×2)
· 3 películas
· 2 características:
o 🎬 Acción
o 😂 Comedia
🎚️ pesos_generos (2×3)
· Importancia de cada característica
· Géneros:
o 🏔️ Aventura
o 👨👩👧 Familiar
o ❤️ Romance
⚙️ OPERACIÓN CLAVE
➡️ peliculas_features @ pesos_generos
📐 Shape del resultado: 3×3
📊 RESULTADO: SCORES
🔢 Cada número es un score (nivel de confianza)
· 🧍♂️ Filas → películas
· 🎭 Columnas → géneros
🧾 INTERPRETACIÓN
📌 Para cada película:
· Se comparan sus scores
· 🥇 El valor más alto indica el género final
📝 Ejemplo (Película 1):
· 🏔️ Aventura → 5.9
· 👨👩👧 Familiar → 3.0
· ❤️ Romance → 2.9
✅ Predicción: Aventura
👥 EJEMPLO 2: SIMILITUD USUARIO–PELÍCULA
🎯 OBJETIVO
Medir qué tan compatible es cada usuario con cada película.
📥 DATOS
👤 usuarios (3×4) Características:
· 🎬 Acción
· 😂 Comedia
· 🎭 Drama
· 🚀 Ciencia ficción
🎞️ peliculas (2×4) Mismas características
❌ PROBLEMA INICIAL
🚫 Intentar: usuarios @ peliculas
📐 3×4 @ 2×4 → ERROR ❗ Las dimensiones internas no coinciden
🔄 SOLUCIÓN: LA TRANSPUESTA (.T)
🔁 Transponer significa:
· Cambiar filas por columnas
🎞️ peliculas → 2×4
🎞️ peliculas.T → 4×2
✅ MULTIPLICACIÓN CORRECTA
➡️ usuarios @ peliculas.T
📐 Resultado: 3×2
📈 MATRIZ DE SIMILITUD
🧍♂️ Filas → usuarios 🎞️ Columnas → películas 🔢 Valores → afinidad
📝 Ejemplo:
· Usuario 1 + Película 1 → ⭐ 1.47 (alta afinidad)
· Usuario 1 + Película 2 → ⭐ 0.52 (menor afinidad)
Muy bien, gran respuesta!
Mi humilde aporte jaja
import numpy as np # Características de entrada (ej: velocidad, razonamiento, contexto) ia_features = np.array([ [1, 2, 3], [4, 5, 6], [8, 6, 9], [2, 2, 9], ]) # Pesos asignados a cada categoría para GPT (col 1) y Claude (col 2) pesos_categorias = np.array([ [1.1, 0.5], [0.8, 1.1], [0.3, 0.6] ]) # Multiplicación de matrices para obtener puntajes scores = ia_features @ pesos_categorias # Obtenemos el índice del valor más alto en cada fila (0 para GPT, 1 para Claude) prediccion = np.argmax(scores, axis=1) llms = ['GPT', 'CLAUDE SONNET'] print(f'A shape: {ia_features.shape}') print(f'B shape: {pesos_categorias.shape}') print(f'scores shape: {scores.shape}') print(f'scores:\n{scores}\n') for i, l in enumerate(prediccion): print(f"Muestra {i}: La IA recomendada es {llms[l]}")
profesor, multiplicar matrices es muy similar a producto punto de vectores, y los dos nos dicen las afinidades para el caso de producto punto entre ventores y para producto matriz-matriz entre matrices. para el caso de vectores existe similitud coseno que es una forma de medir similitud un poco mas "diciente" o "absoluta" al estar definido entre -1 y 1, la pregunta es: hay algo similar para matrices?
¡Hola! Qué excelente pregunta. Tienes toda la razón y tu intuición matemática va por muy buen camino.
La respuesta corta es: Sí, absolutamente.
Lo que viste en la clase (usuarios @ peliculas.T) es el cálculo de la "similitud bruta" (producto punto). Para convertir eso en la Similitud del Coseno (que va de -1 a 1), simplemente nos falta un paso de "normalización".
Aquí te lo explico de forma sencilla usando el mismo ejemplo de la clase:
1. El concepto clave: Magnitud vs. Dirección
En el resumen vimos que el producto matriz-matriz hace muchos productos punto a la vez.
2. ¿Cómo se hace con matrices?
Para obtener la similitud coseno entre matrices, hacemos exactamente lo mismo que con vectores, pero en lote:
Similitud = Producto Punto / Norma A x Norma B
En el contexto de matrices, el proceso es:
usuarios @ peliculas.T con estos vectores ya normalizados.El resultado será automáticamente una matriz donde todos los valores estarán entre -1 y 1.
3. Ejemplo práctico
Imagina el ejemplo de la clase de Usuarios vs Películas.