Tuesday 15 August 2017

Média Móvel De Matriz Javascript


Uma Implementação de Implantação Mínima Simples em Java Em várias ocasiões, queria calcular métricas simples em minhas aplicações Java, por exemplo, o número de hits por hora ou erros ao longo de um período de tempo. Embora o cálculo de métricas simples não seja extremamente difícil, é apenas um trabalho extra e Id, antes, gastar esse tempo no domínio do problema. Fiquei surpreso ao não encontrar soluções amplamente aceitas 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 calcular uma média móvel. Pensei um pouco mais sobre o problema e decidi não ser um problema difícil. Heres minha solução Isso funciona criando uma matriz de tamanho de freqüência de atualização de janela, então um segmento define a contagem para o próximo índice na matriz na freqüência de atualização. A contagem para o intervalo é simplesmente arrayi - arrayi1, que é a contagem mais recente menos a contagem mais antiga. Por um intervalo de 10 minutos, a contagem mais antiga (i1) é exatamente 10 minutos de idade. Para adicionar uma média móvel ao nosso código, primeiro precisa de um contador, usando o AtomicLong. Este contador deve ser incrementado com base nos eventos que você está interessado na computação (por exemplo, pedidos POST para um serviço REST). Precisamos fornecer a implementação com acesso ao contador e isso é realizado através da interface GetCount. Aqui vou criar uma média móvel com uma janela de 5 minutos que atualiza a cada segundo. E para obter a média atual, simplesmente chamamos o método getAverage: um detalhe de implementação de chave é como o tamanho da matriz é determinado: dividindo a janela pela freqüência de atualização. Portanto, uma grande janela com frequência de atualização frequente pode consumir uma quantidade significativa de memória. Neste exemplo, o tamanho da matriz é razoável 300. No entanto, se criarmos uma média móvel de 24 horas com um intervalo de 1 segundo, o tamanho seria 86400. Uma freqüência de atualização mais razoável por 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 a freqüência de atualização é que a janela deve ser divisível pela freqüência. Por exemplo, uma janela de 2 minutos com uma frequência de atualização de 6 segundos é ok, mas uma freqüência de atualização de 7 segundos não é, uma vez que não é divisível por 120. Uma IllegalArgumentException é lançada se a freqüência de atualização do módulo da janela não for zero. Esta implementação requer um tópico por média móvel, o que não é muito eficiente. Uma solução melhor seria compartilhar um fio em muitas médias. Atualização. Eu atualizei o código para compartilhar um tópico aqui. Por fim, há um problema de estado inicial: ainda não temos dados para toda a janela. Por exemplo, se você tiver uma janela de 5 minutos e apenas 15 segundos de dados. Esta implementação retorna nula até que possamos 5 minutos de dados. Outra abordagem é estimar a média. Suponhamos ter uma contagem de 10 em 30 segundos, então podemos estimar a média como 40 em 2 minutos. No entanto, existe o risco de erros significativos extrapolando dados incompletos. Por exemplo, se tivéssemos uma explosão de 20 hits em 2 segundos, mande-se estimar 1200 por 2 minutos, o que, com toda a probabilidade, está fora. Seu interior é iterando toda a matriz, então é por isso que você sempre obtém a mesma média (a Um para toda a matriz), você deve iterar de 0 para o número atual do exterior para em vez disso. Sua média móvel está sendo atualizada com base em j do seu interior, o que significa que irá anular os valores anteriores de cada novo loop, isso deve estar dentro do exterior para, em vez do interno, usando i como índice. Você está dividindo sumj para calcular médias, cada novo loop interno j você irá dividir por 0 a primeira soma. Eu acredito que você quisesse usar o j1 em vez disso, o índice não é o mesmo que o comprimento atual Dicas para solucionar problemas: Evite usar variáveis ​​para arrays de loop, você deve usar array. length em vez disso. Para uma questão de reproduzir o seu problema, você poderia nos dar o problema isolado em vez do seu código atual. Ou seja: Imagine se o erro está em suas entradas, como podemos acreditar que você realmente as usou, respondidas em 4 de outubro 13 às 20:54 Você está fazendo o loop de todos os dados sempre. Você deve ter para (int j (igtaverageLengthi-averageLength2: 0) jlt iaverageLength2 ampamp jltnumDataPoints j) (ou algo semelhante) para a sua média mais interna. Além disso, moveAverageisumj deve ser modificado para lidar com o caso quando j é 0. Em particular, provavelmente deve ser movingAverageisumaverageLength e deve ser aplicado ao slot movingAveragei fora do loop de média. Respondeu 4 de outubro 13 às 20:42 Na próxima vez, leve os comentários sobre a cessão da questão antes de publicá-la. Mas como você parece muito novo nisso, pense em como você passaria pelos dados, e faria isso. Você deve tentar certificar-se de que cada loop está parando no ponto correto e lembre-se de 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 também precisa parar. Verifique se o seu código está a verificar isso. Respondeu 4 de outubro às 20:56 Sem detalhes adicionais, você provavelmente precisa de uma média móvel não ponderada. Em qualquer ponto Ai na matriz de entrada A de comprimento N (com 0ltiltN), isso é simplesmente a média das entradas K anteriores da matriz, até e incluindo Ai. Se não houver valores desse tipo, então, mude os valores (i1) de A0 para Ai. Inclusive. Um pouco de pensamento irá mostrar que você não precisa adicionar todos os valores K sempre. Basta manter a soma e, ao passar para o próximo ponto (esta é uma média móvel), subtrai o valor que está sendo substituído e adiciona o novo valor que irá substituí-lo. (Durante os primeiros pontos K-1, você simplesmente adicionará o novo valor à soma e aumentará seu contador em 1.) Em qualquer ponto desse processo, a média móvel é a soma atual dividida pelo valor atual da contagem. Respondeu 4 de outubro às 21:05 Em uma média móvel, você precisa ter algum tipo de tamanho de janela. O tamanho da sua janela é o comprimento médio, por isso parecerá algo assim: o loop for começa nos dados atuais e volta os pontos de dados da média e adiciona-os. Você só terá uma média móvel quando você tiver quando tiver pontos de dados suficientes e a média será a soma dividida pelo comprimento médio. Nota: Não testado apenas o código sudo, mas essa é a idéia. Respondeu 4 de outubro 13 às 21:05 Sua resposta 2017 Stack Exchange, Inctraderema a função traderema () não funciona corretamente. Ele calcula apenas a média das entradas do último período. Siga o seguinte código para traderema: função EMACalculator (limite, matriz) EMApreviousday array0 printr (array) multiplicador1 (2limit1) EMAarray () EMA array0 Fechar array1 while (limite) echoEMA é EMAN EMA (Close - EMApreviousday) multiplicador1 EMApreviousday EMApreviousday EMA limit - - retornar EMA onde limite aceitar o período de ema e matriz. Aceite uma série de dados para cálculo de ema.

No comments:

Post a Comment