Capítulo 4. Aplicaciones vectoriales

Este trabajo se ha traducido utilizando IA. Agradecemos tus opiniones y comentarios: translation-feedback@oreilly.com

Mientras trabajabas en los dos capítulos anteriores, puede que sintieras que parte del material era esotérico y abstracto. Tal vez pensaste que el reto de aprender álgebra lineal no te compensaría a la hora de comprender las aplicaciones del mundo real en la ciencia de datos y el aprendizaje automático.

Espero que este capítulo te disipe esas dudas. En este capítulo aprenderás cómo se utilizan los vectores y las operaciones vectoriales en los análisis de la ciencia de datos. Y podrás ampliar estos conocimientos trabajando con los ejercicios.

Correlación y similitud del coseno

La correlación es uno de los métodos de análisis más fundamentales e importantes de la estadística y el aprendizaje automático. Un coeficiente de correlación es un único número que cuantifica la relación lineal entre dos variables. Los coeficientes de correlación van de -1 a +1, donde -1 indica una relación negativa perfecta, +1 una relación positiva perfecta y 0 indica que no hay relación lineal. La Figura 4-1 muestra algunos ejemplos de pares de variables y sus coeficientes de correlación.

Correlation examples
Figura 4-1. Ejemplos de datos que muestran correlación positiva, correlación negativa y correlación cero. El panel inferior derecho ilustra que la correlación es una medida lineal; pueden existir relaciones no lineales entre variables aunque su correlación sea cero.

En el Capítulo 2, mencioné que el producto punto interviene en el coeficiente de correlación, y que la magnitud del producto punto está relacionada con la magnitud de los valores numéricos de los datos (recuerda la discusión sobre el uso de gramos frente a libras para medir el peso). Por lo tanto, el coeficiente de correlación requiere algunas normalizaciones para estar en el rango esperado de -1 a +1. Esas dos normalizaciones son

Media centro cada variable

Centrar la media significa restar el valor medio de cada valor de los datos.

Divide el producto punto por el producto de las normas vectoriales

Esta normalización divisoria anula las unidades de medida y escala la máxima magnitud de correlación posible a |1|.

La ecuación 4-1 muestra la fórmula completa del coeficiente de correlación de Pearson.

Ecuación 4-1. Fórmula del coeficiente de correlación de Pearson
ρ = i=1 n (x i -x ¯)(y i -y ¯) i=1 n (x i -x ¯) 2 i=1 n (y i -y ¯) 2

Puede que no resulte obvio que la correlación es simplemente tres productos de puntos. La ecuación 4-2 muestra esta misma fórmula reescrita utilizando la notación de productos de puntos del álgebra lineal. En esta ecuación 𝐱 ˜ es la versión centrada en la media de 𝐱 (es decir, la variable 𝐱 con la normalización nº 1 aplicada).

Ecuación 4-2. La correlación de Pearson expresada en el lenguaje del álgebra lineal
ρ = 𝐱 ˜ T 𝐲 ˜ 𝐱 ˜𝐲 ˜

