Resta y multiplicación
- En la resta (-), se resta componente por componente.
- En la multiplicación (*), se multiplica componente por componente
import numpy as np
v1 = np.array([10, 20, 30])
v2 = np.array([1, 2, 3])
# Resta
resta = v1 - v2 # Resultado: [9, 18, 27]
# Multiplicación
mult = v1 * v2 # Resultado: [10, 40, 90]
La resta nos permite medir distancias, errores y cambios de dirección en espacios multidimensionales.
Norma
Es una función que asigna un número real positivo a un vector. De forma sencilla, es la medida de la longitud o magnitud de un vector.
Si piensas en un vector como una flecha que va desde el origen hasta un punto, la norma es la "distancia" que recorre esa flecha.
Usos de la norma
- Normalización de datos: la norma se usa para reescalar los vectores de modo que todos tengan longitud 1 (vectores unitarios), permitiendo que el modelo compare "manzanas con manzanas".
- Error y distancia: como vimos con la resta, si restas dos vectores y calculas la norma del resultado, obtienes la distancia exacta entre esos dos puntos de datos.
Para hallar la normal de un vector debemos usar la función norm de numpy.
v = np.array([10, 20, 30])
np.linalg.norm (v)
Producto punto
El producto punto está detrás de los sistemas de recomendación, búsqueda semántica y los modelos de lenguaje.
El producto punto nos ayuda a medir la relación geométrica entre dos vectores, devolviendo un escalar en lugar de un vector.
Se debe tener en cuenta una regla: los dos vectores deben tener el mismo número de componentes.
v1 = np.array([10, 20, 30])
v2 = np.array([1, 2, 3])
prod_punto = np.dot(v1, v2) # Resultado: 140 (10*1 + 20*2 + 30*3)
Práctica
Vamos a la práctica. Para esto, haremos un pequeño programa que ayude a un reclutador de una empresa a encontrar los mejores candidatos.
Definiremos dos vectores: uno del perfil ideal y otro de un candidato, donde cada componente es su nivel de habilidades en (Java, SQL, Inglés):
perfil_ideal = np.array([10, 8, 9])
perfil_candidato = np.array([8, 9, 4])
Calcularemos en qué habilidades falla el candidato, para eso usaremos la resta:
error = perfil_ideal - perfil_candidato
print(f"Brecha de habilidades: {error}") # [2, -1, 5] -> Le faltan 2 en Java, le sobra 1 en SQL y le faltan 5 en Inglés.
Ahora usaremos la norma para saber que qué grande es el error total:
distancia_error = np.linalg.norm(error)
print(f"Magnitud del error total: {distancia_error:.2f}")
Si calculamos la norma de la resta, obtenemos la distancia euclidiana.
Lo siguiente es normalizar los datos para que trabajen en la misma proporción. Aquí usaremos la norma convirtiendo los vectores en vectores unitarios:
perfil_ideal_unit = perfil_ideal / np.linalg.norm(perfil_ideal)
perfil_cand_unit = perfil_candidato / np.linalg.norm(perfil_candidato)
print(f"Perfil ideal normalizado: {perfil_ideal_unit}")
Y por último, haremos uso del producto punto con la similitud del coseno para saber que tan parecidos son, donde 1 es idéntico y 0 es diferente.
similitud = np.dot(perfil_ideal_unit, perfil_cand_unit)
print(f"Similitud: {similitud:.4f}")
Resumen
- La resta nos ayuda a medir qué tan lejos estamos de la meta.
Realidad - Predicción = Error. - La norma es cuánto mide un vector (su intensidad).
- El producto punto multiplica los componentes y los suma.