Moyenne mobile exponentielle échantillonnée à différents moments

J’ai une valeur continue pour laquelle je voudrais calculer une moyenne mobile exponentielle . Normalement, je voudrais juste utiliser la formule standard pour cela:

  • S n = αY + (1-α) S n-1

où S n est la nouvelle moyenne, α est l’alpha, Y est l’échantillon et S n-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é, il se peut que je ne puisse pas prendre d’échantillon pendant plusieurs millisecondes à la fois. Un cas probablement plus commun, cependant, est que je prélève un peu de temps un peu tôt ou tard: au lieu d’échantillonner à 0, 1 et 2 ms. Je échantillonne à 0, 0,9 et 2,1 ms. Je prévois que, indépendamment des 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’aliasing.

Je pense que je peux traiter cette question de manière plus ou moins raisonnable en faisant varier l’alpha de manière appropriée, en fonction de la durée écasting depuis le dernier échantillon.

Une partie de mon raisonnement selon laquelle cela fonctionnera est que l’EMA “interpole linéairement” entre le sharepoint données précédent et le point actuel. Si l’on envisage de calculer un EMA de la liste suivante d’échantillons à 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], non? Si l’EMA avait supposé que, à t 2, la valeur avait été 2 depuis t 0 , ce serait le même que le calcul de l’intervalle t calculé sur [0,2,2,4,4], ce qui n’est pas le cas. Ou est-ce que cela a du sens?

Quelqu’un peut-il me dire comment faire varier l’alpha de manière appropriée? “S’il te plaît montre ton travail.” Ie, montrez-moi le calcul qui prouve que votre méthode fait vraiment ce qu’il faut.

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 recherchez. Je pense que ce qui suit est ce que vous voulez:

