Implémentation de la moyenne mobile exponentielle en Java
J'ai essentiellement un tableau de valeurs comme ceci:
0.25, 0.24, 0.27, 0.26, 0.29, 0.34, 0.32, 0.36, 0.32, 0.28, 0.25, 0.24, 0.25
Le tableau ci-dessus est simplifiée à l'extrême, je suis la collecte de 1 valeur par milliseconde dans mon code et j'ai besoin de traiter la sortie sur un algorithme que j'ai écrit pour trouver la plus proche de pointe avant un point dans le temps. Ma logique échoue parce que dans mon exemple ci-dessus, 0.36
est le pic réel, mais mon algorithme regarder en arrière et voir le tout dernier numéro de 0.25
comme le pic, comme il y a une diminution de 0.24
avant.
L'objectif est de prendre ces valeurs et d'appliquer un algorithme qui va "lisser" un peu de sorte que j'ai plus de valeurs linéaires. (c'est à dire: je voudrais que mes résultats sinueuse, pas jaggedy)
J'ai dit à appliquer une moyenne mobile exponentielle de filtre à mes valeurs. Comment puis-je faire cela? C'est vraiment dur pour moi de lire des équations mathématiques, je m'occupe beaucoup mieux avec code.
Comment puis-je traiter des valeurs dans mon tableau, l'application d'une moyenne mobile exponentielle de calcul à même de les sortir de là?
float[] mydata = ...
mySmoothedData = exponentialMovingAverage(mydata, 0.5);
float[] exponentialMovingAverage(float[] input, float alpha) {
//what do I do here?
return result;
}
source d'informationauteur Naftuli Kay
Vous devez vous connecter pour publier un commentaire.
Pour calculer une moyenne mobile exponentiellevous avez besoin de garder un certain état autour et vous avez besoin d'un paramètre d'optimisation. Cela demande un peu de classe (en supposant que vous êtes à l'aide de Java 5 ou version ultérieure):
Instancier avec la désintégration de paramètre que vous voulez (cela peut prendre de réglage; doit être entre 0 et 1) et ensuite utiliser
average(…)
de filtre.Lors de la lecture d'une page sur certains mathématiques récurrence, tous vous avez vraiment besoin de savoir quand le transformer en code, c'est que les mathématiciens aiment écrire des indices dans des tableaux et des séquences avec des indices. (Ils ont un peu d'autres notations, ce qui n'aide pas.) Cependant, l'EMA est assez simple, car vous avez seulement besoin de se rappeler une ancienne valeur; pas compliqué état tableaux requis.
Je vais avoir un moment difficile la compréhension de vos questions, mais je vais essayer de répondre à toute façon.
1) Si votre algorithme a trouvé 0.25 au lieu de 0,36, c'est mauvais. C'est faux, car il suppose une monotone d'augmenter ou de diminuer (c'est "toujours" ou "va toujours vers le bas"). Moins que la moyenne de TOUTES vos données, vos points de données---comme vous les présentez---ne sont pas linéaires. Si vous voulez vraiment trouver la valeur maximale entre deux points dans le temps, découpez votre tableau de
t_min
àt_max
et de trouver le max de subarray.2), le concept de "moyennes mobiles" est très simple: imaginez que j'ai la liste suivante: [1.4, 1.5, 1.4, 1.5, 1.5]. Je me permet de "lisser" en prenant la moyenne des deux nombres: [1.45, 1.45, 1.45, 1.5]. Notez que le premier nombre correspond à la moyenne de 1.5 et 1.4 (seconde et première des numéros); la seconde (nouvelle liste) est la moyenne de 1.4 et 1.5 (troisième et deuxième liste); la troisième (nouvelle liste) à la moyenne de 1.5 et 1.4 (quatrième et troisième), et ainsi de suite. J'aurais pu "période de trois" ou "quatre", ou "n". Remarquez comment les données sont beaucoup plus lisse. Une bonne façon de "voir les moyennes mobiles au travail" est d'aller à Google Finance, sélectionnez un stock (essayez de Tesla Motors; volatils (TSLA)) et cliquez sur "techniques" au bas de la carte. Sélectionnez "Moyenne mobile" à une période donnée, et de la "moyenne mobile Exponentielle" afin de comparer leurs différences.
Moyenne mobile exponentielle est juste une autre élaboration de ce, mais les poids les "anciens" données de moins que la "nouvelle" des données; c'est une façon de "biais" le lissage vers l'arrière. Veuillez lire la page Wikipédia.
Donc, c'est plus un commentaire qu'une réponse, mais la petite boîte de commentaire était juste pour minuscule. Bonne chance.
Prendre un coup d'oeil à cette.
Si votre bruit a zéro moyen, considèrent également l'utilisation d'un Le filtre de Kalman.
Dans une manière de roulement.... j'utilise aussi des communes.apache bibliothèque de mathématiques
Si vous rencontrez des problèmes avec les maths, vous pourriez aller avec une moyenne mobile simple à la place de l'exponentielle. Donc, la sortie serait le dernier x divisés par x. Non testé pseudocode:
Notez que vous aurez besoin pour gérer le début et la fin de la partie des données depuis il est clair que vous ne pouvez pas la moyenne des 5 dernières conditions lorsque vous êtes sur votre 2ème point de données. Aussi, il y a des moyens plus efficaces de calcul de cette moyenne mobile(somme = somme - le plus ancien + nouveau), mais c'est pour le concept de ce qui se passe à travers.