Tuesday 24 January 2017

Mouvement Moyenne Numpy

Hmmm, il semble que ce quoteasy à implementquot fonction est en fait assez facile de se tromper et a favorisé une bonne discussion sur l'efficacité de la mémoire. Je suis heureux d'avoir des ballonnements, si cela veut dire savoir que quelque chose a bien été fait. Ndash Richard Sep 20 14 at 19:23 NumPys manque d'une fonction particulière domaine spécifique est peut-être due à la discipline des équipes de base et la fidélité à la directive NumPys prime: fournir un type de tableau N-dimensionnelle. Ainsi que des fonctions pour créer et indexer ces tableaux. Comme beaucoup d'objectifs fondamentaux, celui-ci n'est pas petit, et NumPy le fait brillamment. Le SciPy (beaucoup plus grand) contient une collection beaucoup plus grande de bibliothèques spécifiques au domaine (appelées sous-paquets par SciPy devs) - par exemple, l'optimisation numérique (optimiser), le traitement du signal (signal) et le calcul intégral (intégrer). Ma conjecture est que la fonction que vous recherchez est dans au moins un des sous-paquets SciPy (scipy. signal peut-être) cependant, je regarderais d'abord dans la collection de SciPy scikits. Identifier les scikit (s) pertinent (s) et chercher la fonction d'intérêt là-bas. Scikits sont des paquets développés indépendamment basés sur NumPy SciPy et dirigés vers une discipline technique particulière (p. Ex. Scikits-image, scikits-learn, etc.) Plusieurs d'entre eux étaient (en particulier, l'impressionnant OpenOpt pour l'optimisation numérique) Longtemps avant de choisir de résider sous la rubrique relativement nouvelle scikits. La page d'accueil Scikits aimé au-dessus des listes d'environ 30 scikits tels. Bien qu'au moins plusieurs d'entre eux ne soient plus en développement actif. En conséquence, Pandas est devenue, AFAIK, la bibliothèque de séries chronologiques de NumPy de facto. Pandas a plusieurs fonctions qui peuvent être utilisées pour calculer une moyenne mobile la plus simple de ces est probablement rollingmean. Que vous utilisez comme suit: Maintenant, il suffit d'appeler la fonction rollingmean passant dans l'objet Series et une taille de fenêtre. Qui dans mon exemple ci-dessous est de 10 jours. Vérifier qu'il a fonctionné - par ex. Les valeurs comparées de 10 à 15 dans la série originale par rapport à la nouvelle série lissée avec moyenne de roulis Le mécanisme de fonction, ainsi qu'une douzaine d'autres fonctions sont regroupés de manière informelle dans la documentation Pandas sous la rubrique des fonctions de fenêtre mobile un deuxième groupe de fonctions connexes Dans Pandas est désignée sous le nom de fonctions pondérées exponentiellement (par exemple, ewma, qui calcule une moyenne pondérée exponentiellement mobile). Le fait que ce deuxième groupe n'est pas inclus dans la première (fonctions de fenêtre en mouvement) est peut-être parce que les transformations pondérées exponentiellement ne dépendent pas d'une longueur fixe windowI savent que c'est une question ancienne, mais voici une solution qui doesnt utiliser aucun extra Des structures de données ou des bibliothèques. Il est linéaire dans le nombre d'éléments de la liste d'entrée et je ne peux penser à aucune autre façon de le rendre plus efficace (en fait, si quelqu'un sait d'une meilleure façon d'allouer le résultat, s'il vous plaît faites le moi savoir). NOTE: Cela serait beaucoup plus rapide en utilisant un tableau numpy au lieu d'une liste, mais je voulais éliminer toutes les dépendances. Il serait également possible d'améliorer les performances par l'exécution multi-thread. La fonction suppose que la liste des entrées est une dimension, donc soyez prudent. UPD: des solutions plus efficaces ont été proposées par Alleo et jasaarim. Vous pouvez utiliser np. convolve pour cela: L'argument mode spécifie comment gérer les bords. J'ai choisi le mode valide ici parce que je pense thats comment la plupart des gens s'attendent à courir signifie à travailler, mais vous pouvez avoir d'autres priorités. Voici une trame qui illustre la différence entre les modes: Répondue Mar 24 14 at 22:01 J'aime cette solution car elle est propre (une ligne) et relativement efficace (travail effectué à l'intérieur de numpy). Mais Alleo39s quotEfficient solutionquot utilisant numpy. cumsum a une meilleure complexité. Ndash Ulrich Stern Sep 25 15 at 0:31 Vous pouvez calculer une moyenne courante avec: Heureusement, numpy comprend une fonction de convolution que nous pouvons utiliser pour accélérer les choses. La moyenne courante équivaut à convertir x avec un vecteur qui est N long, avec tous les membres égaux à 1 N. L'implémentation numpy de convolve inclut le transitoire de départ, donc il faut supprimer les premiers N-1 points: Sur ma machine, La version rapide est 20 à 30 fois plus rapide, en fonction de la longueur du vecteur d'entrée et de la taille de la fenêtre de calcul de la moyenne. Notez que convolve ne comprennent pas un même mode qui semble qu'il devrait aborder le problème transitoire de départ, mais il divise entre le début et la fin. Il supprime le transitoire de la fin, et le début n'a pas un. Eh bien, je suppose qu'il est une question de priorités, je don39t besoin du même nombre de résultats sur les frais d'obtenir une pente vers zéro qui isn39t là dans les données. BTW, voici une commande pour montrer la différence entre les modes: modes (39full39, 39same39, 39valid39) plot (convolve (ones ((200)), ones ((50)) 4750, modem)) pour m en modes (-10, 251, -.1, 1.1) légende (modes, loc39lower center39) (avec pyplot et numpy importés). Ndash lapis Mar 24 14 at 13:56 pandas est plus approprié pour cela que NumPy ou SciPy. Sa fonction rollingmean fait le travail commodément. Il renvoie également un tableau NumPy lorsque l'entrée est un tableau. Il est difficile de battre le rollingmean dans la performance avec n'importe quelle implémentation Python pure personnalisée. Voici un exemple de performance par rapport à deux des solutions proposées: Il ya aussi de belles options quant à la façon de traiter les valeurs de bord. I39m toujours gênés par la fonction de traitement du signal qui renvoient des signaux de sortie de forme différente des signaux d'entrée lorsque les deux entrées et sorties sont de même nature (par exemple les deux signaux temporels). Il casse la correspondance avec une variable indépendante liée (par exemple, le temps, la fréquence), ce qui rend le traçage ou la comparaison non pas une question directe. De toute façon, si vous partagez le sentiment, vous voudrez peut-être changer les dernières lignes de la fonction proposée comme ynp. convolve (w w. sum (), s, mode39same39) return ywindowlen-1 :-( windowlen-1) ndash Christian O39Reilly Un peu tard à la fête, mais Ive fait ma propre petite fonction qui ne pas envelopper les extrémités ou les tampons avec des zéros qui sont ensuite utilisés pour trouver la moyenne ainsi. Comme un autre traitement est, qu'il ré-échantillonne également le signal à des points linéairement espacés. Personnalisez le code à volonté pour obtenir d'autres fonctionnalités. La méthode est une simple multiplication matricielle avec un noyau gaussien normalisé. Une utilisation simple sur un signal sinusoïdal avec un bruit distribué normal ajouté: lapis oui, mais disons que vous utilisez la méthode cumsum sur la première coche et enregistrez votre tableau moyenne mobile pour la prochaine tick. Chaque tick après vous suffit d'ajouter la dernière valeur moyenne mobile à votre matrice de roulage dans le stockage. En utilisant cette méthode, vous ne recalculerez pas les choses que vous avez déjà calculées: Sur la première coche vous cumsum par la suite vous ajoutez simplement le quotmean des éléments de dernière période qui est 2x plus rapide pour tous les ticks ultérieurs. Si vous choisissez de rouler votre propre, plutôt que d'utiliser une bibliothèque existante, s'il vous plaît être conscient de l'erreur en virgule flottante et essayer de minimiser ses effets: Si toutes vos valeurs sont à peu près le même ordre de grandeur, Alors ceci aidera à préserver la précision en ajoutant toujours des valeurs de grandeurs approximativement semblables. Dans ma dernière phrase, j'ai essayé d'indiquer pourquoi il aide à l'erreur de virgule flottante. Si deux valeurs sont approximativement du même ordre de grandeur, alors l'ajout de celles-ci perd moins de précision que si vous avez ajouté un très grand nombre à un très petit. Le code combine des valeurs quotadjacentquot d'une manière que même les sommes intermédiaires doivent toujours être raisonnablement proches en grandeur, pour minimiser l'erreur en virgule flottante. Rien n'est infaillible, mais cette méthode a sauvé un couple très mal mis en œuvre des projets en production. Ndash Mayur Patel Dec 15 14 at 17:22 Alleo: Au lieu de faire une addition par valeur, vous en ferez deux. La preuve est la même que le problème de retournement de bits. Cependant, le point de cette réponse n'est pas nécessairement la performance, mais la précision. L'utilisation de la mémoire pour la moyenne des valeurs 64 bits ne dépasserait pas 64 éléments dans la mémoire cache, ce qui rend l'utilisation de la mémoire encore plus conviviale. Ndash Mayur Patel Dec 29 14 à 17:04


No comments:

Post a Comment