La façon la plus efficace de calcul de la moyenne à la volée (moyenne mobile)?

Je viens avec ce

n=1;
curAvg = 0;
loop{
  curAvg = curAvg + (newNum - curAvg)/n;
  n++;
}

Je pense que les faits saillants de cette façon sont les suivants:

- Il évite les grands nombres (et de débordement possible si vous somme et ensuite diviser)

- vous enregistrez un registre (pas besoin de stocker somme)

Le problème pourrait être avec sommation d'erreur - mais je suppose que, généralement, il doit être équilibré numéros de rond et rond vers le bas afin que l'erreur ne doit pas résumer de façon spectaculaire.

Voyez-vous des pièges dans cette solution?
Avez-vous une meilleure proposition?

  • Je ne comprends pas votre formule. Pour 1 2 et 3 ensuite, vous feriez curAvg = 1.5 + (3 - 1.5)/2 = 1.5 + 0.75 = 2.25, ce qui serait faux?
  • Question similaire: stackoverflow.com/questions/12636613/...
  • boucle 1: curAvg=0+(1-0)/1=1; n=2<br> boucle 2: curAvg=1+(2-1)/2=1.5; n=3<br> boucle 3: curAvg=1.5+(3-1.5)/3=2; n=4
  • Votre solution est là: new average = old average + (next data - old average) / next count
  • Vous avez oublié d'incrémenter la valeur de n. Il devrait être de 3 au lieu de 2.Ainsi, l'expression serait curAvg = 1.5+(3-1.5)/3=1.5+0.5 = 2, ce qui est correct.
  • Il convient de noter que l'OP de l'algorithme n'est pas un standard de la moyenne mobile, mais d'une façon exponentielle-moyenne mobile pondérée. Alors que l'EMA pourrait être juste le billet pour de nombreuses applications, les deux se comportent tout à fait différemment dans certaines circonstances (grand pas de réponse), les maîtres d'œuvre doivent être conscients de la différence. Voir stackoverflow.com/questions/12636613/...

InformationsquelleAutor Vit Bernatik | 2015-03-02