Sunday, 15 January 2017

Variation De La Moyenne Mobile Simple

Im essayant de trouver un algorithme efficace, numériquement stable pour calculer une variance de roulement (par exemple, une variance sur une fenêtre roulante de 20 périodes). Im conscient de l'algorithme Welford qui calcule efficacement la variance de fonctionnement pour un flux de nombres (il ne nécessite qu'un seul passage), mais je ne suis pas sûr si cela peut être adapté pour une fenêtre de roulage. Je voudrais aussi la solution pour éviter les problèmes d'exactitude discuté au début de cet article. Une solution dans n'importe quelle langue est très bien. Demandé 28 février à 20:46 Ive couru à travers ce problème ainsi. Il y a quelques grands postes là-bas dans le calcul de la variance cumulative courante telle que John Cookes calculer exactement le post de variance courant et le poteau des explorations numériques, le code de Python pour calculer les variances d'échantillon et de population, la covariance et le coefficient de corrélation. Juste ne pouvait pas trouver aucun qui ont été adaptés à une fenêtre roulante. Les déviations standard courantes par messages subliminaux étaient critiques pour obtenir la formule de fenêtre de roulement pour fonctionner. Jim prend la somme de puissance des différences au carré des valeurs par rapport à l'approche de Welfords d'utiliser la somme des différences au carré de la moyenne. Formule comme suit: PSA aujourd'hui PSA (hier) (((x aujourd'hui x aujourd'hui) - x hier)) n x valeur de votre série temporelle n nombre de valeurs que vous avez analysées jusqu'à présent. Mais, pour convertir la formule Power Sum Average en une variété fenêtrée, vous avez besoin d'ajuster la formule à la suivante: PSA aujourd'hui PSA hier (((x aujourd'hui x aujourd'hui) - (x hier x Hier) nx valeur dans votre série temporelle n nombre de Vous avez également besoin de la formule Rolling Simple Moving Average: SMA aujourd'hui SMA hier ((x aujourd'hui - x aujourd'hui - n) nx valeur dans votre série de temps n période utilisée pour votre fenêtre de roulement. Variation de la population en mouvement: Population Var aujourd'hui (PSA aujourd'hui n - n SMA aujourd'hui SMA aujourd'hui) n Ou la Variation de l 'Échantillon Roulant: Echantillon Var aujourd'hui (PSA aujourd'hui n - n SMA aujourd'hui SMA aujourd'hui) (n - 1) Exemple de code Python dans un post de blog il y a quelques années, Variante en cours d'exécution, j'espère que cela vous aidera ... Notez que j'ai fourni des liens vers tous les posts et formules mathématiques en latex pour cette réponse. Lt 10) Im limitée à seulement 2 hyperliens et absolument aucune image. Espérons que ce doesnt emporter du contenu. Voici une approche de division et de conquête qui possède des mises à jour O (log k), où k est le nombre d'échantillons. Il devrait être relativement stable pour les mêmes raisons que la sommation par paires et les FFT sont stables, mais c'est un peu compliqué et la constante n'est pas grande. Supposons que l'on ait une suite A de longueur m avec moyenne E (A) et variance V (A). Et une séquence B de longueur n avec moyenne E (B) et variance V (B). Soit C la concaténation de A et B. Nous avons maintenant, remplissez les éléments d'un arbre rouge-noir, où chaque noeud est décoré de la moyenne et de la variance du sous-arbre enraciné à ce noeud. Insérer à droite, supprimer à gauche. (Puisqu'il n'y avait que l'accès aux extrémités, un arbre splay peut être amorti, mais Im guessing amorti est un problème pour votre application.) Si k est connu à la compilation, vous pourriez probablement dérouler la boucle interne de style FFTW . En fait, l'algorithme de Welfords peut facilement être adapté pour calculer la variance pondérée. Et en définissant des poids à -1, vous devriez être capable d'annuler efficacement des éléments. Je n'ai pas vérifié les mathématiques si elle permet des poids négatifs cependant, mais à un premier regard, je devrais faire une petite expérience en utilisant ELKI: 14 chiffres de précision par rapport à l'algorithme à deux passes exacte c'est à peu près autant que ce que l'on peut attendre de double. Notez que Welford vient à un certain coût de calcul en raison des divisions supplémentaires - il prend environ deux fois aussi longtemps que l'algorithme exact de deux passe. Si votre taille de fenêtre est petite, il peut être beaucoup plus raisonnable de recalculer réellement la moyenne et puis dans un deuxième passage la variance à chaque fois. J'ai ajouté cette expérience comme test unitaire à ELKI, vous pouvez voir la source complète ici: elki. dbs. ifi. lmu. de navigateur elki trunk test de lmu ifi dbs mathématique elki TestSlidingVariance. java il se compare également à l'exacte deux passe variance. Toutefois, sur les ensembles de données asymétriques, le comportement peut être différent. Cet ensemble de données est évidemment uniforme distribué mais Ive a également essayé un arrangement trié et il a fonctionné. J'ai répondu Jan 5 13 at 13:47 Répondue Apr 24 14 at 18:32 Je me réjouis d'être prouvé mal sur ce point, mais je ne pense pas que cela peut être fait rapidement. Cela dit, une grande partie du calcul est de garder la trace de l'EV sur la fenêtre qui peut être fait facilement. Ill laisser avec la question: êtes-vous sûr que vous avez besoin d'une fonction fenêtrée Sauf si vous travaillez avec de très grandes fenêtres, il est probablement préférable d'utiliser simplement un algorithme prédéfini bien connu. (X2 de 1..20), et Somme (X de 1..20) et puis successivement recomptager les deux sommes à chaque itération n'est pas assez efficace Il est possible de recalculer la nouvelle variance sans additionner, carré, etc. tous les échantillons à chaque fois. Répondre Feb 28 11 at 21:07 Je crois que cette solution est sensible aux problèmes de stabilité mentionnés dans le lien dans mon post original (johndcook standarddeviation. html). En particulier, lorsque les valeurs d'entrée et grande et leur différence est faible que le résultat pourrait être négatif. Je n'aurai aucun contrôle sur la contribution, donc je préférerais éviter cette approche. Ndash Abiel Feb 28 11 at 21:11 Oh, je vois. Y at-il quelque chose que vous pouvez dire sur l'entrée Utilisation prévue Est-ce un problème que vous pouvez jeter plus de bits à (flottement 64 bits, arithmétique de précision arbitraire, etc.) Les erreurs d'arrondi disparaissent si vous trump l'entrée en chiffres significatifs, Pas de ndash John Février 28 11 à 21:16 Jason S: La variance de roulement est ce qu'il est. Il peut y avoir beaucoup de choses dans la transition de 1 million à zéro, mais c'est la nature de la bête. Cela, et le premier 980 des 1000 1 million de valeurs sont hors de l'image quand le changement se produit de toute façon. Mon commentaire a suggéré que si vous aviez assez de chiffres significatifs dans vos calculs, rien de cela ne serait important. Ndash John Feb 28 11 at 21:51 Entrée pourrait vraiment être quelque chose. L'amplitude de la valeur pourrait certainement se situer dans les trillions, et alors que les données d'origine n'auront qu'une précision de quelques décimales, les utilisateurs pourront transformer leurs données (par exemple en divisant par n'importe quel scalaire) avant de calculer la variance. Ndash Abiel Feb 28 11 at 21:56 Pour seulement 20 valeurs, son trivial d'adapter la méthode exposée ici (je n'ai pas dit rapide, cependant). Vous pouvez simplement choisir un tableau de 20 de ces classes RunningStat. Les 20 premiers éléments du flux sont quelque peu spéciaux, mais une fois cela fait, c'est beaucoup plus simple: quand un nouvel élément arrive, effacez l'instance courante de RunningStat, ajoutez l'élément à toutes les 20 instances et incrémentez le compteur (modulo 20) Qui identifie la nouvelle instance complète de RunningStat à un moment donné, vous pouvez consulter l'instance complète courante pour obtenir votre variante courante. Vous remarquerez évidemment que cette approche n'est pas vraiment évolutive. Vous pouvez également noter qu'il ya une certaine redudance dans les nombres que nous gardons (si vous allez avec la classe complète RunningStat). Une amélioration évidente serait de garder les 20 Mk et Sk directement. Je ne peux pas penser à une meilleure formule en utilisant cet algorithme particulier, je crains que sa formulation récursive un peu nos liens. Réponse Mar 1 11 at 9: 01Déviation standard et Variance Et la bonne chose au sujet de l'écart-type est qu'il est utile. Maintenant, nous pouvons montrer quelles sont les hauteurs à l'intérieur d'une Écart type (147mm) de la moyenne: Donc, en utilisant l'écart-type, nous avons une façon quotstandard de savoir ce qui est normal et ce qui est extra large ou extra small. Les Rottweilers sont de grands chiens. Et les teckels sont un peu courts. Mais ne leur dites pas Mais. Il ya un petit changement avec des données d'échantillon Notre exemple a été pour une population (les 5 chiens sont les seuls chiens qui nous intéresse). Mais si les données sont un échantillon (une sélection tirée d'une plus grande population), alors le calcul change Lorsque vous avez quotNquot valeurs de données qui sont: La population. Diviser par N dans le calcul de la variance (comme nous l'avons fait). Diviser par N-1 dans le calcul de la variance Tous les autres calculs restent les mêmes, y compris la façon dont nous avons calculé la moyenne. Exemple: si nos 5 chiens ne sont qu'un échantillon d'une plus grande population de chiens, nous divisons par 4 au lieu de 5 comme ceci: Variance de l'échantillon 108 520 4 27,130 Échantillon Écart-type radic27,130 164 (au millimètre le plus proche) Quotcorrectionquot lorsque vos données ne sont qu'un échantillon. Voici les deux formules, expliquées aux Formules d'Écart Standard si vous voulez en savoir plus:


No comments:

Post a Comment