Wednesday 4 January 2017

Déménagement Moyen Efficace Mise En Œuvre

J'ai essentiellement un tableau de valeurs comme ceci: Le tableau ci-dessus est simplifié, Im collectionner 1 valeur par milliseconde dans mon code réel et j'ai besoin de traiter la sortie sur un algorithme que j'ai écrit pour trouver le pic le plus proche avant un point dans le temps. Ma logique échoue parce que dans mon exemple ci-dessus, 0.36 est le vrai pic, mais mon algorithme regarderait en arrière et verrait le tout dernier nombre 0.25 comme le pic, car il y a une diminution à 0.24 avant lui. L'objectif est de prendre ces valeurs et de leur appliquer un algorithme qui les lisse un peu pour que je possède des valeurs plus linéaires. (C.-à-d.: Id comme mes résultats à curvy, pas jaggedy) On m'a dit d'appliquer un filtre exponentiel de moyenne mobile à mes valeurs. Comment puis-je le faire C'est vraiment difficile pour moi de lire les équations mathématiques, je traite beaucoup mieux avec le code. Comment puis-je traiter les valeurs dans mon tableau, en appliquant un calcul de moyenne exponentielle de la mobilité pour les égaliser demandée Feb 8 12 at 20:27 Pour calculer une moyenne mobile exponentielle. Vous devez garder un certain état autour et vous avez besoin d'un paramètre de réglage. Cela nécessite une petite classe (en supposant que vous utilisiez Java 5 ou plus tard): Instantiate avec le paramètre de décroissance que vous voulez (peut prendre l'accord doit être entre 0 et 1), puis utilisez la moyenne () pour filtrer. Lors de la lecture d'une page sur une récurrence mathématique, tout ce que vous avez vraiment besoin de savoir lorsque vous le transformer en code est que les mathématiciens aiment écrire des index dans des tableaux et des séquences avec des indices. (Theyve quelques autres notations ainsi, ce qui ne l'aide pas.) Cependant, l'EMA est assez simple car vous devez seulement se souvenir d'une vieille valeur aucune arrays compliqués d'état requis. Répondre févr. 8 12 at 20h42 TKKocheran: Pretty much. Notez que les premiers termes de la séquence moyenne sauteront un peu en raison des effets de frontière, mais vous obtenez ceux avec d'autres moyennes mobiles aussi. Cependant, un bon avantage est que vous pouvez envelopper la logique de la moyenne mobile dans le moyager et expérimenter sans déranger le reste de votre programme trop. Ndash Donal Fellows Feb 9 12 at 0:06 J'ai de la difficulté à comprendre vos questions, mais je vais essayer de répondre de toute façon. 1) Si votre algorithme a trouvé 0,25 au lieu de 0,36, alors il est faux. C'est faux parce qu'il suppose une augmentation ou une diminution monotone (qui monte ou monte toujours). Sauf si vous moyenne toutes vos données, vos points de données --- comme vous les présenter --- sont non linéaires. Si vous voulez vraiment trouver la valeur maximale entre deux points dans le temps, découpez votre tableau de tmin à tmax et trouvez le maximum de ce sous-tableau. 2) Maintenant, 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 peux le lisser en prenant la moyenne de deux nombres: 1.45, 1.45, 1.45, 1.5. Notez que le premier nombre est la moyenne de 1,5 et 1,4 (deuxième et premier numéros) la deuxième (nouvelle liste) est la moyenne de 1,4 et 1,5 (troisième et deuxième liste ancienne) 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 faire la période trois ou quatre, ou n. Remarquez comment les données sont beaucoup plus lisses. Une bonne façon de voir les moyennes mobiles au travail est d'aller à Google Finance, sélectionnez un stock (essayez Tesla Motors assez volatile (TSLA)) et cliquez sur technicals au bas du graphique. Sélectionnez Moyenne mobile avec une période donnée, et Moyenne mobile exponentielle pour comparer leurs différences. Moyenne mobile exponentielle est juste une autre élaboration de cela, mais pondère les données plus anciennes moins que les nouvelles données, c'est une façon de biais le lissage vers l'arrière. Veuillez lire l'entrée de Wikipedia. Donc, c'est plus un commentaire qu'une réponse, mais la petite boîte de commentaire était juste à minuscule. Bonne chance. Si vous avez des problèmes avec les mathématiques, vous pourriez aller avec une moyenne mobile simple au lieu d'exponentielle. Donc, la sortie que vous obtenez serait les derniers termes x divisé par x. Pseudocode non testé: Notez que vous devrez manipuler les parties de début et de fin des données car clairement vous ne pouvez pas moyenne les 5 derniers termes lorsque vous êtes sur votre 2e point de données. En outre, il existe des moyens plus efficaces de calculer cette moyenne mobile (somme somme - la plus récente la plus récente), mais c'est pour obtenir le concept de ce qui se passe à travers. Réponse Aujourd'hui, je suis en train de développer un système graphique LCD pour afficher les températures, les flux, les tensions, la puissance et l'énergie dans un système de pompe à chaleur. L'utilisation d'un écran LCD graphique signifie que la moitié de ma SRAM et 75 de mon flash ont été utilisés par un tampon d'écran et des chaînes. À l'heure où le chiffre quotidien est réinitialisé, le système vérifie si la consommation de la journée est au-dessus ou au-dessous du minimum ou maximum précédent et stocke la valeur. La moyenne est calculée en divisant la consommation d'énergie cumulée par le nombre de jours. Je voudrais afficher la moyenne quotidienne au cours de la dernière semaine et le mois (4 semaines pour la simplicité), c'est-à-dire une moyenne mobile. Actuellement, cela implique de maintenir un tableau de valeurs pour les 28 derniers jours et de calculer une moyenne sur l'ensemble du tableau mensuel et les 7 derniers jours pour la semaine. Initialement, je faisais cela en utilisant un tableau de flotteurs (comme l'énergie est dans la forme 12.12kWh), mais cela était en utilisant 28 4 octets 112 octets (5.4 de SRAM). Je n'aime pas avoir un seul point décimal de résolution, donc j'ai changé en utilisant uint16t et en multipliant le chiffre par 100. Cela signifie que 12.12 est représenté comme 1212, et je diviser par 100 pour l'affichage. La taille du tableau est maintenant inférieure à 56 octets (beaucoup mieux). Il n'y a pas de moyen trivial de réduire le chiffre à un uint8t que je peux voir. Je pourrais tolérer la perte d'une décimale (12.1kWh au lieu de 12.12kWh), mais la consommation est souvent supérieure à 25.5kWh (255 étant la valeur la plus élevée représentée par un entier non signé de 8 bits). La consommation n'a jamais été inférieure à 10.0kWh ou au-dessus de 35.0kWh, donc je pourrais peut-être soustraire 10 des chiffres stockés, mais je sais qu'un jour nous dépasserons ces limites. J'ai alors testé le code pour emballer des valeurs de 9 bits dans un tableau. Cela donne une plage de 0-51.2kWh et utilise 32 octets au total. Toutefois, l'accès à un tableau comme celui-ci est assez lent, surtout lorsque vous devez itérer sur toutes les valeurs pour calculer une moyenne. Donc, ma question est - y at-il un moyen plus efficace de calculer une moyenne mobile avec trois fenêtres - durée de vie, 28 jours et 7 jours Efficacité signifie plus petit en termes de SRAM utilisation, mais sans la pénalité de code énorme. Puis-je éviter de stocker toutes les valeurs demandées J'ai pensé et vous avez raison. Donc techniquement ma réponse est incorrecte. I39m investir un peu plus de temps et de patience en elle. Peut-être quelque chose hors de la boîte. Je vous ferai savoir si je trouve quelque chose. Nous faisons beaucoup de choses comme ça sur mon lieu de travail. Laissez-moi poser la question. Désolé pour la confusion. Ndash Aditya Somani Mar 8 14 à 17:15 est il un moyen plus efficace de calculer une moyenne mobile avec. 28 jours et 7 jours. Besoin de se rappeler 27 jours d'histoire. En d'autres termes, plutôt que de stocker tous les détails de chaque jour pour les 27 derniers jours, (a) stocker 7 ou ainsi les valeurs d'informations quotidiennes détaillées pour le passé 7 jours ou plus, et aussi (b) stocker environ 4 valeurs sommaires de l'information totale ou moyenne pour chacune des quatre dernières semaines.


No comments:

Post a Comment