Question

J'ai une valeur continue pour laquelle j'aimerais calculer un moyenne mobile exponentielle.Normalement, j'utiliserais simplement la formule standard pour cela :

  • Sn = αY + (1-α)Sn-1

où Sn est la nouvelle moyenne, α est l'alpha, Y est l'échantillon et Sn-1 est la moyenne précédente.

Malheureusement, en raison de divers problèmes, je n'ai pas de temps d'échantillonnage cohérent.Je sais peut-être que je peux échantillonner au maximum, disons, une fois par milliseconde, mais en raison de facteurs indépendants de ma volonté, je ne pourrai peut-être pas prélever un échantillon plusieurs millisecondes à la fois.Cependant, un cas probablement plus courant est que j'échantillonne simplement un peu tôt ou tard :au lieu d'échantillonner à 0, 1 et 2 ms.J'échantillonne à 0, 0,9 et 2,1 ms.Je prévois que, quels que soient les retards, ma fréquence d'échantillonnage sera bien au-dessus de la limite de Nyquist et je n'ai donc pas à m'inquiéter de l'alias.

Je pense que je peux gérer cela d'une manière plus ou moins raisonnable en faisant varier l'alpha de manière appropriée, en fonction du temps écoulé depuis le dernier échantillon.

Une partie de mon raisonnement selon lequel cela fonctionnera est que l'EMA "interpole linéairement" entre le point de données précédent et le point de données actuel.Si l'on considère le calcul d'une EMA de la liste d'échantillons suivante à des intervalles t :[0,1,2,3,4].Nous devrions obtenir le même résultat si nous utilisons l'intervalle 2t, où les entrées deviennent [0,2,4], n'est-ce pas ?Si l'EMA avait supposé qu'à t2 la valeur était de 2 depuis t0, ce serait la même chose que le calcul de l'intervalle t calculé sur [0,2,2,4,4], ce qu'il ne fait pas.Ou est-ce que cela a du sens ?

Quelqu'un peut-il me dire comment faire varier l'alpha de manière appropriée ?"Veuillez montrer votre travail." IE, montrez-moi les mathématiques qui prouvent que votre méthode fait vraiment la bonne chose.

Était-ce utile?

La solution

Cette réponse, basée sur ma bonne compréhension des filtres passe-bas (& "moyenne mobile exponentielle &"; n'est en réalité qu'un filtre passe-bas unipolaire), mais ma compréhension floue de ce que vous cherchez pour. Je pense que ce qui suit est ce que vous voulez:

Tout d’abord, vous pouvez simplifier un peu l’équation (cela semble plus compliqué mais c’est plus facile en code). Je vais utiliser & "Y &"; pour la sortie et " X " pour l'entrée (au lieu de S pour la sortie et Y pour l'entrée, comme vous l'avez fait).

Y n = & # 945; X + (1 - & # 945;) Y n-1 & # 8594; Y n = Y n-1 + & # 945; (X - Y n-1 )

avec quels codes:

 Y += alpha * (X-Y);

Deuxièmement, la valeur de & # 945; voici " égal " to 1-e - & # 916; t / & # 964; où & # 916; t est le temps entre les échantillons et & # 964; est la constante de temps du filtre passe-bas. Je dis & Quot; égal & Quot; entre guillemets car cela fonctionne bien lorsque & # 916; t / & # 964; est petit comparé à 1, et & # 945; = 1-e - & # 916; t / & # 964; & # 8776; & # 916; t / & # 964 ;. (Mais pas trop petit: vous rencontrerez des problèmes de quantification, et à moins de recourir à des techniques exotiques, vous aurez généralement besoin de N bits de résolution supplémentaires dans votre variable d'état S, où N = -log 2 (& # 945;).) Pour des valeurs plus grandes de & # 916; t / & # 964; l'effet de filtrage commence à disparaître, jusqu'au point où & # 945; est proche de 1 et vous attribuez simplement l'entrée à la sortie.

Cela devrait fonctionner correctement avec des valeurs variables de & # 916; t (la variation de & # 916; t n'est pas très importante tant que l'alpha est petit, sinon vous rencontrerez des problèmes plutôt bizarres de Nyquist / aliasing / etc.), et si vous travaillez sur un processeur où la multiplication est moins chère que la division, ou si les problèmes de virgule fixe sont importants, pré-calculez & # 969; = 1 / & # 964 ;, et essayez d’approcher la formule de & # 945;.

Si vous voulez vraiment savoir comment calculer la formule

& # 945; = 1-e - & # 916; t / & # 964;

alors considérez sa source d'équation différentielle:

Y + & # 964; dY / dt = X

qui, lorsque X est une fonction unitaire, a la solution Y = 1 - e -t / & # 964; . Pour les petites valeurs de & # 916; t, la dérivée peut être approximée par & # 916; Y / & # 916; t, donnant

Y + & # 964; & # 916; Y / & # 916; t = X

& # 916; Y / & # 916; t = (X-Y) / & # 964;

