Te tengo que quitar un dibujo de la cabeza 🌸
Si en el colegio te enseñaron vectores, casi seguro te los enseñaron como una flecha. Una flecha con su origen, su dirección y su largo.
Ese dibujo no está mal, pero te va a estorbar. Porque en machine learning un vector típico tiene cincuenta componentes, y una flecha en cincuenta dimensiones no se puede dibujar ni imaginar.
Así que lo cambiamos por otro que sí escala: un vector es una fila de tu tabla 🐣
Volvemos a abrir el archivo
Cada capítulo arranca de cero, así que estas líneas se repiten. Son las mismas del capítulo 1 y las vas a ver en todos.
import pandas as pd import numpy as np df = pd.read_csv('ventas-miss-yera.csv') for c in ('unidades', 'monto', 'satisfaccion'): df[c] = pd.to_numeric(df[c], errors='coerce') X = df[['unidades', 'monto', 'satisfaccion']].dropna().to_numpy() print('X.shape:', X.shape)
X.shape: (2238, 3)
Saca una fila y míralo
v = X[0] print('v :', np.round(v, 2)) print('v.shape :', v.shape, '| ndim:', v.ndim) print('len(v) :', len(v))
v : [ 10. 480.37 4. ] v.shape : (3,) | ndim: 1 len(v) : 3
Eso es un vector. Tres números en un orden que significa algo: primero las unidades, después el monto, después la satisfacción.
Fíjate en ndim: 1. Una dimensión. La matriz
del capítulo anterior tenía dos. Y la forma sale (3,), con esa
coma sola al final, que es la manera que tiene NumPy de decirte "esto no es una
tabla de 3 por algo, es una lista de 3".
El orden es el vector
Esto es lo que separa un vector de un montón de números sueltos.
Si te doy [10, 480.37, 4] sabes que fueron 10 unidades por
480.37 soles con satisfacción 4. Si te doy [4, 10, 480.37] son los
mismos tres números y ya no significan nada, porque la posición es la que dice
qué es cada uno.
v es una lista de d números reales, y esa negrita es lo único que la distingue de un número suelto
La d es cuántas componentes tiene. Y la negrita de la v no es decorativa: en los papers es lo único que distingue un vector de un número suelto. Cuando veas una letra en negrita, es una lista.
un vector se escribe como sus componentes, una por cada cosa que mediste
| Símbolo | Qué es |
|---|---|
| v | el vector entero |
| v1 | su primera componente, en nuestro caso las unidades |
| d | cuántas componentes tiene |
Y ojo con algo que confunde a todo el mundo: en matemática las componentes
se numeran desde 1, y en Python desde 0. Así que la v1
del paper es v[0] en tu código. No hay forma de que eso deje de
molestar, solo se acostumbra uno 🙂
Una columna también es un vector
montos = X[:, 1] print('montos.shape :', montos.shape) print('primeros 3 :', np.round(montos[:3], 2))
montos.shape : (2238,) primeros 3 : [480.37 524.9 154.83]
2.238 componentes. También es un vector, y también tiene un orden que significa algo: cada posición es una venta distinta.
Y aquí está la idea que quiero que te lleves de este capítulo: la misma tabla te da dos familias de vectores según cómo la cortes. Por filas te da un vector por venta. Por columnas te da un vector por característica.
Las dos se usan, y para cosas distintas. Cuando en machine learning se dice "cada ejemplo es un punto en el espacio", se está hablando de los de fila. Cuando se dice "esta columna correlaciona con aquella", de los de columna.
Fila o columna, que sí importa
En matemática un vector suele escribirse como columna, y eso a veces hay que decírselo a NumPy:
fila = v.reshape(1, -1) col = v.reshape(-1, 1) print('fila.shape', fila.shape, ' col.shape', col.shape) print(np.round(col, 2))
fila.shape (1, 3) col.shape (3, 1) [[ 10. ] [480.37] [ 4. ]]
Los tres son el mismo vector con los mismos tres números. Lo que cambia es
la forma: (3,), (1, 3) y (3, 1).
El -1 del reshape quiere decir "calcula tú cuánto
va aquí". Es cómodo y es peligroso: si te equivocas de eje, NumPy no protesta,
te devuelve algo con la forma que pediste y el error aparece tres funciones más
allá.
Cuándo importa: cuando multipliques. Ahí (1, 3) y
(3, 1) dan resultados completamente distintos, y eso es el capítulo
del producto punto.
Lo que te llevas
- Un vector es una lista ordenada de números. Olvídate de la flecha.
- La posición es la que dice qué es cada número.
- Forma
(3,)con coma suelta quiere decir una dimensión. - Las filas y las columnas de tu tabla son las dos vectores, y se usan para cosas distintas.
- Los papers numeran desde 1 y Python desde 0. Es así y ya.
Comprueba que se entendió
Comprueba que lo tienes
Sacas v = X[0] y te sale forma (3,). Después haces v.reshape(-1, 1). ¿Qué cambió?
- Solo la forma: los mismos tres números organizados como columna
- Los números, que ahora están al revés
- Nada, porque (3,) y (3, 1) son lo mismo
- Ahora hay tres vectores de un número cada uno
Ejercicios
1. Fila contra columna
Comprueba que las tres formas llevan los mismos números.
print(np.array_equal(v, v.reshape(1, -1).ravel())) print(np.array_equal(v, v.reshape(-1, 1).ravel()))
True True
ravel los aplasta de vuelta a una dimensión. Los números nunca
cambiaron: lo único que cambió fue cómo NumPy los tiene organizados.
2. El vector de una columna concreta
Saca las satisfacciones y mira cuántas hay de cada nota.
sat = X[:, 2] valores, cuantos = np.unique(sat, return_counts=True) for v_, c_ in zip(valores, cuantos): print(int(v_), '->', c_)
1 -> 454 2 -> 426 3 -> 447 4 -> 449 5 -> 462
Ese vector de 2.238 componentes resumido en cinco números. Y fíjate en lo plano que sale: las cinco notas aparecen casi la misma cantidad de veces. Eso no es lo que uno esperaría de clientes reales, y es una pista de que este archivo está generado. Un vector resumido así te dice en cinco números si tus datos tienen forma o no la tienen.
3. El orden importa, demuéstralo
Desordena las componentes y mira si sigue significando lo mismo.
print('original :', np.round(v, 2)) print('al reves :', np.round(v[::-1], 2))
original : [ 10. 480.37 4. ] al reves : [ 4. 480.37 10. ]
Los mismos tres números. Pero el segundo dice 4 unidades y satisfacción 10, que ni siquiera existe porque la escala llega a 5. Un vector desordenado no es un vector distinto: es basura.
Preguntas frecuentes
¿Qué es un vector?
Una lista ordenada de números. En machine learning, una fila de tu tabla es un vector: un cliente son sus cinco números puestos en fila y en el mismo orden siempre.
¿Qué son las componentes de un vector?
Cada uno de los números de la lista. Si el vector es un cliente, sus componentes son unidades, monto, descuento y lo que hayas medido.
¿Qué tipos de vectores hay?
En el álgebra que hace falta acá, la distinción que importa es fila o columna, y es de forma y no de fondo. NumPy te lo va a recordar el día que dos formas no encajen.
¿Cómo se suman dos vectores?
Componente a componente: el primero con el primero, el segundo con el segundo. Solo se pueden sumar si tienen el mismo largo.
Practica este capítulo 📓
Todo el código de arriba en un cuaderno que corre de principio a fin, y los ejercicios con una celda vacía para que los hagas tú. Se abre en Google Colab de un clic y no hay que instalar nada. Donde veas %%revisa, escribe tu respuesta y el cuaderno te dice si te salió.
¿Prefieres trabajar en tu máquina? Bájate el cuaderno de práctica o el de soluciones. Todos están también en github.com/soymissyera/MissYeraEjercicios.