Lección 3 de 23· Vectores: la unidad básica
Si el álgebra lineal es el lenguaje del machine learning, el vector es su palabra más básica. Casi todo lo que toca un modelo —una fila de datos, un píxel, un embedding de texto, los pesos de una red neuronal— se representa como un vector. Antes de operar con ellos, necesitamos una intuición sólida de qué es un vector.
La idea clave de esta lección es que un vector admite tres lecturas equivalentes, y un buen practicante de ML salta entre las tres sin esfuerzo:
Las tres describen el mismo objeto. Elegimos la lectura más cómoda según lo que queramos hacer.
En su forma más concreta, un vector es simplemente una secuencia ordenada de números. "Ordenada" es la palabra importante: el primer número significa algo distinto del segundo, y no podemos reordenarlos sin cambiar el vector.
En notación matemática, un vector en el plano (dos números) se escribe en una columna:
Usamos negrita () o una flechita () para distinguir un vector de un número suelto (un escalar, como o ). Cada número dentro se llama componente o coordenada: arriba la componente , abajo .
Decimos que este vector vive en —el conjunto de todos los pares de números reales— porque tiene exactamente dos componentes reales.
import numpy as np
# Un vector es, en código, simplemente un arreglo 1-D de NumPy
v = np.array([3, 2])
print(v) # [3 2]
print(v.shape) # (2,) -> dos componentes
print(v[0], v[1]) # 3 2 -> acceso por posición (el ORDEN importa)Si interpretamos las componentes como coordenadas, el vector marca un único punto en el plano: avanza a la derecha sobre el eje horizontal y hacia arriba sobre el eje vertical.
Esta es la lectura natural cuando pensamos en datos. Imagina un dataset de casas con dos columnas, superficie y precio. Cada casa es un punto en un plano superficie × precio, y todo el dataset es una nube de puntos. Ver los datos como puntos es lo que permite hablar de "distancia entre dos ejemplos", "agrupamientos" o "vecinos cercanos" más adelante.
La tercera lectura, la más geométrica, dibuja una flecha desde el origen hasta el punto . Esta flecha tiene dos atributos:
Esta visión es la que da sentido a operaciones como sumar vectores (encadenar flechas) o multiplicar por un escalar (estirar o encoger la flecha) —justo lo que veremos en la próxima lección. El gráfico de abajo muestra el mismo vector como una flecha que parte del origen.
El siguiente diagrama resume cómo un único objeto se mira de tres maneras. Da igual desde cuál partas: las tres describen exactamente el mismo vector.
| Lectura | Cómo se ve | Cuándo es más útil |
|---|---|---|
| Lista de números | [3, 2] | Programar, almacenar, operar en NumPy |
| Punto | la posición | Pensar en datos y distancias |
| Flecha | flecha origen | Intuición de sumas y transformaciones |
Nada nos obliga a quedarnos en dos componentes. Un vector con componentes vive en y se escribe de forma general:
Con o podemos dibujarlo (plano y espacio). A partir de ya no lo visualizamos, pero las matemáticas funcionan exactamente igual: sigue siendo una lista ordenada de números sobre la que sumamos, escalamos y medimos distancias. Y esto es crucial, porque en machine learning los vectores casi nunca son de dimensión 2: un embedding de texto puede tener o más componentes. La intuición geométrica que construyes en se transfiere a esas dimensiones altas aunque no puedas dibujarlas.
Aquí está la conexión que hace que todo esto importe: en machine learning, los datos se representan como vectores.
[edad, ingreso, años_de_estudio], ese ejemplo es un vector en . Un dataset entero es un montón de vectores apilados (una matriz, que veremos en el módulo 4).En cuanto interiorizas que "fila de datos = punto = flecha = lista de números", frases como "calcula la distancia entre dos ejemplos" o "busca los embeddings más cercanos" dejan de ser jerga y se vuelven operaciones geométricas concretas.
import numpy as np
# Una fila de datos (un ejemplo) ES un vector.
# persona = [edad, ingreso_miles, anios_estudio]
persona = np.array([34, 52.0, 16])
print("Ejemplo en R^3:", persona, "-> shape", persona.shape)
# Un embedding es solo un vector con muchas mas componentes.
rng = np.random.default_rng(0)
embedding = rng.normal(size=768) # vector en R^768
print("Embedding en R^768 -> shape:", embedding.shape)
print("Primeras 5 componentes:", embedding[:5].round(3))Un detalle de notación que vale la pena fijar desde ya, porque más adelante (al multiplicar por matrices) será importante: un vector puede escribirse en columna o en fila.
Matemáticamente representan la misma información; lo que cambia es su forma (shape): la columna es una matriz de y la fila una de . Pasar de una a otra se llama transponer, y se nota con una pequeña:
Por convención matemática, cuando escribimos sin más solemos referirnos a un vector columna. En NumPy, en cambio, lo más habitual y cómodo es un arreglo 1-D (shape (2,)) que no es ni fila ni columna: se adapta al contexto. Conviene saber distinguirlos para no llevarte sorpresas con las formas.
import numpy as np
v1d = np.array([3, 2]) # 1-D: ni fila ni columna, shape (2,)
print("1-D:", v1d.shape)
columna = v1d.reshape(2, 1) # vector columna 2x1
fila = v1d.reshape(1, 2) # vector fila 1x2
print("columna shape:", columna.shape)
print("fila shape: ", fila.shape)
# Transponer convierte una en la otra
print("columna.T shape:", columna.T.shape) # (1, 2)
print(np.array_equal(columna.T, fila)) # TrueAbre la idea con tus propios dedos antes de seguir:
u = np.array([-2, 3]) y verifica su shape. Luego obtén su versión fila con u.reshape(1, 2).En la próxima lección pondremos estas flechas a moverse: sumar vectores y multiplicarlos por un escalar, con NumPy y geometría.
Antes de seguir, verifica que las tres interpretaciones de un vector te quedaron claras:
Gratis