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 20h27 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 nombres) 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. (EMA) et comment est calculé l'EMA La moyenne mobile exponentielle (EMA) est une moyenne mobile pondérée (WMA) qui donne plus de pondération, Ou l'importance, à des données récentes sur les prix que la simple moyenne mobile (SMA) ne. L'EMA répond plus rapidement aux changements de prix récents que la SMA. La formule de calcul de l'EMA consiste simplement à utiliser un multiplicateur et à commencer par le SMA. Le calcul de la SMA est très simple. La SMA pour un nombre donné de périodes de temps est simplement la somme des prix de clôture pour ce nombre de périodes de temps, divisé par ce même nombre. Ainsi, par exemple, un SMA de 10 jours est juste la somme des cours de clôture pour les 10 derniers jours, divisé par 10. Les trois étapes pour calculer l'EMA sont: Calculer le SMA. Calculer le multiplicateur pour pondérer l'EMA. Calculez l'EMA actuel. La formule mathématique, dans ce cas pour calculer une EMA de 10 périodes, ressemble à ceci: SMA: 10 période sum10 Calcul du multiplicateur de pondération: (2 (période choisie 1)) (2 (10 1)) 0,1818 (18,18) Calcul L'EMA: (Prix de clôture-EMA (jour précédent)) x multiplicateur EMA (jour précédent) La pondération donnée au prix le plus récent est supérieure pour une période EMA plus courte que pour une période EMA plus longue. Par exemple, un multiplicateur de 18,18 est appliqué aux données de prix les plus récentes pour un EMA de 10, tandis que pour un EMA de 20, on utilise seulement une pondération de multiplicateur de 9,52. Il ya aussi de légères variations de l'EMA arrivé à en utilisant le prix ouvert, élevé, faible ou médian au lieu d'utiliser le cours de clôture. Utilisez la moyenne mobile exponentielle (EMA) pour créer une stratégie dynamique de trading forex. Apprenez comment EMAs peuvent être utilisés très. Lire la réponse Apprenez les avantages potentiels importants de l'utilisation d'une moyenne exponentielle mobile lors de la négociation, au lieu d'un simple déplacement. Lisez la réponse Découvrez les moyennes mobiles simples et les moyennes mobiles exponentielles, ce que mesurent ces indicateurs techniques et la différence. Lisez la réponse Apprenez la formule de l'indicateur de la moyenne mobile de divergence de convergence et découvrez comment calculer le MACD. Lisez la réponse Découvrez les différents types de moyennes mobiles, ainsi que la moyenne mobile des croisements, et de comprendre comment ils sont utilisés po Lire la réponse Découvrez les différences primaires entre exponentielle et simple indicateurs de la moyenne mobile, et quels sont les désavantages EMAs. J'ai une valeur continue pour laquelle Id veut calculer une moyenne mobile exponentielle. Normalement Id juste utiliser la formule standard pour cela: où S n est la nouvelle moyenne, alpha est l'alpha, Y est l'échantillon, et S n-1 est la moyenne précédente. Malheureusement, en raison de diverses questions, je n'ai pas un temps d'échantillonnage cohérent. Je sais peut-être que je peux échantillonner au plus, disons, une fois par milliseconde, mais en raison de facteurs hors de mon contrôle, je ne peux pas être en mesure de prendre un échantillon de plusieurs millisecondes à la fois. Un cas probablement plus courant, cependant, est que je sample simple un peu tôt ou tard: au lieu d'échantillonnage à 0, 1 et 2 ms. I échantillon à 0, 0,9 et 2,1 ms. Je prévois que, indépendamment des retards, ma fréquence d'échantillonnage sera très, bien au-dessus de la limite de Nyquist, et donc je n'ai pas besoin de s'inquiéter d'aliasing. Je pense que je peux faire face à cela d'une manière plus ou moins raisonnable en faisant varier l'alpha de façon appropriée, en fonction de la durée écoulée depuis le dernier échantillon. Une partie de mon raisonnement que cela fonctionnera, c'est que l'EMA interpole linéairement entre le point de données précédent et le courant. Si l'on considère le calcul d'une EMA de la liste suivante d'échantillons aux 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, à droite Si l'EMA avait supposé que, à t 2, la valeur avait été 2 depuis t 0. Qui serait le même que l'intervalle t calculant sur 0,2,2,4,4, ce que ne fait pas. Ou est-ce que le sens du tout Peut-on me dire comment varier l'alpha de façon appropriée S'il vous plaît montrer votre travail. C'est à dire. Montrez-moi les maths qui prouvent que votre méthode est vraiment faire la bonne chose. Vous ne devriez pas obtenir le même EMA pour les différentes entrées. Pensez à EMA comme un filtre, l'échantillonnage à 2t équivaut à l'échantillonnage descendant, et le filtre va donner une sortie différente. Cela me paraît évident puisque 0,2,4 contient des composantes de fréquence plus élevée que 0,1,2,3,4. Sauf si la question est, comment puis-je changer le filtre à la volée pour lui donner la même sortie. Peut-être que je manque quelque chose ndash freespace Jun 21 09 at 15:52 Mais l'entrée n'est pas différente, il a juste échantillonné moins souvent. 0,2,4 à intervalles 2t est comme 0,, 2,, 4 aux intervalles t, où l'indique que l'échantillon est ignoré ndash Curt Sampson Jun 21 09 à 23:45 Cette réponse basée sur ma bonne compréhension du passe-bas Filtres (moyenne mobile exponentielle est vraiment juste un filtre passe-bas unipolaire), mais ma compréhension floue de ce que vous cherchez. Je pense que ce qui suit est ce que vous voulez: Tout d'abord, vous pouvez simplifier votre équation un peu (semble plus compliqué, mais son 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). Deuxièmement, la valeur de alpha ici est égale à 1-e-Dtatattau où Deltat est le temps entre les échantillons, et tau est la constante de temps du filtre passe-bas. Je dis égale entre guillemets parce que cela fonctionne bien quand Deltattau est petit par rapport à 1, et alpha 1-e-Delatattau asymp Deltattau. (Mais pas trop petit: vous allez rencontrer des problèmes de quantification, et à moins que vous ne recourriez à certaines techniques exotiques, vous avez généralement besoin de N bits supplémentaires de résolution dans votre variable d'état S, où N - log 2 (alpha).) Pour des valeurs plus grandes de Deltattau L'effet de filtrage commence à disparaître, jusqu'à ce que vous arrivez au point où l'alpha est proche de 1 et vous êtes essentiellement simplement attribuer l'entrée à la sortie. Cela devrait fonctionner correctement avec des valeurs variables de Deltat (la variation de Deltat n'est pas très importante tant que alpha est petit, sinon vous rencontrerez quelques problèmes de Nyquist plutôt étranges aliasing etc.) et si vous travaillez sur un processeur où la multiplication Est moins cher que la division, ou les questions à point fixe sont importantes, precalculate omega 1tau, et envisager d'essayer d'approcher la formule de l'alpha. Si vous voulez vraiment savoir comment dériver la formule alpha 1-e-Daltaattau, alors considérez sa source d'équations différentielles: qui, lorsque X est une fonction d'étape unitaire, a la solution Y 1 - e - ttau. Pour les petites valeurs de Deltat, la dérivée peut être approchée par DeltaYDeltat, donnant Y tau DeltaYDeltat X DeltaY (XY) (Deltattau) alpha (XY) et l'extrapolation de alpha 1-e - Dettaatta provient d'essayer de faire correspondre le comportement avec le Cas de fonction d'étape d'unité. Vous voudrez peut-être élaborer sur le quottrying pour correspondre à la partie behaviour. Je comprends votre solution en temps continu Y 1 - exp (-t47) et sa généralisation à une fonction step échelonnée avec magnitude x et condition initiale y (0). Mais je ne vois pas comment mettre ces idées ensemble pour atteindre votre résultat. Ndash Rhys Ulerich May 4 13 à 22:34 Ceci n'est pas une réponse complète, mais peut être le début d'un. Son autant que j'ai obtenu avec cela dans une heure ou deux de jouer Im affichant comme un exemple de ce que je cherche, et peut-être une inspiration pour d'autres 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'échantillonnage et alpha est fixé à ce qui est approprié pour cet intervalle d'échantillonnage et la période sur laquelle je souhaite faire la moyenne. J'ai réfléchi à ce qui se passerait si je manquais l'échantillon à t 1 et au lieu de me contenter de me contenter de l'échantillon Y 2 pris à t 2. Eh bien, on peut commencer par étendre l'équation pour voir ce qui serait arrivé si on avait eu Y 1: Je remarque que la série semble s'étendre infiniment de cette façon, parce que nous pouvons substituer le S n à la droite indéfiniment: Ok , Donc ce n'est pas vraiment un polynôme (idiot moi), mais si nous multiplions le terme initial par un, nous voyons alors un modèle: Hm: sa une série exponentielle. Quelle surprise Imaginez que sortir de l'équation pour une moyenne mobile exponentielle So anyway, j'ai cette x 0 x 1 x 2 x 3. Chose va, Im et Im Im odeur e ou un logarithme naturel coups de pied ici, mais je ne peux pas me rappeler où je me dirigeais avant que je me suis écoulé du 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,9ms et t 2 2,1ms. Mais votre choix d'alpha est basé sur des intervalles de 1 ms, et donc vous voulez un alpha localement ajusté n. La preuve de l'exactitude du choix signifierait connaître les valeurs d'échantillonnage à t1ms et t2ms. Cela vous amène à la question suivante: Pouvez-vous interpoler vos données de manière raisonnable pour avoir des suppositions saines de ce que les valeurs intermédiaires auraient pu être Ou pouvez-vous même interpoler la moyenne elle-même Si ni l'un ni l'autre de ces est possible, Le choix d'une valeur intermédiaire Y (t) est la moyenne calculée la plus récemment. À savoir Y (t) asymp S n où n est maxmial tel que t n ltt. Ce choix a une conséquence simple: Laissez l'alpha seul, quelle que soit la différence de temps. Si, d'autre part, il est possible d'interpoler vos valeurs, cela vous donnera des échantillons d'intervalle constant moyennables. Enfin, s'il est même possible d'interpoler la moyenne elle-même, cela rendrait la question sans signification. Je pense que je peux interpoler mes données: étant donné que I39m échantillonnage à intervalles discrets, I39m déjà le faire avec une norme EMA Anyway, supposons que j'ai besoin Un quotproofquot qui montre qu'il fonctionne aussi bien qu'un EMA standard, qui a également produit un résultat incorrect si les valeurs ne changent pas assez facilement entre les périodes d'échantillon. Si vous considérez l'EMA comme une interpolation de vos valeurs, vous avez terminé si vous laissez l'alpha tel qu'il est (parce que l'insertion de la moyenne la plus récente comme Y ne change pas la moyenne) . Si vous dites que vous avez besoin de quelque chose qui fonctionne aussi bien qu'un EMA standard - ce qui ne va pas avec l'original Sauf si vous avez plus d'informations sur les données que vous mesurez, tous les ajustements locaux à alpha seront au mieux arbitraires. Ndash balpha 9830 Jun 21 09 at 15:31 Je laisserais la valeur alpha seul, et de remplir les données manquantes. Puisque vous ne savez pas ce qui se passe pendant le temps où vous ne pouvez pas échantillonner, vous pouvez remplir ces échantillons avec 0s, ou tenir 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 recomputer l'EMA. Ce que j'essaie d'obtenir est que vous avez une entrée xn qui a des trous. Il n'existe aucun moyen de contourner le fait que vous manquez des données. Ainsi, vous pouvez utiliser un maintien d'ordre zéro, ou le mettre à zéro, ou une sorte d'interpolation entre xn et xnM. 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. Réponse June 21 09 at 13:35 De passer une heure ou ainsi de mucking un peu avec les mathématiques pour cela, je pense que simplement varier l'alpha me donnera réellement l'interpolation appropriée entre les deux points dont vous parlez, mais dans un Beaucoup plus simple. En outre, je pense que la variation de l'alpha traitera aussi correctement les échantillons prélevés entre les intervalles d'échantillonnage standard. En d'autres termes, je cherche ce que vous avez décrit, mais en essayant d'utiliser les mathématiques pour comprendre la façon simple de le faire. Ndash Curt Sampson Jun 21 09 at 14:07 Je ne pense pas qu'il ya une telle bête que interpolation quotproper. Vous ne savez tout simplement pas ce qui s'est passé dans le temps que vous n'êtes pas l'échantillonnage. Interpolation bonne et mauvaise implique une certaine connaissance de ce que vous avez manqué, puisque vous avez besoin de mesurer contre qui de juger si une interpolation est bonne ou mauvaise. Cela dit, vous pouvez placer des contraintes, c'est-à-dire avec une accélération maximale, une vitesse, etc. Je pense que si vous savez comment modéliser les données manquantes, alors vous modéliseriez simplement les données manquantes, puis appliquez l'algorithme EMA sans changement, plutôt Que de changer l'alpha. Just my 2c :) ndash freespace Jun 21 09 à 14:17 C'est exactement ce que je recevais dans ma modification à la question il ya 15 minutes: quotYou simplement don39t savoir ce qui s'est passé dans le temps que vous n'êtes pas d'échantillonnage, mais ce qui est vrai Même si vous prenez un échantillon à chaque intervalle désigné. Ainsi ma contemplation de Nyquist: tant que vous savez que la forme d'onde ne change pas de direction plus que chaque couple d'échantillons, l'intervalle d'échantillonnage réel ne devrait pas être important et devrait pouvoir varier. L'équation EMA me semble exactement calculer comme si la forme d'onde a changé linéairement de la dernière valeur d'échantillon à la courante. Ndash Curt Sampson Jun 21 09 at 14:26 Je ne pense pas que c'est tout à fait vrai. Le théorème de Nyquist requiert un minimum de 2 échantillons par période pour pouvoir identifier le signal de manière unique. Si vous ne faites pas cela, vous obtenez aliasing. Il serait le même que l'échantillonnage comme fs1 pour un temps, puis fs2, puis retour à fs1, et vous obtenez aliasing dans les données lorsque vous échantillons avec fs2 si fs2 est en dessous de la limite de Nyquist. Je dois également avouer que je ne comprends pas ce que vous entendez par quotwaveform changements linéairement de l'échantillon précédent à l'actuel onequot. Pourriez-vous s'il vous plaît expliquer Cheers, Steve. Ndash freespace Jun 21 09 at 14:36 Ceci est similaire à un problème ouvert sur ma liste de tâches. J'ai un schéma élaboré dans une certaine mesure, mais n'ont pas de travail mathématique à l'appui de cette suggestion encore. Mise à jour du résumé de l'ampli: Souhaitez garder le facteur de lissage (alpha) indépendant du facteur de compensation (que je désigne ici comme bêta). Jasons excellente réponse déjà acceptée ici fonctionne très bien pour moi. 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), qui pourrait être utilisé pour appliquer le lissage plusieurs fois. Appliquer la formule 8 fois dans ce cas. Vous avez effectivement fait un lissage biaisé plus vers la valeur actuelle. Pour obtenir un meilleur lissage, nous avons besoin de tordre l'alpha tout en appliquant la formule 8 fois dans le cas précédent. Ce que cette approximation de lissage manquera Il a déjà manqué 7 échantillons dans l'exemple ci-dessus Ceci a été approché à l'étape 1 avec une réapplication aplatie de la valeur courante de 7 fois supplémentaires Si nous définissons un facteur d'approximation bêta qui sera appliqué avec l'alpha (Comme alphabeta au lieu d'alpha), nous allons supposer que les 7 échantillons manqués ont été en douceur entre les valeurs de l'échantillon précédent et actuel. J'ai réfléchi à ce sujet, mais un peu de bouger avec les mathématiques m'a fait au point où je crois que, plutôt que d'appliquer la formule de huit fois avec la valeur de l'échantillon, je peux faire un calcul D'un nouvel alpha qui me permettra d'appliquer la formule une fois, et me donner le même résultat. De plus, cela traiterait automatiquement de la question des échantillons compensés par les temps d'échantillonnage exacts. Ndash Curt Sampson Jun 21 09 at 13:47 La demande unique est très bien. Ce dont je ne suis pas sûr, c'est la bonne approximation des 7 valeurs manquantes. Si le mouvement continu fait la gigue de la valeur beaucoup sur les 8 millisecondes, les approximations peuvent être tout à fait hors de la réalité. Mais, si vous échantillonniez à 1ms (la plus haute résolution en excluant les échantillons retardés), vous avez déjà calculé que la gigue en 1ms n'est pas pertinente. Ce raisonnement fonctionne-t-il pour vous (j'essaie toujours de me convaincre). Ndash nik Jun 21 09 at 14:08 Droit. C'est le facteur bêta de ma description. Un facteur bêta serait calculé en fonction de l'intervalle de différence et des échantillons actuels et précédents. Le nouvel alpha sera (alphabeta) mais il sera utilisé uniquement pour cet échantillon. Alors que vous semblez être en train de faire l'alpha dans la formule, je tend vers l'alpha constant (facteur de lissage) et un bêta calculé indépendamment (un facteur d'accord) qui compense les échantillons manqués tout à l'heure. Ndash nik 21 juin à 15:23
No comments:
Post a Comment