Friday 13 October 2017

Promedio Scipy Promedio


Hmmm, parece que este citar a implementar la función es realmente muy fácil de equivocarse y ha fomentado una buena discusión sobre la eficiencia de la memoria. Me alegro de tener hinchazón si significa saber que algo se ha hecho bien. Ndash Richard Sep 20 14 at 19:23 NumPys carencia de una función específica de dominio específico es quizás debido a la disciplina de los Equipos Core y la fidelidad a NumPys principal directiva: proporcionar un tipo de matriz N-dimensional. Así como funciones para crear e indexar esas matrices. Como muchos objetivos fundacionales, este no es pequeño, y NumPy lo hace brillantemente. La SciPy (mucho) más grande contiene una colección mucho mayor de bibliotecas específicas de dominio (llamadas subpaquetes por SciPy devs), por ejemplo, optimización numérica (optimizar), procesamiento de señal (señal) y cálculo integral (integrar). Mi conjetura es que la función que está después está en por lo menos uno de los subpaquetes de SciPy (scipy. signal quizás) sin embargo, miraría primero en la colección de SciPy scikits. Identificar el (los) científico (s) relevante (s) y buscar la función de interés allí. Scikits son desarrollados independientemente paquetes basados ​​en NumPy / SciPy y dirigidos a una disciplina técnica particular (por ejemplo, scikits-image, scikits-learn, etc.) Varios de estos fueron (en particular, el impresionante OpenOpt para la optimización numérica) Proyectos mucho antes de optar por residir bajo la rúbrica relativamente nueva scikits. La página web de Scikits gustaba de listar alrededor de 30 tal scikits. Aunque al menos varios de ellos ya no están en desarrollo activo. Siguiendo este consejo te llevaría a scikits-timeseries sin embargo, ese paquete ya no está en desarrollo activo. En efecto, Pandas se ha convertido, AFAIK, la biblioteca de series de tiempo basada en NumPy. Pandas tiene varias funciones que se pueden utilizar para calcular un promedio móvil, el más simple de estos es probablemente rollingmean. Que se utiliza de la siguiente manera: Ahora, sólo tiene que llamar a la función rollingmean pasando en el objeto Series y un tamaño de ventana. Que en mi ejemplo a continuación es de 10 días. Verificar que funcionó - por ejemplo. Los valores comparados 10-15 en la serie original versus la nueva serie suavizado con la media de balanceo La función rollingmean, junto con una docena de otras funciones se agrupan informalmente en la documentación Pandas bajo la rubrica de funciones de ventana móvil un segundo grupo relacionado de funciones En Pandas se denomina funciones exponencialmente ponderadas (por ejemplo, ewma., Que calcula el promedio ponderado que se mueve exponencialmente). El hecho de que este segundo grupo no esté incluido en la primera (funciones de ventana móvil) es quizás porque las transformadas ponderadas exponencialmente no se basan en una ventana de longitud fija UPD: soluciones más eficientes han sido propuestas por Alleo y jasaarim. 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 at 17: 04Los ejemplos siguientes producen una media móvil de los valores WINDOW anteriores. 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.)

No comments:

Post a Comment