Saltar al contenido

¿Cómo puedo usar numpy.correlate para hacer autocorrelación?

Esta sección ha sido aprobado por nuestros expertos para garantizar la exactitud de este artículo.

Solución:

Para responder a tu primera pregunta, numpy.correlate(a, v, mode) está realizando la convolución de a con el reverso de v y dando los resultados recortados por el modo especificado. La definición de convolución, C(t)=∑ -∞ < yo < ∞ univt+i donde -∞ < t < ∞, permite resultados de -∞ a ∞, pero obviamente no puede almacenar un número infinitamente largo array. Por lo tanto, debe recortarse, y ahí es donde entra el modo. Hay 3 modos diferentes: completo, igual y válido:

  • el modo “completo” devuelve resultados para cada t donde ambos a y v tener alguna superposición.
  • El modo “mismo” devuelve un resultado con la misma longitud que el vector más corto (a o v).
  • El modo “válido” devuelve resultados solo cuando a y v se superponen completamente entre sí. la documentación para numpy.convolve da más detalles sobre los modos.

Para tu segunda pregunta, creo numpy.correlatees dándote la autocorrelación, también te está dando un poco más. La autocorrelación se usa para encontrar qué tan similar es una señal, o función, a sí misma en una cierta diferencia de tiempo. Con una diferencia de tiempo de 0, la autocorrelación debería ser la más alta porque la señal es idéntica a sí misma, por lo que esperaba que el primer elemento en el resultado de la autocorrelación array sería el más grande. Sin embargo, la correlación no comienza con una diferencia de tiempo de 0. Comienza con una diferencia de tiempo negativa, se cierra en 0 y luego se vuelve positiva. Es decir, estabas esperando:

autocorrelación(a) = ∑ -∞ < yo < ∞ univt+i donde 0 <= t < ∞

Pero lo que obtuviste fue:

autocorrelación(a) = ∑ -∞ < yo < ∞ univt+i donde -∞ < t < ∞

Lo que debe hacer es tomar la última mitad de su resultado de correlación, y esa debería ser la autocorrelación que está buscando. Una función simple de Python para hacer eso sería:

def autocorr(x):
    result = numpy.correlate(x, x, mode='full')
    return result[result.size/2:]

Por supuesto, necesitará una comprobación de errores para asegurarse de que x es en realidad un 1-d array. Además, esta explicación probablemente no sea la más matemáticamente rigurosa. He estado lanzando infinitos porque la definición de convolución los usa, pero eso no se aplica necesariamente a la autocorrelación. Entonces, la parte teórica de esta explicación puede ser un poco torcida, pero esperamos que los resultados prácticos sean útiles. Estas páginas sobre autocorrelación son muy útiles y pueden brindarle una base teórica mucho mejor si no le importa leer la notación y los conceptos pesados.

La autocorrelación viene en dos versiones: estadística y convolución. Ambos hacen lo mismo, excepto por un pequeño detalle: la versión estadística está normalizada para estar en el intervalo [-1,1]. Aquí hay un ejemplo de cómo se hace la estadística:

def acf(x, length=20):
    return numpy.array([1]+[numpy.corrcoef(x[:-i], x[i:])[0,1]  
        for i in range(1, length)])

Utilizar el numpy.corrcoef función en lugar de numpy.correlate para calcular la correlación estadística para un retraso de t:

def autocorr(x, t=1):
    return numpy.corrcoef(numpy.array([x[:-t], x[t:]]))

Sección de Reseñas y Valoraciones

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *