Tuesday 31 October 2017

Moving average array java no Brasil


Uma implementação simples de média móvel em Java. Em várias ocasiões, eu quis computar métricas simples em meus aplicativos Java, por exemplo, o número de acessos por hora ou erros durante um período de tempo. Embora a computação de métricas simples não seja muito difícil, Trabalho extra e eu prefiro passar esse tempo no domínio do problema Fiquei surpreso ao não encontrar nenhuma solução amplamente aceita para métricas em Java Eu encontrei Metrics, mas parecia um pouco complicado e não bem documentado - Tudo o que eu realmente queria era para Calcular uma média móvel Eu pensei sobre o problema um pouco mais e decidiu que não é um problema difícil Aqui está a minha solução. Isso funciona criando uma matriz de tamanho de freqüência de atualização de janela, em seguida, um segmento define a contagem para o próximo índice na matriz em A freqüência de atualização A contagem para o intervalo é simplesmente array i - array i 1, que é a contagem mais recente menos a contagem mais antiga Para um intervalo de 10 minutos, a contagem mais antiga i 1 é exatamente 10 minutos old. To adicionar um movimento A média para o nosso primeiro código nós precisamos de um contador, usando AtomicLong. This contador deve ser incrementado com base nos eventos que você está interessado em computação eg pedidos POST para um serviço REST. Nós precisamos fornecer a implementação com acesso ao contador e que é Realizado através da interface GetCount Aqui vou criar uma média móvel com uma janela de 5 minutos que atualiza cada segundo. E para obter a média atual, chamamos simplesmente o método getAverage. Um detalhe de implementação chave é como o tamanho da matriz é determinado pela divisão da janela Pela freqüência de atualização Assim, uma grande janela com freqüência de atualização freqüente pode consumir uma quantidade significativa de memória Neste exemplo o tamanho da matriz é razoável 300 No entanto, se criamos uma média móvel de 24 horas com um intervalo de 1 segundo o tamanho seria 86400 A Freqüência de atualização mais razoável para um período de 24 horas pode ser a cada 5 minutos tamanho da matriz de 288. Outra consideração de escolher a janela e atualizar a freqüência é a janela deve ser di Visível pela frequência Por exemplo uma janela de 2 minutos com uma frequência de actualização de 6 segundos é ok, mas uma frequência de actualização de 7 segundos não é, uma vez que não é divisível por 120 An IllegalArgumentException é lançada se a frequência de actualização do módulo de janela não for zero. Implementação requer um thread por média móvel, o que não é muito eficiente Uma solução melhor seria compartilhar um thread em muitas médias Update Eu atualizei o código para compartilhar um thread aqui. Ultimamente, há um problema de estado inicial que não temos dados Ainda para toda a janela Por exemplo, se você tem uma janela de 5 minutos e apenas 15 segundos de dados Esta implementação retorna nulo até que tenhamos 5 minutos de dados Outra abordagem é estimar a média Suponha que temos uma contagem de 10 em 30 segundos, então Podemos calcular a média como 40 em 2 minutos No entanto, há risco de erro significativo extrapolando dados incompletos Por exemplo, se tivéssemos uma explosão de 20 acessos em 2 segundos, estaríamos estimando 1200 por 2 minutos, whic H com toda a probabilidade é maneira off. Your interno para é iterar toda a matriz de modo que s porque você sempre obter a mesma média de um para toda a matriz, você deve iterar de 0 para o número atual do exterior para instead. Your mover A média está sendo atualizada com base em j de seu interior para isso significa que irá substituir os valores anteriores de cada novo loop, isso deve estar dentro do exterior para em vez do interno usando i como index. You estão dividindo soma j para calcular médias, cada novo Loop interno j você vai dividir por 0 a primeira soma que eu acredito que você pretende usar j 1 em vez disso, o índice não é o mesmo que o comprimento atual. Dicas para solucionar problemas. Evitar usando variáveis ​​para arrays loop, você deve usar instead. For uma questão de Reproduzir o problema que você poderia nos dar o problema isolado, em vez de seu código atual ie. Imagine se o erro está em suas entradas, como poderíamos acreditar que você realmente usou them. answered Oct 4 13 at 20 54. Você está fazendo loop em todos os dados Cada vez que você deve ter para int ji averageLength i - MediaLength 2 0 ji averageLength 2 j numDataPoints j ou algo semelhante para a sua innermost average. Also, movingAverage i sum j deve ser modificado para lidar com o caso quando j é 0 Em particular, deve provavelmente ser movingAverage i soma averageLength e deve ser aplicado Para o slot movingAverage i fora do loop de média. Respondido Oct 4 13 at 20 42.Próximo tempo, tome os comentários sobre a atribuição fora da questão antes de publicá-lo Mas, uma vez que você parece muito novo nisso, pense em como você iria Através dos dados, e fazê-lo fazer Você deve tentar certificar-se de cada loop está parando no ponto correto, e lembre-se que se você parar quando não há mais números, como quando você está fazendo o loop interno e você só pode Obter mais 3 números em vez de 4 o programa precisa parar também Certifique-se de seu código está verificando para this. answered Oct 4 13 at 20 56. Sem quaisquer detalhes adicionais, você provavelmente precisará de uma média móvel não ponderada Em qualquer ponto A i na entrada Array A o F comprimento N com 0 i N, que s simplesmente a média das entradas K anteriores da matriz, até e incluindo A i Se aren t K tais valores, então média dos i 1 valores de A 0 a A i inclusive. Um pouco de pensamento irá mostrar-lhe que você não precisa adicionar todos os valores de K cada vez Basta manter a soma e, ao passar para o próximo ponto esta é uma média móvel, subtrair o valor que está sendo substituído e adicionar o novo Valor que irá substituí-lo Durante os primeiros pontos K-1, você simplesmente adicionar o novo valor para a soma e aumentar o seu contador por 1.At qualquer ponto neste processo, a média móvel é a soma atual dividido pelo valor da contagem atual . Em uma média móvel, você precisa ter algum tipo de tamanho de janela. Seu tamanho de janela é averageLength, então ele será algo parecido com isto. O loop for começa nos dados atuais e volta para trás averageLength Pontos de dados e acrescenta-los Você só terá uma média móvel quando você tem você tem quando você tem o suficiente Os pontos de dados ea média será a soma dividida pelo comprimento médio. Nota Não testado apenas o código sudo, mas esta é a idéia. resposta Oct 4 13 at 21 05.Your Answer.2017 Stack Exchange, Inc. I essencialmente tem um array De valores como este. A matriz acima é simplificada demais, estou coletando 1 valor por milissegundo no meu código real e eu preciso processar a saída em um algoritmo que eu 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 olharia 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 é tomar esses valores e aplicar um algoritmo para Eles que vai suavizar-los um pouco para que eu tenho mais valores lineares, ou seja, eu gostaria que meus resultados sejam curvy, não jaggedy. I foi dito para aplicar um filtro de média móvel exponencial para os meus valores Como posso fazer isso É realmente Difícil de ler equações matemáticas, eu lidar muito melhor com o código. Como faço para processar Valores em minha matriz, aplicando um cálculo de média móvel exponencial para até mesmo para fora. asked Feb 8 12 at 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 chama para uma pequena classe assumindo Você está usando Java 5 ou posterior. Instantiar com o parâmetro de decadência que você deseja pode ter ajuste deve ser entre 0 e 1 e, em seguida, use a média para filter. When ler uma página em alguns mathmatical recorrência, tudo o que você realmente precisa saber quando transformá-lo em Código é que os matemáticos gostam de escrever índices em matrizes e seqüências com subscritos Eles ve algumas outras notações, bem como, o que doesn t ajudar No entanto, o EMA é bastante simples, como você só precisa lembrar um valor antigo não arrays estado complicado required. answered 8 de fevereiro em 20 42. TKKocheran Muito bonito Não é agradável quando as coisas podem ser simples Se começar com uma nova seqüência, obter um novo averager Observe que os primeiros termos na seqüência média saltarão em torno de um pouco devido a Efeitos de limite, 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 de média móvel para o averager e experimentar sem perturbar o resto do seu programa muito Donal Fellows Feb 9 12 at 0 06.I Estou tendo dificuldade em entender suas perguntas, mas vou tentar responder de qualquer maneira.1 Se o algoritmo encontrado 0 25 em vez de 0 36, então ele está errado É errado porque ele assume um aumento ou diminuição monotônica que está sempre subindo ou Sempre indo para baixo A menos que você média TODOS os seus dados, seus pontos de dados --- como você apresentá-los --- são não-lineares Se você realmente quer encontrar o valor máximo entre dois pontos no tempo, em seguida, fatia sua matriz de tmin para tmax e encontrar O máximo de que subarray.2 Agora, o conceito de médias móveis é muito simples imaginar que eu tenho a seguinte lista 1 4, 1 5, 1 4, 1 5, 1 5 Eu posso suavizar para fora, tendo 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 an D 1 4 segundos e primeiros números 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, selecione um teste de ações Tesla Motors bastante TSLA volátil e clique em technicals na parte inferior do gráfico Select Moving Média com um determinado período e média móvel exponencial para comparar suas diferenças. A média móvel exponencial é apenas mais uma elaboração disto, mas pondera os dados mais antigos menos do que os novos dados, isso é uma maneira de polarizar o alisamento em direção às costas. Entry. So, este é mais um comentário do que uma resposta, mas a pequena caixa de comentário foi apenas a pequena boa sorte. Se você está 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ê começa Seria o último x termos divididos Ed por x Pseudocódigo não testado. Note que você vai precisar para lidar com o início e fim das partes dos dados, uma vez que claramente você não pode média t os últimos 5 termos quando você está em seu ponto de dados 2 Além disso, existem maneiras mais eficientes de calcular este movimento Soma média soma - mais antigo mais novo, mas isso é para obter o conceito do que está acontecendo em across. answered fevereiro 8 12 em 20 41.

No comments:

Post a Comment