Tout d’abord, vous pouvez simplifier un peu votre équation (cela semble plus compliqué mais c’est plus facile dans le 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 = αX + (1-α) Y n-1 → Y n = Y n-1 + α (X – Y n-1 )

quels codes pour:

Y += alpha * (XY); 

Deuxièmement, la valeur de a est ici “égale” à 1-e- At / τ où Δt est le temps entre les échantillons et τ est la constante de temps du filtre passe-bas. Je dis “égal” entre guillemets car cela fonctionne bien lorsque Δt / τ est petit comparé à 1, et α = 1-e -Δt / τ ≈ Δt / τ. (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, N = -log 2 (α).) valeurs de Δt / τ l’effet de filtrage commence à disparaître, jusqu’à ce que vous arriviez au point où α est proche de 1 et que vous n’affectez simplement que l’entrée à la sortie.

Cela devrait fonctionner correctement avec des valeurs variables de Δt (la variation de Δt n’est pas très importante tant que l’alpha est faible, sinon vous rencontrerez des problèmes / aliasing / etc. de Nyquist assez étranges) et si vous travaillez sur un processeur où la multiplication est moins chère que la division, ou que les points à virgule fixe sont importants, pré-calculez ω = 1 / τ, et envisagez d’essayer de rapprocher la formule pour α.

Si vous voulez vraiment savoir comment dériver la formule

α = 1-e -Δt / τ

puis considérons sa source d’équation différentielle:

Y + τ dY / dt = X

qui, lorsque X est une fonction unitaire, a la solution Y = 1 – e -t / τ . Pour de petites valeurs de Δt, la dérivée peut être approximée par ΔY / Δt, ce qui donne

Y + τ ΔY / Δt = X

ΔY / Δt = (XY) / τ

ΔY = (XY) (Δt / τ) = α (XY)

et “l’extrapolation” de α = 1-e -Δt / τ vient d’essayer de faire correspondre le comportement avec le cas de la fonction de pas d’unité.

Regardez ici: http://www.eckner.com/research.html

Regardez le deuxième lien: “” Algorithmes pour séries chronologiques inégalement réparties: moyennes mobiles et autres opérateurs roulants ”

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’un. C’est aussi loin que je l’ai eu en une heure ou deux de jouer; Je le poste comme exemple de ce que je recherche et peut-être une source d’inspiration pour les autres personnes travaillant 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 α est défini sur ce qui est approprié pour cet intervalle d’échantillon et la période sur laquelle je souhaite faire la moyenne.

J’ai considéré ce qui se passe si je manque l’échantillon à t 1 et que je dois plutôt me contenter de l’échantillon Y 2 pris à t 2 ? Eh bien, nous pouvons commencer par développer l’équation pour voir ce qui se serait passé si nous avions eu Y 1 :

  • S 2 = αY 2 + (1-α) S 1 où S 1 = αY 1 + (1-α) S 0

En remplaçant:

  • S 2 = αY 2 + (1-α) (αY 1 + (1-α) S 0 )
  • S 2 = αY 2 + (1-α) αY 1 + (1-α) (1-α) S 0
  • S 2 = αY 2 + (1-α) αY 1 + (1-α) 2 S 0

Je remarque que la série semble s’étendre infiniment de cette manière, car nous pouvons substituer indéfiniment le S n du côté droit:

  • S 2 = αY 2 + (1-α) αY 1 + (1-α) 2 (αY 0 + (1-α) S -1 )
  • S 2 = αY 2 + (1-α) αY 1 + (1-α) 2 αY 0 + (1-α) 3 S -1
  • etc.

Ok, donc ce n’est pas vraiment un polynôme (idiot moi), mais si on multiplie le terme initial par un, on voit alors un pattern:

  • S 2 = (1-α) 0 αY 2 + (1-α) αY 1 + (1-α) 2 αY 0 + (1-α) 3 S -1

Hm: c’est une série exponentielle. Quelle surprise! Imaginez que cela ressorte de l’équation pour une moyenne mobile exponentielle!

Donc, de toute façon, j’ai ce truc x 0 + x 1 + x 2 + x 3 + … et je suis sûr que je sens e ou un logarithme naturel, mais je ne me souviens plus se dirigeait ensuite avant que je sois à court de temps.

Toute réponse à cette question ou toute preuve d’exactitude d’une telle réponse dépend fortement des données que vous mesurez.

Si vos échantillons ont été pris à t 0 = 0 ms, t 1 = 0,9 ms et t 2 = 2,1 ms, mais votre choix de α est basé sur des intervalles de 1 ms, et vous voulez donc un α n ajusté localement, la preuve de l’exactitude du choix signifierait connaître les valeurs de l’échantillon à t = 1ms et t = 2ms.

Cela nous amène à la question suivante: pouvez-vous interpoler vos données de manière résonante pour avoir une idée plus précise des valeurs intermédiaires possibles? Ou pouvez-vous même interpoler la moyenne elle-même?

Si aucun de ces deux éléments n’est possible, le choix logique d’une valeur intermédiaire Y (t) est, pour autant que je le voie, la moyenne calculée la plus récente , à savoir Y (t) ≈ S n où n est maxmial tel que t n

Ce choix a une conséquence simple: laisser α seul, quel que soit le décalage horaire.

Si, par contre, il est possible d’interpoler vos valeurs, cela vous donnera des échantillons d’intervalles constants. Enfin, s’il est même possible d’interpoler la moyenne elle-même, cela rendrait la question inutile.

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

S (Y, S 0 ) =

(1-α) Y + αS 0 =

Y – αY + αS 0 =

Y + α (S 0 -Y)

Si nous ajoutons maintenant la longueur de l’intervalle de temps t et supposons que seulement α dépend de ce t, cette formule ressemble à ceci:

S (Y, t, S 0 ) = Y + α 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 ressemble à ceci:

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

Y + α t 2 (S (Y, t 1 , S 0 ) – Y) =

Y + α t 2 ((Y + α t 1 (S 0 -Y)) – Y) =

Y + α t 2 α t 1 (S 0 -Y)

Si cette moyenne devait être la même que si on avait ajouté tout l’intervalle t, il s’ensuit que α t = α t 1 α t 2 . Une définition de α répondant à cette exigence serait:

α x : = A x (pour une constante A)

Car:

α t = A t = A t 1 + t 2 = A t 1 A t 2 = α t 1 α t 2

Cela se traduit par la fonction de moyennage 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 moyenne qui peut très bien gérer les variations des intervalles d’échantillonnage.

Disons que nous aimerions faire une moyenne exponentielle décroissante 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 = Temps Alpha n -Heure n-1

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

Count n = 1 + Count n-1 * Multiplicateur n

Avg n = Sum n / Count n

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

Comme vous ne savez pas ce qui se passe pendant le temps où 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 en arrière une fois que vous avez un nouvel échantillon, remplissez les valeurs manquantes et recalculez l’EMA.

Ce que j’essaie de comprendre, 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 mettre à zéro, ou une sorte d’interpolation entre x[n] et x[n+M] , où M est le nombre d’échantillons manquants et n le début de l’écart. Peut-être même en utilisant des valeurs avant n .

Ceci est similaire à un problème ouvert sur ma liste de tâches. J’ai mis au point un système dans une certaine mesure mais je n’ai pas encore de travail mathématique pour appuyer cette suggestion.

Update & summary: souhaite conserver le facteur de lissage (alpha) indépendant du facteur de compensation (que je qualifie de bêta ici). 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 la prise du dernier échantillon (en arrondissant les multiples de votre temps d’échantillonnage constant – soit 7,8 ms depuis le dernier échantillon soit 8 unités), cela pourrait être utilisé pour appliquer le lissage plusieurs fois. Appliquez la formule 8 fois dans ce cas. Vous avez effectivement fait un lissage plus biaisé vers la valeur actuelle.

Deuxième étape.

  • Pour obtenir un meilleur lissage, nous devons modifier l’alpha tout en appliquant la formule 8 fois dans le cas précédent.

Qu’est-ce que cette approximation de lissage va manquer?

  • Il a déjà raté 7 échantillons dans l’exemple ci-dessus
  • Cela a été approximé à l’étape 1 avec une réapplication aplatie de la valeur actuelle 7 fois supplémentaires
  • Si nous définissons un facteur d’approximation bêta qui sera appliqué avec alpha (en tant qu’alpha * bêta au lieu de seulement alpha), nous supposerons que les 7 échantillons manqués ont été modifiés en douceur entre les valeurs d’échantillon précédentes et actuelles.