& # 916; Y = (X-Y) (& # 916; t / & # 964;) = & # 945; (X-Y)

et le " extrapolation & "; de & # 945; = 1-e - & # 916; t / & # 964; vient d'essayer de faire correspondre le comportement à la casse de la fonction d'étape d'unité.

Autres conseils

Jetez un coup d'œil ici: http://www.eckner.com/research.html

Regardez le deuxième lien: & "; &". Algorithmes pour des séries chronologiques irrégulièrement espacées: moyennes mobiles et autres opérateurs mobiles & ";

Le document décrit exactement les algorithmes de programmation dont vous avez besoin, je pense.

Ce n'est pas une réponse complète, mais peut-être le début d'une. Pour autant que je sois arrivé à ça dans une heure ou deux à jouer; Je le publie comme un exemple de ce que je recherche et peut-être une inspiration pour les autres personnes qui travaillent sur le problème.

Je commence par S 0 , qui est la moyenne résultant de la moyenne précédente S -1 et de l'échantillon Y 0 pris à t 0 . (t 1 - t 0 ) est mon intervalle d'échantillon et & # 945; est défini sur ce qui convient pour cet intervalle d’échantillon et la période sur laquelle je souhaite faire la moyenne.

J'ai envisagé ce qui se passait si je manquais l'échantillon à t 1 et devais plutôt me contenter de l'échantillon Y 2 pris à t 2 ? Eh bien, nous pouvons commencer par élargir l'équation pour voir ce qui se serait passé si nous avions eu Y 1 :

  • S 2 = & # 945; Y 2 + (1 - & # 945;) S 1 , où S 1 = & # 945; Y 1 + (1 - & # 945;) S 0

En remplaçant:

  • S 2 = & # 945; Y 2 + (1 - & # 945;) (& # 945; Y 1 + (1 - & # 945;) S 0 )
  • S 2 = & # 945; Y 2 + (1 - & # 945;) & # 945; Y 1 + (1 - & # 945;) (1 - & # 945;) S 0
  • S 2 = & # 945; Y 2 + (1 - & # 945;) & # 945; Y 1 + (1 - & # 945;) 2 S 0

Je remarque que la série semble s'étendre à l'infini de cette façon, car on peut substituer indéfiniment le S n :

  • S 2 = & # 945; Y 2 + (1 - & # 945;) & # 945; Y 1 + (1 - & # 945;) 2 (& # 945; Y 0 + (1 - & # 945;) S -1 )
  • S 2 = & # 945; Y 2 + (1 - & # 945;) & # 945; Y 1 + (1 - & # 945;) 2 & # 945; Y 0 + (1 - & # 945;) < sup> 3 S -1
  • etc.