Así que ahí lo tienes: el famoso y ampliamente utilizado coeficiente de correlación de Pearson es simplemente el producto punto entre dos variables, normalizado por las magnitudes de las variables. (Por cierto, también puedes ver en esta fórmula que si las variables están normalizadas unitariamente de forma que 𝐱 = 𝐲 = 1 entonces su correlación es igual a su producto punto. (Recuerda del Ejercicio 2-6 que 𝐱 = 𝐱 T 𝐱 .)

La correlación no es la única forma de evaluar la similitud entre dos variables. Otro método se denomina similitud coseno. La fórmula de la similitud coseno es simplemente la fórmula geométrica del producto punto(Ecuación 2-11), resuelta para el término coseno:

cos ( θ x,y ) = α 𝐱𝐲

donde α es el producto punto entre 𝐱 y 𝐲 .

Puede parecer que la correlación y la similitud del coseno son exactamente la misma fórmula. Sin embargo, recuerda que la Ecuación 4-1 es la fórmula completa, mientras que la Ecuación 4-2 es una simplificación bajo el supuesto de que las variables ya se han centrado en la media. Por tanto, la similitud del coseno no implica el primer factor de normalización.

A partir de este apartado, puedes entender por qué la correlación de Pearson y la similitud del coseno reflejan la relación lineal entre dos variables: se basan en el producto punto, y el producto punto es una operación lineal.

Hay cuatro ejercicios de codificación asociados a esta sección, que aparecen al final del capítulo. Puedes elegir si quieres resolver esos ejercicios antes de leer la siguiente sección, o seguir leyendo el resto del capítulo y luego trabajar con los ejercicios. (Mi recomendación personal es lo primero, ¡pero tú eres el dueño de tu destino de álgebra lineal!)

Filtrado de Series Temporales y Detección de Características

El producto punto también se utiliza en el filtrado de series temporales. El filtrado es esencialmente un método de detección de características, por el que una plantilla -llamada núcleo en la jerga del filtrado- se compara con partes de una señal de series temporales, y el resultado del filtrado es otra serie temporal que indica en qué medida las características de la señal coinciden con las características del núcleo. Los núcleos se construyen cuidadosamente para optimizar ciertos criterios, como fluctuaciones suaves, perímetros afilados, formas de onda particulares, etc.

El mecanismo del filtrado consiste en calcular el producto punto entre el núcleo y la señal de la serie temporal. Pero el filtrado suele requerir la detección de características locales, y el núcleo suele ser mucho más corto que toda la serie temporal. Por tanto, calculamos el producto punto entre el núcleo y un breve fragmento de los datos de la misma longitud que el núcleo. Este procedimiento produce un punto temporal en la señal filtrada(Figura 4-2), y luego el núcleo se desplaza un paso temporal hacia la derecha para calcular el producto punto con un segmento de señal diferente (solapado). Formalmente, este procedimiento se denomina convolución e implica algunos pasos adicionales que voy a omitir para centrarme en la aplicación del producto punto en el procesamiento de señales.

Time series filtering
Figura 4-2. Ilustración del filtrado de series temporales

El filtrado temporal es un tema importante en la ciencia y la ingeniería. De hecho, sin filtrado temporal no habría música, radio, telecomunicaciones, satélites, etc. Y sin embargo, el corazón matemático que mantiene tu música bombeando es el producto vectorial punto.

En los ejercicios del final del capítulo, descubrirás cómo se utilizan los productos de puntos para detectar características (perímetros) y suavizar datos de series temporales.

Agrupación dek-Means

La agrupación de k-means es un método no supervisado de clasificación de datos multivariantes en un número relativamente pequeño de grupos, o categorías, basado en la minimización de la distancia al centro del grupo.

La agrupación de k-means es un importante método de análisis en el aprendizaje automático, y existen sofisticadas variantes de la agrupación de k-means. Aquí implementaremos una versión sencilla de k-means, con el objetivo de ver cómo se utilizan los conceptos sobre vectores (en particular: vectores, normas vectoriales y difusión) en el algoritmo k-means.

Aquí tienes una breve descripción del algoritmo que vamos a escribir:

  1. Inicializa k centroides como puntos aleatorios en el espacio de datos. Cada centroide es una clase, o categoría, y los pasos siguientes asignarán cada observación de datos a cada clase. (Un centroide es un centro generalizado a cualquier número de dimensiones).

  2. Calcula la distancia euclídea entre cada observación de datos y cadacentroide.1

  3. Asigna cada observación de datos al grupo con el centroide más cercano.

  4. Actualiza cada centroide como la media de todas las observaciones de datos asignadas a ese centroide.

  5. Repite los pasos 2-4 hasta que se cumpla un criterio de convergencia, o durante N iteraciones.

Si te sientes cómodo con la codificación en Python y quieres poner en práctica este algoritmo, te animo a que lo hagas antes de continuar. A continuación, trabajaremos con las matemáticas y el código de cada uno de estos pasos, centrándonos especialmente en el uso de vectores y la transmisión en NumPy. También probaremos el algoritmo utilizando datos 2D generados aleatoriamente para confirmar que nuestro código es correcto.

Empecemos por el paso 1: inicializar k centroides de conglomerados aleatorios. k es un parámetro de la agrupación k-means; en datos reales, es difícil determinar el k óptimo, pero aquí fijaremos k = 3. Hay varias formas de inicializar los centroides aleatorios de los conglomerados; para simplificar las cosas, seleccionaré aleatoriamente k muestras de datos para que sean centroides. Los datos están contenidos en la variable data (esta variable es 150 × 2, correspondiente a 150 observaciones y 2 características) y se visualizan en el panel superior izquierdo de la Figura 4-3 (el código en línea muestra cómo generar estos datos):

k = 3
ridx = np.random.choice(range(len(data)),k,replace=False)
centroids = data[ridx,:] # data matrix is samples by features

Ahora el paso 2: calcular la distancia entre cada observación de datos y cada centroide de conglomerado. Aquí es donde utilizamos los conceptos de álgebra lineal que aprendiste en los capítulos anteriores. Para una observación de datos y un centroide, la distancia euclídea se calcula como

δ i,j = (d i x -c j x ) 2 + (d i y -c j y ) 2

donde δ i,j indica la distancia de la observación de datos i al centroide j, dxi es la característica x de la i-ésimaobservación de datos, y cxj es la coordenada del eje x del centroide j.

Podrías pensar que este paso debe implementarse utilizando un bucle doble for: un bucle sobre k centroides y un segundo bucle sobre N observaciones de datos (incluso podrías pensar en un tercer bucle for sobre las características de los datos). Sin embargo, podemos utilizar vectores y difusión para que esta operación sea compacta y eficaz. Éste es un ejemplo de cómo el álgebra lineal suele tener un aspecto diferente en las ecuaciones que en el código:

dists = np.zeros((data.shape[0],k))
for ci in range(k):
  dists[:,ci] = np.sum((data-centroids[ci,:])**2,axis=1)

Pensemos en los tamaños de estas variables: data es 150 × 2 (observaciones por características) y centroids[ci,:] es 1 × 2 (cluster ci por características). Formalmente, no es posible restar estos dos vectores. Sin embargo, Python implementará la emisión repitiendo los centroides de los clusters 150 veces, restando así el centroide de cada observación de datos. La operación de exponente ** se aplica elemento a elemento, y la entrada axis=1 indica a Python que sume a través de las columnas (separadamente por fila). Así, la salida de np.sum() será una matriz de 150 × 1 que codifica la distancia euclidiana de cada punto al centroide ci.

Tómate un momento para comparar el código con la fórmula de la distancia. ¿Son realmente iguales? De hecho, no lo son: en el código falta la raíz cuadrada en la distancia euclidiana. Entonces, ¿está mal el código? Piénsalo un momento; más adelante discutiré la respuesta.

El paso 3 consiste en asignar cada observación de datos al grupo con la distancia mínima. Este paso es bastante compacto en Python, y puede implementarse utilizando una sola función:

groupidx = np.argmin(dists,axis=1)

Observa la diferencia entre np.min, que devuelve el valor mínimo, frente a np.argmin, que devuelve el índice en el que se produce el mínimo.

Ahora podemos volver a la incoherencia entre la fórmula de la distancia y su implementación en código. Para nuestro algoritmo k-means, utilizamos la distancia para asignar cada punto de datos a su centroide más cercano. La distancia y la distancia al cuadrado están relacionadas monotónicamente, por lo que ambas métricas dan la misma respuesta. Añadir la operación de raíz cuadrada aumenta la complejidad del código y el tiempo de cálculo sin repercutir en los resultados, por lo que simplemente puede omitirse.

El paso 4 consiste en volver a calcular los centroides como la media de todos los puntos de datos dentro de la clase. Aquí podemos hacer un bucle sobre los k clusters, y utilizar la indexación de Python para encontrar todos los puntos de datos asignados a cada cluster:

for ki in range(k):
  centroids[ki,:] = [ np.mean(data[groupidx==ki,0]),
                      np.mean(data[groupidx==ki,1])  ]

Por último, el Paso 5 consiste en poner los pasos anteriores en un bucle que itera hasta obtener una buena solución. En los algoritmos k-means a nivel de producción, las iteraciones continúan hasta que se alcanza un criterio de parada, por ejemplo, que los centroides de los clusters ya no se muevan. Para simplificar, aquí iteraremos tres veces (un número arbitrario seleccionado para que el gráfico sea visualmente equilibrado).

Los cuatro paneles de la Figura 4-3 muestran los centroides aleatorios iniciales de los conglomerados (iteración 0), y sus ubicaciones actualizadas después de cada una de las tres iteraciones.

Si estudias los algoritmos de agrupación, aprenderás métodos sofisticados para la inicialización del centroide y los criterios de parada, así como métodos cuantitativos para seleccionar un parámetro k adecuado. No obstante, todos los métodos de k-means son esencialmente extensiones del algoritmo anterior, y el álgebra lineal está en el centro de sus implementaciones.

k-means
Figura 4-3. k-means

Ejercicios de codificación

Ejercicios de correlación

Ejercicio 4-1.

Escribe una función Python que tome dos vectores como entrada y proporcione dos números como salida: el coeficiente de correlación de Pearson y el valor de similitud del coseno. Escribe un código que siga las fórmulas presentadas en este capítulo; no llames simplemente a np.corrcoef y spatial.distance.cosine. Comprueba que los dos valores de salida son idénticos cuando las variables ya están centradas en la media y diferentes cuando las variables no están centradas en la media.

Ejercicio 4-2.

Sigamos explorando la diferencia entre correlación y similitud coseno. Crea una variable que contenga los números enteros del 0 al 3, y una segunda variable igual a la primera más algún desplazamiento. A continuación, crearás una simulación en la que varíes sistemáticamente ese desplazamiento entre -50 y +50 (es decir, la primera iteración de la simulación tendrá la segunda variable igual a [-50, -49, -48, -47]). En un bucle for, calcula la correlación y la similitud del coseno entre las dos variables y almacena estos resultados. A continuación, haz un gráfico de líneas que muestre cómo se ven afectadas la correlación y la similitud coseno por el desplazamiento medio. Deberías poder reproducir la Figura 4-4.

Cor and cos
Figura 4-4. Resultados del Ejercicio 4-2
Ejercicio 4-3.

Existen varias funciones de Python para calcular el coeficiente de correlación de Pearson. Una de ellas se llama pearsonr y se encuentra en el módulo stats de la biblioteca SciPy. Abre el código fuente de este archivo (pista: ??functionname) y asegúrate de que entiendes cómo la implementación de Python se corresponde con las fórmulas introducidas en este capítulo.

Ejercicio 4-4.

¿Por qué necesitas codificar tus propias funciones cuando ya existen en Python? Parte de la razón es que escribir tus propias funciones tiene un enorme valor educativo, porque ves que (en este caso) la correlación es un simple cálculo y no un algoritmo de caja negra increíblemente sofisticado que sólo un doctor en informática podría entender. Pero otra razón es que las funciones incorporadas a veces son más lentas debido a las innumerables comprobaciones de entrada, al manejo de opciones de entrada adicionales, a la conversión de tipos de datos, etc. Esto aumenta la facilidad de uso, pero a costa del tiempo de cálculo.

Tu objetivo en este ejercicio es determinar si tu propia función de correlación básica es más rápida que la función corrcoef de NumPy. Modifica la función del Ejercicio 4-2 para calcular sólo el coeficiente de correlación. A continuación, en un bucle for sobre 1.000 iteraciones, genera dos variables de 500 números aleatorios y calcula la correlación entre ellas. Cronometra el bucle for. A continuación, repítelo pero utilizando np.corrcoef. En mis pruebas, la función personalizada fue aproximadamente un 33% más rápida que np.corrcoef. En estos ejemplos de juguete, las diferencias se miden en milisegundos, pero si estás ejecutando miles de millones de correlaciones con grandes conjuntos de datos, ¡esos milisegundos realmente suman! (Ten en cuenta que escribir tus propias funciones sin comprobaciones de entrada tiene el riesgo de errores de entrada que serían detectados por np.corrcoef.) (Ten en cuenta también que la ventaja de la velocidad se reduce con vectores grandes. ¡Pruébalo!)

Ejercicios de filtrado y detección de rasgos

Ejercicio 4-5.

Construyamos un detector de perímetros. El núcleo de un detector de perímetros es muy sencillo: [-1 +1]. El producto punto de ese núcleo con un fragmento de una señal de serie temporal con valor constante (por ejemplo, [10 10]) es 0. Pero ese producto punto es grande cuando la señal tiene un cambio pronunciado (por ejemplo, [1 10] produciría un producto punto de 9). La señal con la que trabajaremos es una función meseta. Los gráficos A y B de la Figura 4-5 muestran el núcleo y la señal. El primer paso de este ejercicio es escribir el código que crea estas dos series temporales.

What does this do?
Figura 4-5. Resultados del Ejercicio 4-5

A continuación, escribe un bucle for sobre los puntos temporales de la señal. En cada punto temporal, calcula el producto punto entre el núcleo y un segmento de los datos de la serie temporal que tenga la misma longitud que el núcleo. Deberías obtener un gráfico parecido al gráfico C de la Figura 4-5. (Observa que nuestro detector de perímetro devolvía 0 cuando la señal era plana, +1 cuando la señal saltaba hacia arriba y -1 cuando la señal saltaba hacia abajo.

Siéntete libre de seguir explorando este código. Por ejemplo, ¿cambia algo si rellenas el núcleo con ceros ([0 -1 1 0])? ¿Y si volteas el núcleo para que sea [1 -1]? ¿Y si el núcleo es asimétrico ([-1 2])?

Ejercicio 4-6.

Ahora repetiremos el mismo procedimiento pero con una señal y un núcleo diferentes. El objetivo será suavizar una serie temporal rugosa. La serie temporal serán 100 números aleatorios generados a partir de una distribución gaussiana (también llamada distribución normal). El kernel será una función en forma de campana que se aproxime a una función gaussiana, definida como los números [0, .1, .3, .8, 1, .8, .3, .1, 0] pero escalada de modo que la suma sobre el kernel sea 1. Tu kernel debería coincidir con el gráfico A de la Figura 4-6, aunque tu señal no se parecerá exactamente al gráfico B debido a los números aleatorios.

Copia y adapta el código del ejercicio anterior para calcular la serie temporal deslizante de productos de puntos, la señal filtrada por el núcleo gaussiano. Atención: ten en cuenta la indexación en el bucle for. El gráfico C de la Figura 4-6 muestra un ejemplo de resultado. Puedes ver que la señal filtrada es una versión suavizada de la señal original. Esto también se denomina filtrado de paso bajo.

Exercise 4-6
Figura 4-6. Resultados del Ejercicio 4-6
Ejercicio 4-7.

Sustituye el 1 del centro del núcleo por -1 y centra el núcleo en la media. A continuación, vuelve a ejecutar el código de filtrado y trazado. ¿Cuál es el resultado? ¡En realidad acentúa los rasgos agudos! De hecho, este núcleo es ahora un filtro de paso alto, lo que significa que amortigua los rasgos suaves (de baja frecuencia) y resalta los rasgos que cambian rápidamente (de alta frecuencia).

Ejerciciosk-Means

Ejercicio 4-8.

Una forma de determinar un k óptimo es repetir la agrupación varias veces (cada vez utilizando centroides de conglomerados inicializados aleatoriamente) y evaluar si la agrupación final es igual o diferente. Sin generar nuevos datos, vuelve a ejecutar el código k-means varias veces utilizando k = 3 para ver si los conglomerados resultantes son similares (se trata de una evaluación cualitativa basada en la inspección visual). ¿Parecen similares en general las asignaciones finales de los conglomerados, aunque los centroides se seleccionen al azar?

Ejercicio 4-9.

Repite las agrupaciones múltiples utilizando k = 2 y k = 4. ¿Qué opinas de estos resultados?

1 Recordatorio: La distancia euclídea es la raíz cuadrada de la suma de las distancias al cuadrado desde la observación de los datos hasta el centroide.

Get Álgebra lineal práctica para la ciencia de datos now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.