Escalares, vectores y tensores en Machine Learning
Clase 4 de 16 • Curso de Álgebra Lineal para Machine Learning
Contenido del curso
Clase 4 de 16 • Curso de Álgebra Lineal para Machine Learning
Contenido del curso
Jhon Alexander García Sierra
Daniel Erazo
Juan Pablo Marin Jimenez
Gabriel Obregón
José Eder Guzmán Mendoza
Franco Alvarado
Victor Alfonso Anaya Pineda
Victor R. M Cárdenas.
Chaparro Rojas Jeferson Arley
Gabriel Londoño
William Alexander Bejarano Pinilla
Alex Xiomar Rubio Lopez
Carlos Alvarado Riaño
Daniela Estupiñan
Daniel Erazo
NESTOR IVAN RONCANCIO CABALLERO
Daniel Erazo
Orlando mendez
Manuel De los Reyes
Daniel Erazo
Teth Azrael Cortes Aguilar
Darlinson Felipe Polania Camacho
Luis Felipe Rodríguez Zamora
Daniel Erazo
Andres Felipe Vargas Gonzalez
Daniel Erazo
Braejan Arias
Daniel Erazo
Un granjero piensa que al momento de realizar cultivos es necesario hacer que la tierra descanse un poco recuperando sus elementos esenciales para que la vida vegetal pueda volver a prosperar por lo que divide sus terrenos en 9 áreas, los que están listos para cosechar (verde), los que están en proceso de recolección (azul), los que están recién cosechados (rojo) y los que están fertilizando (amarillo).
import numpy as np import matplotlib.pyplot as plt # Definir colores RGB correctos según tu descripción VERDE = [0, 255, 0] # Listo para cosechar AZUL = [0, 0, 255] # En proceso de recolección ROJO = [255, 0, 0] # Recién cosechado AMARILLO = [255, 255, 0] # Fertilizando # Crear la matriz 3x3 del terreno imagen_tensor = np.array([ [ROJO, VERDE, AZUL], [AZUL, AMARILLO, ROJO], [AMARILLO, AZUL, VERDE] ], dtype=np.uint8) # Visualización mejorada fig, ax = plt.subplots(figsize=(5, 5)) ax.imshow(imagen_tensor) ax.set_title("División de Terrenos del Granjero", fontsize=14, fontweight='bold') ax.axis("off") # Agregar números del 1 al 9 numero = 1 for i in range(3): for j in range(3): ax.text(j, i, str(numero), ha='center', va='center', color='white', fontsize=20, fontweight='bold', bbox=dict(boxstyle='circle', facecolor='black', alpha=0.5)) numero += 1 # Agregar leyenda from matplotlib.patches import Patch leyenda = [ Patch(facecolor=np.array(VERDE)/255, label='Listo para cosechar'), Patch(facecolor=np.array(AZUL)/255, label='En proceso de recolección'), Patch(facecolor=np.array(ROJO)/255, label='Recién cosechado'), Patch(facecolor=np.array(AMARILLO)/255, label='Fertilizando') ] ax.legend(handles=leyenda, loc='upper left', bbox_to_anchor=(1, 1)) plt.tight_layout() plt.show()
Qué gran aporte, excelente trabajo!
📘Representación de datos en Machine Learning
🎯 IDEA CENTRAL
📊 En Machine Learning, la forma del dato importa tanto como su valor.
🔁 Evolución natural de los datos:
➡️ Escalar → Vector → Matriz → Tensor
Estas estructuras son las que entienden los modelos.
🔢 ESCALAR
❓ ¿Qué es?
🔹 Un solo número
🔹 Describe una característica aislada
🧾 Ejemplos
✔️ Precio
✔️ Edad
✔️ Metros cuadrados
🧠 Es la unidad mínima de información.
📐 VECTOR
❓ ¿Qué es?
🔹 Una lista ordenada de escalares
🔹 Describe un objeto completo
🏠 Ejemplo mental
Un producto o casa puede describirse con:
· 💰 Precio
· ⭐ Calificación
· 🚪 Habitaciones
💻 En NumPy
· Se representa como un array 1D
· Ejemplo:
o producto_A = [20.0, 4.5]
🔍 PROPIEDADES DE UN VECTOR
🧭 ndim
🔹 Número de dimensiones
➡️ Vector → ndim = 1
📦 shape
🔹 Forma del array
➡️ Vector con 2 elementos → (2,)
🔢 size
🔹 Total de elementos
➡️ Aquí → 2
🧠 IDEA CLAVE (GEOMETRÍA)
📍 El número de componentes define el espacio:
· 2 componentes → 📄 plano 2D
· 3 componentes → 📦 espacio 3D
· ML real → 🌌 cientos o millones de dimensiones
📈 VISUALIZAR UN VECTOR
➡️ Se dibuja como una flecha desde el origen
📊 Interpretación típica:
· Eje X → 💰 precio
· Eje Y → ⭐ calificación
👁️ Visualizar ayuda a entender relaciones y posiciones.
🧮 MATRIZ
❓ ¿Qué es?
🔹 Un conjunto de vectores
🔹 Organización en filas y columnas
📚 Convención en Machine Learning
· 👤 Filas → observaciones (usuarios, casas, pacientes)
· 🧩 Columnas → características (edad, precio, altura)
📐 FORMA DE UNA MATRIZ
🔎 El shape se lee así:
➡️ (observaciones, características)
✅ Es el formato esperado por:
· Scikit-learn
· Librerías de ML en general
✂️ INDEXACIÓN (SLICING)
📍 Seleccionar una fila
➡️ Accedes a una observación completa
👤 Ejemplo: un usuario
📍 Seleccionar una columna
➡️ Usas : para todas las filas
🎞️ Ejemplo: una película
🧊 TENSOR
❓ ¿Qué es?
🔹 Estructura de 3 o más dimensiones
🔹 Generaliza vectores y matrices
🔗 Relación entre estructuras
· Vector → 1D
· Matriz → 2D
· Tensor → 3D o más
🚀 Es el lenguaje del Deep Learning.
🤖 ¿DÓNDE SE USAN LOS TENSORES?
📸 Imágenes
🎥 Videos
🎧 Audio
🧠 Redes neuronales
Frameworks:
· TensorFlow
· PyTorch
En Machine Learning, los datos se representan mediante estructuras matemáticas como escalares, vectores, matrices y tensores. Un escalar es un valor único (por ejemplo, edad o precio), mientras que un vector es un conjunto ordenado de valores que describe un objeto con varias características. En NumPy, los vectores se representan como arrays de una dimensión y se pueden analizar mediante atributos como ndim, shape y size para entender su estructura.
Cuando se manejan muchos datos, los vectores se organizan en matrices, donde las filas representan observaciones y las columnas representan características, estructura común en librerías de ML como Scikit-learn. Finalmente, los tensores extienden este concepto a tres o más dimensiones y son fundamentales en deep learning, por ejemplo para representar imágenes con canales RGB. Con herramientas como NumPy y Matplotlib es posible manipular estas estructuras y visualizarlas para comprender mejor los datos antes de entrenar modelos.
¿Cómo saber si un juego es una estafa o una joya oculta comparándolo con el estándar del mercado?
import numpy as np
import matplotlib.pyplot as plt
# Array 2D: shape (6 juegos × 6 dimensiones)
# [nota_meta, nota_usuarios*10, contenido, valor_$/h, descuentos, precio_accesible]
JUEGOS = np.array([
[55, 48, 12.5, 0, 15, 0 ], # Redfall
[90, 94, 50, 98.6, 75, 100 ], # Hollow Knight
[83, 70, 43.75, 74.4, 40, 0 ], # Starfield
[93, 95, 100, 100, 80, 81.8 ], # Hades
[43, 35, 18.75, 34.7, 60, 0 ], # Suicide Squad
[97, 96, 100, 96.7, 20, 18.2 ], # Baldur's Gate 3
])
NOMBRES = ["Redfall", "Hollow Knight", "Starfield",
"Hades", "Suicide Squad", "Baldur's Gate 3"]
EJES = ["Nota crítica", "Nota usuarios", "Contenido",
"Valor $/h", "Descuentos", "Precio accesible"]
print("ndim:", JUEGOS.ndim) # 2
print("shape:", JUEGOS.shape) # (6, 6)
print("size:", JUEGOS.size) # 36
# axis=1 → promedio de dimensiones por juego (una fila → un número)
scores = JUEGOS.mean(axis=1) / 100
# axis=0 → promedio de mercado por dimensión (una columna → un número)
mercado = JUEGOS.mean(axis=0)
# Indexing: juego específico y dimensión específica
print("\nDimensión 'Nota crítica' de todos los juegos:")
print(JUEGOS[:, 0]) # columna 0
print("\nTodas las dimensiones de Hades:")
print(JUEGOS[3]) # fila 3
# Veredictos
print("\nScores:")
for n, s in zip(NOMBRES, scores):
if s >= 0.62: v = "JOYA OCULTA"
elif s <= 0.38: v = "ESTAFA"
else: v = "PRECIO JUSTO"
print(f" {n:<22} {s:.2f} → {v}")
¡Hola a todos! Aquí va mi aporte para el ejercicio propuesto: Una matriz para el control del estado de alistamiento de una flota de vehículos de transporte, semanal, según inspección e historial de mantenimiento, cada fila es una entrada, observación, un equipo de la flota
Columna 1- Llave primaria, la matrícula del vehículo.
De la segunda matriz hacia la 14 se tienen los siguientes valores probables:
0- Equipo Ok, no requiere intervención.
1- Mantenimiento preventivo, esta intervención incluye cambio de fluidos, limpieza, reemplazo de elementos consumibles.
2- Reparación mayor, cambio de repuestos o componentes importantes u overhaul completo.
3- Reemplazo total (por ejemplo, si el coste de la reparación es mayor al 40% del componente nuevo.
Columna 2- Motor, sistema admisión/escape, sistemade combustible, sistema de conversión catalítica.
Columna 3- Transmisión: caja de cambios, embrague y ejes cardán.
Columna 4- Diferenciales.
Columna 5- Dirección y frenos.
Columna 6- Sistema eléctrico.
Columna 7- Tren de ruedas.
Columna 8- Cabina y mandos.
Columna 9- Chasis y estructura.
Columna 10- Equipo de trabajo: Componente mecánico, hidráulico y estructural diseñado para la tarea para la que fue creada la máquina.
Columna 11- Documentos
Columna 12- Carrocería/superestructura.
Columna 13- Estado final, depende de un criterio de operación según las columnas anteriores, por ejemplo: es inoperable si presenta un 3 en las columnas de la 2 a la 10, puede considerarse operable si tiene un 1 en algunos puntos o está solo para pruebas en taller y no puede salir si no tiene un 1 en la columna de documentos.
De hecho, el modelo se puede expandir ya que cada columna agrupa muchas acciones de inspección puede ser cada una matriz, pero e a grandes rasgos esto facilita mucho generar un informe del estado de la maquinaria.
¡Buen curso y saludos!
Hola buenos cibernautas, espero que te encuentre bien.
Idea: Tabla de puntuación, juego de mesa Warhammer fantasy, se considera 4 integrantes, 3 pts por partida ganada, total de integrantes 4.
Nota: Quizás este gráfico debería haber sido de barra para tener un mejor entendimiento y comprensión de este para su interpretación. Tuve ayuda a de la IA para refinar el código. Como consecuencia el gráfico a mostrar.
Codigo :
import matplotlib.pyplot as plt
import numpy as np
# ====================
# CONFIGURACIÓN SIMPLE
# ====================
# Datos organizados en listas paralelas (más fácil de leer)
jugadores = ["Luis", "Guillermo", "Armando", "Alberto"]
partidas = [3, 5, 5, 5] # Partidas jugadas
victorias = [2, 1, 1, 2] # Partidas ganadas (Guillermo: 1 en lugar de 2)
puntos = [v * 3 for v in victorias] # 3 puntos por victoria
# Colores amigables
colores = ['#3498db', '#2ecc71', '#e74c3c', '#f39c12'] # Azul, Verde, Rojo, Naranja
# ====================
# CREAR GRÁFICO LIMPIO
# ====================
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(15, 6))
# ====================
# GRÁFICO 1: DIAGRAMA DE FLECHAS
# ====================
ax1.set_title(" Puntuación por Jugador", fontsize=16, pad=15, fontweight='bold')
ax1.set_xlabel("Partidas Jugadas", fontsize=12)
ax1.set_ylabel("Puntos Totales", fontsize=12)
# Dibujar flechas simples
for i in range(len(jugadores)):
ax1.arrow(0, 0, partidas[i], puntos[i],
head_width=0.3, head_length=0.5,
color=colores[i], alpha=0.8,
length_includes_head=True, width=0.05)
# Punto final con etiqueta clara
ax1.scatter(partidas[i], puntos[i], s=150,
color=colores[i], edgecolor='black', zorder=5)
# Etiqueta simple y clara
ax1.text(partidas[i], puntos[i],
f' {jugadores[i]}\n {victorias[i]}G / {partidas[i]}J\n {puntos[i]} pts',
fontsize=10, va='bottom')
# Línea de referencia: 3 puntos por partida (máximo)
x_line = np.array([0, max(partidas)])
y_line = 3 * x_line
ax1.plot(x_line, y_line, 'r--', alpha=0.3, label='Máximo posible')
# Configurar ejes
ax1.set_xlim(0, max(partidas) + 1)
ax1.set_ylim(0, max(puntos) + 2)
ax1.grid(True, alpha=0.2)
ax1.legend()
# ====================
# GRÁFICO 2: TABLA DE PUNTUACIONES
# ====================
ax2.axis('off')
ax2.set_title(" Resumen del Torneo", fontsize=16, pad=15, fontweight='bold')
# Crear tabla
tabla_datos = [
["Jugador", "Partidas", "Victorias", "Derrotas", "Puntos", "Pts/Partida"]
]
for i in range(len(jugadores)):
derrotas = partidas[i] - victorias[i]
eficiencia = puntos[i] / partidas[i]
tabla_datos.append([
jugadores[i],
str(partidas[i]),
str(victorias[i]),
str(derrotas),
str(puntos[i]),
f"{eficiencia:.2f}"
])
# Añadir totales
tabla_datos.append([
"TOTAL",
str(sum(partidas)),
str(sum(victorias)),
str(sum(partidas) - sum(victorias)),
str(sum(puntos)),
f"{sum(puntos)/sum(partidas):.2f}"
])
# Mostrar tabla
tabla = ax2.table(cellText=tabla_datos[1:],
colLabels=tabla_datos[0],
cellLoc='center',
loc='center',
colWidths=[0.15, 0.12, 0.12, 0.12, 0.12, 0.15])
# Formato de tabla
tabla.auto_set_font_size(False)
tabla.set_fontsize(11)
tabla.scale(1.2, 1.5)
# Colorear encabezado
for j in range(len(tabla_datos[0])):
tabla[(0, j)].set_facecolor('#2c3e50')
tabla[(0, j)].set_text_props(color='white', weight='bold')
# Colorear filas de jugadores
for i in range(1, len(tabla_datos)-1):
for j in range(len(tabla_datos[0])):
tabla[(i, j)].set_facecolor(colores[i-1] + '40') # Color con transparencia
# Colorear fila de totales
for j in range(len(tabla_datos[0])):
tabla[(len(tabla_datos)-1, j)].set_facecolor('#95a5a6')
tabla[(len(tabla_datos)-1, j)].set_text_props(weight='bold')
plt.tight_layout()
plt.show()
----------Imagen del grafico-----------------------------------------------------------
Gracias por su atención. Ten un excelente día u noche. No pares de aprender
No me quedó claro la parte del vídeo 13:36 [:,2] donde menciona que "quiero la columna que corresponde al índice dos (2) osea la tercera columna".
En programación se cuenta desde cero, por lo que la primera columna corresponde a [0]
!
#Representacion de #cada fila representa a un cliente #cada columna representa caracteristicas del cliente: #el monto promedio de transacción monetaria #promedio de transacciones por día #porcentaje de trasacciones declinadas #transacción presencial (si/no) mi_banco=np.array([ [500, 10, 0.3, 1],#cliente_1 [12000, 39, 0.01, 0],#cliente_2 [729, 12, 2.2, 0],#cliente_3 [452, 16, 1.2, 1]#cliente_4 ])
print(mi_banco.ndim) print(mi_banco.shape) print(mi_banco.size)
Reto: Graficando una iamgen tensor
Es una imagen muy colorida! 😄
Muy buen trabajo!
Qué gran trabajo, una obra de arte!
# Color Platzi: [10, 233, 138]
# Blanco: [255, 255, 255]
P = [10, 233, 138]
W = [255, 255, 255]
imagen_tensor = np.array([
[W, W, W, W, W, P, P, W, W, W, W],
[W, W, W, W, P, P, P, P, W, W, W],
[W, W, W, P, P, W, W, P, P, W, W],
[W, W, P, P, W, W, W, W, P, P, W],
[W, P, P, W, W, W, W, W, W, P, P],
[P, P, W, W, W, W, W, W, P, P, W],
[P, P, W, W, W, W, W, P, P, W, W],
[W, P, P, W, W, W, P, P, W, W, W],
[W, W, P, P, W, W, W, P, W, W, W],
[W, W, W, P, P, W, P, P, W, W, W],
[W, W, W, W, P, P, P, W, W, W, W],
[W, W, W, W, W, P, W, W, W, W, W]
])
plt.imshow(imagen_tensor)
plt.title('tensor de platzi')
plt.axis('off')
plt.show()
Qué genial, te quedó muy bien la figura!
Filas número de cafés tomados, columnas son las horas del día en que se toman, matrices cada día de la semana en que se toman y tenemos la representación de la demanda de cafés
Muy buen ejemplo!
tensor_image = np.array([ [ [255, 0, 0], # red [0, 255, 0], # green [0, 0, 255], # blue ], [ [255, 125, 115], [40, 255, 125], [21, 156, 255], ], [ [255, 126, 248], [126, 255, 28], [25, 55, 255], ], ]) print(tensor_image.ndim) print(tensor_image.shape) print(tensor_image.size)
Es una imagen muy interesante!