Thursday 3 August 2017

Exponencial Moving Average Java Code


O que é AvgOldValue agora (não, não é definido no seu código). Por favor, não aplique as edições de quitação fixa do quothot ao código postado que apenas apresenta mais erros. Poste o código real que você está usando. Não crie uma versão especial que você tenha derivado para publicar aqui. Dê-nos a coisa real. Desta forma, você obtém uma revisão real. Ndash I39ll adicione comentários amanhã 31 de agosto 16 às 23:08 Os nomes das variáveis ​​são sub-par. Por que as abreviaturas desnecessárias (por exemplo, média) Por que os prefixos estranhos (por exemplo, lValue) Aqui é a minha dica simples e final quando se trata de nomes: Nomeie as coisas depois do que estão fazendo ou o que elas contém. E minha última regra: você nunca pode usar nomes de variáveis ​​de uma letra, com a única exceção de dimensões. Esse é um excelente exemplo de um comentário inútil. No geral, não vejo por que sua classe é estática. Parece que será usado como uma classe de instância, mas você não quer passar a referência, simplesmente criou um singleton aqui. Considere criar uma classe de instância e, em seguida, passar a questão de referência para os segmentos que compartilham essa instância. Eu essencialmente tenho uma matriz de valores como este: a matriz acima é simplificada demais, estou coletando 1 valor por milissegundo no meu código real e preciso processar o Saída em um algoritmo que escrevi para encontrar o pico mais próximo antes de um ponto no tempo. Minha lógica falha porque no meu exemplo acima, 0.36 é o pico real, mas meu algoritmo olhava para trás e veria o último número 0.25 como o pico, pois há uma diminuição para 0.24 antes dele. O objetivo é levar esses valores e aplicar um algoritmo para eles, que os suavizará um pouco para que eu tenha mais valores lineares. (Ie: Id como os meus resultados para serem curvy, não jaggedy) Eu fui dito para aplicar um filtro exponencial de média móvel aos meus valores. Como posso fazer isso. É muito difícil para mim ler equações matemáticas, eu lido muito melhor com o código. Como faço para processar valores na minha matriz, aplicando um cálculo exponencial da média móvel para os fazer sair, solicitado 8 de fevereiro às 20:27 Para calcular uma média móvel exponencial. Você precisa manter algum estado ao redor e você precisa de um parâmetro de ajuste. Isso exige uma pequena classe (supondo que você esteja usando o Java 5 ou posterior): instanciar com o parâmetro de decaimento desejado (pode ser necessário que a sintonização esteja entre 0 e 1) e depois use a média () para filtrar. Ao ler uma página sobre uma recorrência matemática, tudo o que você realmente precisa saber ao transformá-lo em código é que os matemáticos gostam de escrever índices em arrays e seqüências com subscritos. (Eles também têm algumas outras notações, o que não ajuda.) No entanto, o EMA é bastante simples, pois você só precisa se lembrar de um valor antigo, não é necessário nenhum arrays de estados complicados. Respondeu 8 de fevereiro às 20:42 TKKocheran: praticamente. Não é bom quando as coisas podem ser simples (Se começar com uma nova seqüência, obtenha uma nova média). Observe que os primeiros termos da seqüência média saltarão em torno de um bit devido a efeitos de limites, mas você obtém aqueles com outras médias móveis também. No entanto, uma boa vantagem é que você pode envolver a lógica média móvel na média e experimentar sem incomodar demais o seu programa. Ndash Donal Fellows 9 de fevereiro às 0:06 Estou tendo dificuldade em entender suas perguntas, mas vou tentar responder de qualquer maneira. 1) Se o seu algoritmo encontrou 0,25 em vez de 0,36, então é errado. É errado porque assume um aumento ou diminuição monotônico (que sempre está subindo ou sempre está indo para baixo). A menos que você tenha média de todos os seus dados, seus pontos de dados --- como você os apresenta --- são não-lineares. Se você realmente quer encontrar o valor máximo entre dois pontos no tempo, então corte sua matriz de tmin para tmax e encontre o máximo desse subarray. 2) Agora, o conceito de médias móveis é muito simples: imagine que eu tenho a seguinte lista: 1.4, 1.5, 1.4, 1.5, 1.5. Eu posso suavizar, levando a média de dois números: 1.45, 1.45, 1.45, 1.5. Observe que o primeiro número é a média de 1,5 e 1,4 (segundo e primeiro número), a segunda (nova lista) é a média de 1,4 e 1,5 (terceira e segunda lista antiga) a terceira (nova lista) a média de 1,5 e 1,4 (Quarto e terceiro), e assim por diante. Eu poderia ter feito período três ou quatro, ou n. Observe como os dados são muito mais suaves. Uma boa maneira de ver as médias móveis no trabalho é ir para o Google Finance, selecionar um estoque (tente Tesla Motors bastante volátil (TSLA)) e clique em técnicas na parte inferior do gráfico. Selecione a média móvel com um período determinado e a média móvel exponencial para comparar suas diferenças. A média móvel exponencial é apenas uma outra elaboração deste, mas considera os dados mais antigos inferiores aos novos dados, esta é uma maneira de polarizar o alisamento para trás. Leia a entrada da Wikipedia. Então, isso é mais um comentário do que uma resposta, mas a pequena caixa de comentários foi apenas pequena. Boa sorte. Se você estiver tendo problemas com a matemática, você poderia ir com uma média móvel simples em vez de exponencial. Então, a saída que você obtém seria os últimos x termos divididos por x. Pseudocódigo não testado: note que você precisará lidar com as partes de início e término dos dados, pois claramente você não pode significar os últimos 5 termos quando estiver no seu segundo ponto de dados. Além disso, existem maneiras mais eficientes de calcular essa média móvel (soma sumária - a mais nova), mas é para obter o conceito de o que está acontecendo. Respondeu 8 de fevereiro às 20:41 Sua resposta 2017 Stack Exchange, IncDTrace e as médias de movimentação Por nickstephen em 20 de outubro de 2006 Um cliente me perguntou o outro dia se o DTrace pudesse ser usado para manter uma média móvel. Bem, sim, pode. O DTrace possui suporte integrado muito poderoso para vários tipos de agregações. Incluindo o suporte para manter um valor médio, o que torna a escrita deste tipo de código de filho. Heres um código simples snippit que exibe a memória livre média desde que o script DtraCE foi iniciado: Esta função de média fornece uma média desde que o script DTrace foi iniciado, o que é ótimo para scripts com vida útil finita. Mas se você estiver monitorando um sistema durante um longo período, a função de média não é tão útil - as mudanças recentes são subjugadas por todos os dados mais antigos. Para esse tipo de medida você geralmente usa algo como uma média móvel ou móvel, o que lhe dará a média nas últimas N amostras. Quando uma nova amostra vem junto, você deve descartar a amostra mais antiga, adicionar a nova amostra e recalcular a média. As agregações DTrace não o ajudarão diretamente a manter este conjunto de trabalho, você precisa mantê-lo sozinho. Você pode armazenar este conjunto de trabalho em uma agregação, ou uma matriz associativa. Mas como o tamanho do conjunto que você está calculando a média é predefinido, você também pode usar uma matriz escalar. E em vez de recalcular a média sobre a matriz em cada amostra, se você estiver mais inteligente, mantenha um total em execução de todas as amostras no conjunto e calcule as diferenças. Quando você substituir uma entrada na matriz, você a subtrai do total, e quando você adiciona a nova amostra à matriz, você adiciona-a ao total. Então, a média é apenas o total dividido pelo número de amostras. muito mais rapido. Heres algum código de exemplo que demonstra a manutenção de uma média móvel da memória livre na caixa: e é a saída. Observe como o número de amostras toca em N (N10). Se você traçou isso em um gráfico usando algo como a ferramenta de visualização do Chips DTrace. Você esperaria ver mais instabilidade inicialmente quando a contagem de amostras for inferior a N, e depois a média móvel se estabilizará devido ao aumento do amortecimento da média sobre o conjunto de trabalho. Para evitar ter que acompanhar as últimas N amostras, também é possível usar técnicas de média ligeiramente diferentes, que são médias em todas as amostras históricas, mas com uma predominância dada aos dados mais recentes, como uma média móvel ponderada ou movimento exponencial média. Abaixo está o código de exemplo DTrace simples para uma média móvel exponencial. Você pode ajustar as ponderações de acordo com o período de amostragem que deseja permanecer significativo. Observe que o valor da média deve ser inicializado corretamente, caso contrário, a média incluirá uma amostra zero falsa.

No comments:

Post a Comment