D'accord, ce n'est donc pas vraiment un polynôme (mais je suis idiot), mais si nous multiplions le terme initial par un, nous voyons un motif:

  • S 2 = (1 - & # 945;) 0 & # 945; Y 2 + (1- & # 945;) & # 945; Y 1 + (1 - & # 945;) 2 & # 945; Y 0 + (1 - & # 945;) 3 S -1

Hm: c'est une série exponentielle. Quelle surprise! Imaginez que cela sorte de l'équation d'une moyenne mobile exponentielle!

De toute façon, j’ai ce x 0 + x 1 + x 2 + x 3 +. .. chose va, et je suis sûr que je sens e ou un logarithme naturel qui marche, mais je ne me souviens plus où je me dirigeais avant que je manque de temps.

Toute réponse à cette question ou toute preuve de son exactitude dépend énormément des données que vous mesurez.

Si vos échantillons ont été prélevés à t 0 = 0 ms, t 1 = 0,9 ms et t 2 = 2,1 ms, mais votre choix de & # 945; est basé sur des intervalles de 1 ms et, par conséquent, vous voulez un & # 945; ajusté localement; n , la preuve de la justesse du choix signifierait connaître les valeurs de l'échantillon à t = 1ms et t = 2ms.

Cela conduit à la question suivante: Pouvez-vous interpoler vos données de manière résonante pour avoir des suppositions saines de ce que pourraient être les valeurs intermédiaires? Ou pouvez-vous même interpoler la moyenne elle-même?

Si aucune de ces solutions n'est possible, le choix logique d'une valeur intermédiaire Y (t) est, à mon avis, la dernière moyenne calculée , c'est-à-dire Y (t). & # 8776; S n où n est maximal, de sorte que t n & Lt; t.

Ce choix a une conséquence simple: Laissez & # 945; seul, quelle que soit la différence de temps.

Si, au contraire, il est possible d’interpoler vos valeurs, cela vous donnera des échantillons à intervalle constant moyennables. Enfin, s’il est même possible d’interpoler la moyenne elle-même, la question n’aura plus aucun sens.

En utilisant un & # 945 légèrement différent; qui est égal à (1 - & # 945; celui de la question ), formule de base pour ajouter une nouvelle valeur Y à une moyenne existante de S 0 ressemble à ceci:

  

S (Y, S 0 ) =

     

(1 - & # 945;) Y + & # 945; S 0 =

     

Y - & # 945; Y + & # 945; S 0 =

     

Y + & # 945; (S 0 -Y)

Si nous ajoutons maintenant la longueur de l'intervalle de temps t et supposons que & # 945 est la seule chose à faire. dépend de ce t, cette formule ressemble à ceci:

  

S (Y, t, S 0 ) = Y + & # 945; t (S 0 -Y)

Supposons maintenant que t = t 1 + t 2 . Si la moyenne est créée en ajoutant deux valeurs de Y pour les intervalles de temps t 1 et t 2 , la moyenne résultante est la suivante:

  

S (Y, t 2 , S (Y, t 1 , S 0 )) =

     

Y + & # 945; t 2 (S (Y, t 1 , S 0 ) - Y) =

     

Y + & # 945; t 2 ((Y + & # 945; t 1 (S 0 -Y)) - Y) =

     

Y + & # 945; t 2 & # 945; t 1 ( S 0 -Y)

Si cette moyenne doit être la même que si tout l'intervalle t avait été ajouté en une fois, il s'ensuit que & # 945; t = & # 945; t 1 & # 945; t 2 . Une définition de & # 945; qui remplit cette condition serait:

  

& # 945; x : = A x & nbsp; & nbsp; & nbsp; & nbsp; (pour une constante A)

Parce que:

  

& # 945; t = A t =   A t 1 + t 2 =   Un t 1 Un t 2 =   & # 945; t 1 & # 945; t 2

Il en résulte la fonction de calcul de moyenne suivante:

  

S (Y, t, S 0 ) = Y + A t (S 0 -Y)

Je n'ai pas vraiment testé cela, mais si les hypothèses que j'ai formulées correspondent à votre scénario, cela ressemble à une fonction de calcul de la moyenne qui peut très bien gérer les variations dans les intervalles d'échantillonnage.

Supposons que nous souhaitons créer une moyenne décroissante exponentielle sur une fonction continue. Cependant, nous n'avons pas toutes les valeurs de cette fonction, seulement quelques échantillons. Cette formule ferait une moyenne pondérée des échantillons que nous avons avec les poids qu’ils auraient dans la moyenne continue.

Multiplicateur n = Alpha Heure n -Time n-1

Somme n = Val n + Somme n-1 * Multiplicateur n

Nombre n = 1 + Nombre n-1 * Multiplicateur n

Avg n = Somme n / Count n

Je laisserais la valeur alpha seule et remplirais les données manquantes.

Puisque vous ne savez pas ce qui se passe pendant que vous ne pouvez pas échantillonner, vous pouvez remplir ces échantillons avec des 0 ou conserver la valeur précédente stable et utiliser ces valeurs pour l'EMA. Ou une interpolation arrière une fois que vous avez un nouvel échantillon, remplissez les valeurs manquantes et recalculez l'EMA.

Ce que je veux savoir, c’est que vous avez une entrée x[n] qui a des trous. Il n'y a aucun moyen de contourner le fait qu'il vous manque des données. Vous pouvez donc utiliser un maintien d'ordre zéro ou le définir sur zéro, ou une sorte d'interpolation entre x[n+M] et M, où n est le nombre d'échantillons manquants et n le début de l'intervalle. Peut-être même en utilisant des valeurs avant <=>.

Ceci est similaire à un problème ouvert sur ma liste de tâches.J'ai un schéma élaboré dans une certaine mesure, mais je n'ai pas encore de travail mathématique pour étayer cette suggestion.

Mise à jour et résumé :J'aimerais garder le facteur de lissage (alpha) indépendant du facteur de compensation (que j'appelle ici bêta).L'excellente réponse de Jason déjà acceptée ici fonctionne très bien pour moi.

Premier pas.

  • Si vous pouvez également mesurer le temps écoulé depuis le dernier échantillon (en multiples arrondis de votre temps d'échantillonnage constant - donc 7,8 ms depuis le dernier échantillon serait de 8 unités), cela pourrait être utilisé pour appliquer le lissage plusieurs fois.Appliquez la formule 8 fois dans ce cas.Vous avez effectivement effectué un lissage davantage biaisé vers la valeur actuelle.

Deuxième étape.

  • Pour obtenir un meilleur lissage, il faut modifier l'alpha en appliquant la formule 8 fois dans le cas précédent.

Qu’est-ce qui manquera à cette approximation de lissage ?

  • Il a déjà manqué 7 échantillons dans l'exemple ci-dessus
  • Ceci a été approximé à l'étape 1 avec un aplati réapplication de la valeur actuelle 7 fois supplémentaires
  • Si l'on définit un facteur d'approximation bêta qui sera appliqué avec alpha (en alpha*bêta au lieu de simplement alpha), nous supposerons que les 7 échantillons manqués évoluaient en douceur entre les valeurs d'échantillon précédentes et actuelles.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top