Friday 24 November 2017

Movimiento Promedio Pylab


Hemos introducido previamente cómo crear promedios móviles usando python. Este tutorial será una continuación de este tema. Un promedio móvil en el contexto de la estadística, también llamado promedio de balanceo / funcionamiento, es un tipo de respuesta de impulso finito. En nuestro tutorial anterior hemos trazado los valores de los arrays xyy: Let8217s traza x en contra de la media móvil de y que llamaremos yMA: Primero, let8217s ecualizar la longitud de ambos arrays: Y para mostrar esto en contexto: Gráfico: Para ayudar a entender esto, let8217s trazar dos relaciones diferentes: x vs yy x vs MAy: El promedio móvil aquí es la parcela verde que comienza a las 3: Compartir esto: Como este: Navegación de los artículos relacionados Deja un comentario Cancelar respuesta Very useful Me gustaría leer la última parte sobre grandes conjuntos de datos Espero que llegue pronto 8230 d bloggers como este: Los siguientes ejemplos produce una media móvil de los valores anteriores WINDOW. Truncan los primeros valores (WINDOW -1) ya que no podemos encontrar el promedio antes de ellos. (El comportamiento predeterminado para la convolución es asumir que los valores antes del inicio de nuestra secuencia son 0). (Más formalmente, construimos la secuencia y para la secuencia x donde yi (xi x (i1) 8230. x (in)) / n) Esto hace uso de la función de convolución numpy8217s. Esta es una operación de media móvil de propósito general. Cambiar las ponderaciones hace que algunos valores más importantes compensen apropiadamente le permite ver el promedio como alrededor del punto en vez de antes del punto. En lugar de truncar los valores podemos fijar los valores iniciales en su lugar, como se ilustra en este ejemplo: Como este: Navegación de artículos relacionados Deja un comentario Cancelar respuesta Gracias por la punta, me pareció útil Tienes un ligero error en tu ejemplo de valor inicial fijo : 8220extendeddata8221 debe ser el que se convolve, no 8220data8221. Gracias por notar que I8217ve enmendó el ejemplo. Un buen consejo, gracias. Sabía que tenía que haber una forma optimizada para calcular los promedios de rodadura. Desde los documentos (docs. scipy. org/doc/numpy/reference/generated/numpy. convolve. html), parece que su receta podría ser aún más concisa usando la palabra clave mode8221valid8221 en lugar de cortar: gtgtgt WINDOW 10 gtgtgt data 1 , 2,3,4,5,5,5,5,5,5,5,5,5,5,5 gtgtgt ponderaciones numpy. repeat (1.0, WINDOW) / WINDOW gtgtgt numpy. convolve (datos, ponderaciones) WINDOW (4. 4.4, 4.7, 4.9, 5. 5.) gtgtgt numpy. convolve (datos, ponderaciones, 8216valid8217) matriz (4. 4.4, 4.7, 4.9, 5. 5.) UPD: Alleo y jasaarim han propuesto soluciones más eficientes. Puede utilizar np. convolve para eso: El argumento mode especifica cómo manejar los bordes. He elegido el modo válido aquí, porque creo que es cómo la mayoría de la gente espera correr significa trabajar, pero usted puede tener otras prioridades. Aquí está una trama que ilustra la diferencia entre los modos: respondió Mar 24 14 at 22:01 Me gusta esta solución porque es limpio (una línea) y relativamente eficiente (trabajo realizado dentro de numpy). Pero Alleo39s quotEfficient solutionquot usando numpy. cumsum tiene una mejor complejidad. Ndash Ulrich Stern Sep 25 15 at 0:31 Usted puede calcular una media corriendo con: Afortunadamente, numpy incluye una función de convolución que podemos utilizar para acelerar las cosas. La media de ejecución es equivalente a convertir x con un vector que es N largo, con todos los miembros iguales a 1 / N. La implementación numpy de convolve incluye el transitorio inicial, por lo que tienes que eliminar los primeros N-1 puntos: En mi máquina, la versión rápida es 20-30 veces más rápida, dependiendo de la longitud del vector de entrada y el tamaño de la ventana de promedio . Tenga en cuenta que convolve no incluye un mismo modo que parece que debe abordar el problema transitorio de inicio, pero se divide entre el principio y el final. Elimina el transitorio del final, y el principio no tiene uno. Bueno, supongo que es una cuestión de prioridades, no necesito el mismo número de resultados a expensas de conseguir una pendiente hacia cero que no está ahí en los datos. BTW, aquí está un comando para mostrar la diferencia entre los modos: modos (39full39, 39same39, 39valid39) trama (convolve (unos 200,)), unos (50,)) (-10, 251, -.1, 1.1) leyenda (modos, loc39lower center39) (con pyplot y numpy importados). Ndash lapis Mar 24 14 at 13:56 pandas es más adecuado para esto que NumPy o SciPy. Su función rollingmean hace el trabajo convenientemente. También devuelve una matriz NumPy cuando la entrada es una matriz. Es difícil batir el rollingmean en funcionamiento con cualquier puesta en práctica pura de Python de encargo. Aquí hay un ejemplo de rendimiento frente a dos de las soluciones propuestas: También hay buenas opciones en cuanto a cómo tratar con los valores de borde. I39m siempre molestos por la función de procesamiento de señal que devuelven señales de salida de diferente forma que las señales de entrada cuando ambas entradas y salidas son de la misma naturaleza (por ejemplo ambas señales temporales). Rompe la correspondencia con variables independientes relacionadas (por ejemplo, tiempo, frecuencia) haciendo que el trazado o la comparación no sea una cuestión directa. De todos modos, si compartes la sensación, podrías querer cambiar las últimas líneas de la función propuesta como ynp. convolve (w / w. sum (), s, mode39same39) return ywindowlen-1 :-( windowlen-1) ndash Christian Un poco tarde para la fiesta, pero he hecho mi propia pequeña función que no envuelve alrededor de los extremos o almohadillas con ceros que luego se utilizan para encontrar el promedio también. Como un tratamiento adicional, es que también vuelve a muestrear la señal en puntos linealmente espaciados. Personaliza el código a voluntad para obtener otras funciones. El método es una simple multiplicación matricial con un núcleo gaussiano normalizado. Un uso simple en una señal sinusoidal con el ruido distribuido normal agregado: lapis sí, pero deja para decir que usted utiliza el método del cumsum en la primera marca de fábrica y ahorra su arsenal del balanceo medio para la garrapata siguiente. Cada garrapata a partir de entonces sólo tiene que añadir el último valor de la media móvil a su matriz rodante en el almacenamiento. Usando este método no se vuelven a calcular las cosas que ya se han calculado: En la primera marca que cumsum a continuación, sólo se añade el quotmean de los últimos elementos del período que es 2 veces más rápido para todas las garrapatas subsiguientes. Ndash litepresence Jun 10 at 12:29 Si usted elige rodar su propio, en lugar de utilizar una biblioteca existente, por favor, sea consciente de error de punto flotante y tratar de minimizar sus efectos: Si todos sus valores son más o menos el mismo orden de magnitud, Entonces esto ayudará a preservar la precisión agregando siempre valores de magnitudes aproximadamente similares. En mi última oración estaba tratando de indicar por qué ayuda a error de punto flotante. Si dos valores son aproximadamente el mismo orden de magnitud, a continuación, agregarlos pierde menos precisión que si agregó un número muy grande a uno muy pequeño. El código combina valores quotadjacentquot de una manera que incluso las sumas intermedias siempre deben estar razonablemente cerca en magnitud, para minimizar el error de punto flotante. Nada es infalible, pero este método ha salvado un par de proyectos muy mal implementados en la producción. Ndash Mayur Patel dic 15 14 at 17:22 Alleo: En lugar de hacer una adición por valor, you39ll estar haciendo dos. La prueba es la misma que el problema de desplazamiento de bits. Sin embargo, el punto de esta respuesta no es necesariamente rendimiento, sino precisión. El uso de la memoria para calcular el promedio de valores de 64 bits no excedería de 64 elementos en la memoria caché, por lo que también es amigable en el uso de memoria. Ndash Mayur Patel dic 29 14 a las 17:04

No comments:

Post a Comment