En el análisis de señales y series temporales, una de las tareas más comunes es medir la similitud entre dos conjuntos de datos. Este proceso, conocido como correlación cruzada, es fundamental para identificar patrones recurrentes, determinar retrasos entre señales o realizar comparaciones en áreas como el procesamiento de audio, meteorología y finanzas. Sin embargo, calcular la correlación cruzada puede ser complicado, especialmente cuando se manejan grandes volúmenes de datos. Afortunadamente, en NumPy existe la función np.correlate() con la que se simplifica esta tarea.
En esta entrada, se explicará qué es la correlación cruzada, cómo utilizar np.correlate() para calcularla y se presentarán ejemplos prácticos que demuestran su utilidad.
Tabla de contenidos
La correlación cruzada (también conocida como covarianza cruzada) es una medida matemática que evalúa la similitud entre dos señales o series temporales considerando un desplazamiento temporal (o lag). Permitiendo determinar si una señal y está alienada con otra x. Siendo una medida que se utiliza habitualmente para detectar patrones, analizar sincronización y estudiar relaciones temporales entre señales.
Matemáticamente, la correlación cruzada entre dos señales x e y se define como: R(\tau) = \sum_{i=0}^{n-1} x[i] \cdot y[i+\tau], donde:
Un valor alto de R(\tau) indica una fuerte alineación entre las dos señales en el desplazamiento temporal (o lag) \tau.
La correlación cruzada es una herramienta clave para:
np.correlate() en NumPyLa función np.correlate() de NumPy permite calcular fácilmente la correlación cruzada entre dos arrays, siendo un método eficiente para el análisis de señales y series temporales.
np.correlate()La sintaxis de la función np.correlate() es:
np.correlate(x, y, mode='valid')
Los principales parámetros de esta función son:
x: Primer array o señal de entrada.y: Segundo array o señal con la que se comparará.mode: Define cómo se calcula el tamaño del resultado. Puede tomar los siguientes valores: valid (por defecto): Calcula la correlación cruzada considerando únicamente los valores para los que ambas señales se solapan completamente. El resultado es un array más pequeño que las señales originales.same: Devuelve un resultado del mismo tamaño que el array más grande, centrando el cálculo de la correlación.full: Calcula la correlación cruzada completa, incluyendo todos los desplazamientos posibles, tanto positivos como negativos. El resultado de esta opción es el array más largo posible.Supongamos que se desea calcular la similitud entre dos señales simples. La implementación con np.correlate() sería:
import numpy as np # Definimos dos señales x = np.array([1, 2, 3]) y = np.array([0, 1, 0.5]) # Calculamos la correlación cruzada result = np.correlate(x, y, mode='full') print(result)
[0.5 2. 3.5 3. 0. ]
En este ejemplo, el resultado, [0.5, 2, 3.5, 3, 0], representa la similitud entre x y y en cada posible desplazamiento. Por ejemplo:
0.5) corresponde al solapamiento cuando y está desplazado completamente a la derecha.3.5) indica el solapamiento máximo, donde ambas señales están perfectamente alineadas.El parámetro mode define la cantidad de información que se desea analizar:
valid.same.full.Un enfoque que se puede utilizar para adaptar el cálculo de la correlación cruzada a las necesidades específicas de cada análisis.
np.correlate() en NumPyA continuación, se muestran tres aplicaciones prácticas donde se calcula la correlación cruzada con np.correlate(). Mostrando cómo esta herramienta puede ser utilizada en diferentes contextos.
Supongamos que se dispone de registros de temperatura de dos estaciones meteorológicas y se desea determinar si existe un retraso (lag) entre ambas medidas. El código para realizar este análisis seria como el siguiente:
import numpy as np
# Señales de temperatura de las estaciones
station1 = np.array([15, 18, 21, 20, 19])
station2 = np.array([21, 20, 19, 15, 18])
# Calcular la correlación cruzada
lag_correlation = np.correlate(station1, station2, mode='full')
# Determinar el desplazamiento (lag) con mayor correlación
max_lag = np.argmax(lag_correlation) - (len(station2) - 1)
print(f"Desplazamiento con mayor correlación: {max_lag}") Desplazamiento con mayor correlación: 0
En este ejemplo:
max_lag) indica cuántos intervalos hay entre las señales para que estén más alineadas.Este análisis es particularmente útil en meteorología para:
Para profundizar, se podría graficar la correlación cruzada para observar cómo varía la similitud con el desplazamiento:
import matplotlib.pyplot as plt
# Ejes para el desplazamiento
lags = np.arange(-len(station2) + 1, len(station1))
# Graficar la correlación cruzada
plt.plot(lags, lag_correlation)
plt.title("Correlación cruzada entre señales")
plt.xlabel("Desplazamiento (Lag)")
plt.ylabel("Correlación")
plt.grid(True)
plt.show() Este gráfico proporciona una representación visual que facilita identificar el desplazamiento óptimo.
Supóngase ahora que se están analizando datos de ventas semanales de un producto y se desea determinar cómo estas ventas están relacionadas con una campaña publicitaria realizada durante el mismo período. En este supuesto se puede usar la correlación cruzada para identificar patrones y evaluar si existe una respuesta significativa a la campaña en momentos específicos.
import numpy as np
# Ventas semanales y datos de la campaña publicitaria
sales = np.array([100, 200, 300, 400, 500]) # Ventas semanales
ad_campaign = np.array([0, 1, 0.5, 0, 1]) # Intensidad de la campaña
# Calcular la correlación cruzada
pattern_correlation = np.correlate(sales, ad_campaign, mode='same')
print("Correlación con campaña publicitaria:", pattern_correlation) Correlación con campaña publicitaria: [350. 600. 850. 500. 650.]
El resultado de la correlación cruzada indica cómo las ventas responden a la campaña en diferentes intervalos temporales:
Este tipo de análisis es útil en diversos contextos:
Se pueden graficar los resultados de la correlación cruzada para identificar más fácilmente el momento de mayor impacto:
import matplotlib.pyplot as plt
# Generar los desplazamientos (lags)
lags = np.arange(-(len(ad_campaign)//2), len(ad_campaign)//2 + 1)
# Graficar la correlación cruzada
plt.stem(lags, pattern_correlation, use_line_collection=True)
plt.title("Correlación cruzada: Ventas y campaña publicitaria")
plt.xlabel("Desplazamiento (Lag)")
plt.ylabel("Correlación")
plt.grid(True)
plt.show() El gráfico mostrará los valores de correlación en función del desplazamiento. El desplazamiento con el valor más alto representa el intervalo óptimo en el que las ventas están más alineadas con la intensidad de la campaña.
Esta herramienta no solo identifica patrones, sino que también ayuda a tomar decisiones informadas, cómo ajustar el cronograma de futuras campañas o analizar la efectividad de estrategias pasadas.
En el procesamiento de audio, la correlación cruzada es una técnica esencial para detectar similitudes entre fragmentos de sonido. Esto es útil en aplicaciones como la identificación de ecos, el análisis de ruido recurrente, y la detección de retrasos entre señales (por ejemplo, en sistemas de audio multicanal).
Supongamos que se dispone de dos señales de audio, y se quiere medir cuán similares son en función del tiempo:
import numpy as np
# Señales de audio
signal1 = np.sin(np.linspace(0, np.pi, 100)) # Primera señal (onda sinusoidal)
signal2 = np.sin(np.linspace(0, np.pi, 100) + np.pi/4) # Segunda señal desplazada en fase
# Calcular la correlación cruzada
audio_correlation = np.correlate(signal1, signal2, mode='full')
# Obtener el desplazamiento con máxima correlación
lags = np.arange(-(len(signal1)-1), len(signal1))
max_lag = lags[np.argmax(audio_correlation)]
print(f"Desplazamiento con máxima correlación: {max_lag}") Desplazamiento con máxima correlación: 20
El resultado se puede interpretar como:
Este tipo de análisis es de gran utilidad en diferentes contextos como:
Para comprender mejor los resultados, se puede graficar la correlación cruzada y destacar el desplazamiento con máxima similitud:
import matplotlib.pyplot as plt
# Graficar la correlación cruzada
plt.plot(lags, audio_correlation)
plt.axvline(x=max_lag, color='red', linestyle='--', label=f"Máxima correlación (lag={max_lag})")
plt.title("Correlación cruzada entre señales de audio")
plt.xlabel("Desplazamiento (Lag)")
plt.ylabel("Correlación")
plt.legend()
plt.grid(True)
plt.show() El gráfico mostrará una curva con picos, donde el pico más alto representa el desplazamiento óptimo. En este ejemplo, si el máximo ocurre en un lag negativo, significa que la segunda señal está adelantada respecto a la primera. Si es positivo, indica un retraso.
Estos ejemplos muestran cómo np.correlate() se puede aplicar en distintos campos, desde meteorología hasta marketing y procesamiento de audio, siendo una herramienta importante para analizar similitudes y relaciones entre señales.
Antes de calcular la correlación cruzada con NumPy, es importante tener en cuenta los siguientes aspectos clave para obtener resultados más precisos y útiles:
# Normalización de señales x_norm = (x - np.mean(x)) / np.std(x) y_norm = (y - np.mean(y)) / np.std(y) # Cálculo de correlación cruzada normalizada correlation = np.correlate(x_norm, y_norm, mode='full')
Por qué es importante: Esto garantiza que los picos en la correlación sean debidos únicamente a la similitud entre las señales, y no a diferencias en magnitudes absolutas.
scipy.signal.correlate, que pueden manejar cálculos de correlación cruzada de manera más eficiente:from scipy.signal import correlate # Correlación cruzada optimizada optimized_correlation = correlate(x, y, mode='full')
Cuándo usarlo: Si estás trabajando con señales extensas o realizando múltiples cálculos, esta alternativa puede reducir significativamente los tiempos de procesamiento.
import matplotlib.pyplot as plt
plt.plot(correlation)
plt.title("Correlación cruzada entre señales")
plt.xlabel("Desplazamiento (Lag)")
plt.ylabel("Correlación")
plt.grid(True)
plt.show() Beneficio: Una visualización clara puede revelar relaciones ocultas entre señales, como retrasos o periodicidad.
La correlación cruzada es una herramienta importante para analizar similitudes y relaciones temporales entre señales. Usar np.correlate() facilita este cálculo de manera eficiente y directa, mientras que su combinación con técnicas de normalización, optimización y visualización mejora la precisión y la comprensión de los resultados.
Entre las aplicaciones de la correlación cruzada se puede destacar:
Hace poco publiqué una entrada en la que trataba de un sesgo bien documentado: aferrarse…
En un entrada previa explicamos qué son el WOE y el IV y por qué…
Seguimos evolucionando el laboratorio de Analytics Lane y hoy lanzamos la versión 1.1, disponible en:…
“El interés compuesto es la octava maravilla del mundo. El que lo entiende lo gana…
Tienes los datos de ventas de tres productos en dos años distintos y quieres saber…
Imagina la situación. Tu equipo lleva tres años con un modelo en producción. No es…
This website uses cookies.