Tuesday 4 July 2017

Implementação Média Móvel


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 batidas em 2 segundos, pode-se estimar 1200 por 2 minutos, o que, com toda a probabilidade, está fora. Em estatísticas, uma média móvel simples é um algoritmo que calcula a média não ponderada das últimas n amostras . O parâmetro n geralmente é chamado de tamanho da janela, porque o algoritmo pode ser pensado como uma janela que desliza sobre os pontos de dados. Ao usar uma formulação recursiva do algoritmo, o número de operações necessárias por amostra é reduzido a uma adição, uma subtração e uma divisão. Uma vez que a formulação é independente do tamanho da janela n. A complexidade de tempo de execução é O (1). Isto é, constante. A fórmula recursiva da média móvel não ponderada é, onde média é a média móvel e x representa um ponto de dados. Assim, sempre que a janela desliza para a direita, um ponto de dados, a cauda, ​​deixa cair e um ponto de dados, a cabeça, se move. Implementação Uma implementação da média móvel simples deve levar em consideração a inicialização Algoritmo desde que A janela não está totalmente preenchida com valores, a fórmula recursiva falha. Armazenamento O acesso ao elemento da cauda é necessário, o que, dependendo da implementação, requer um armazenamento de n elementos. Minha implementação usa a fórmula apresentada quando a janela está totalmente preenchida com valores e, de outro modo, muda para a fórmula, que atualiza a média ao recalcular a soma dos elementos anteriores. Observe que isso pode levar a instabilidades numéricas devido à aritmética de ponto flutuante. No que diz respeito ao consumo de memória, a implementação usa iteradores para acompanhar os elementos da cabeça e da cauda. Isso leva a uma implementação com constantes requisitos de memória independentes do tamanho da janela. Aqui está o procedimento de atualização que desliza a janela para a direita. Em. NET, a maioria das coleções invalida seus enumeradores quando a coleção subjacente é modificada. A implementação, no entanto, depende de enumeradores válidos. Especialmente em aplicações baseadas em streaming, a coleção subjacente precisa ser modificada quando um novo elemento chegar. Uma maneira de lidar com isso é criar uma coleção de tamanho fixo circular simples de tamanho n1 que nunca invalida seus iteradores e, alternativamente, adicione um elemento e chame Shift. Gostaria de descobrir como implementar isso, pois a função Test é muito confusa para mim. Preciso converter dados em Array, então execute SMA SMA SMA novo (20, matriz) para um SMA de 20 períodos Como faço para lidar Função shift () É necessário implementar construtores. (Desculpe pela confusão). Não, você não precisa converter seus dados em uma matriz, desde que seus dados implemente IEnumerable1 e o tipo enumerado seja duplo. No que diz respeito à sua mensagem privada, você precisa converter o DataRow em algo que é enumerável de valores duplos. Sua abordagem funciona. Shift, desliza a janela para uma posição para a esquerda. Para um conjunto de dados de dizer 40 valores e um SMA de 20 períodos, você tem 21 posições em que a janela se encaixa (40 8211 20 1). Cada vez que você chama Shift (), a janela é movida para a esquerda por uma posição e Average () retorna o SMA para a posição atual da janela. Ou seja, a média não ponderada de todos os valores dentro da janela. Além disso, minha implementação permite calcular o SMA mesmo se a janela não estiver totalmente preenchida no início. Então, na essência, espero que isso ajude. Qualquer outra questão AVISO DE COPYRIGHT Christoph Heindl e cheind. wordpress, 2009-2012. O uso não autorizado e a duplicação deste material sem permissão expressa e escrita deste autor de blogs e do proprietário são estritamente proibidos. Excertos e links podem ser usados, desde que seja dado crédito completo e claro a Christoph Heindl e a cheind. wordpress com orientação apropriada e específica para o conteúdo original. Mensagens recentes A média móvel como um filtro A média móvel é freqüentemente usada para suavizar dados na presença de ruído. A média móvel simples nem sempre é reconhecida como o filtro de Resposta de Impulso Finito (FIR) que é, enquanto na verdade é um dos filtros mais comuns no processamento de sinal. Tratá-lo como um filtro, permitindo compará-lo com, por exemplo, filtros com janelas-sinc (veja os artigos sobre os filtros passa-baixa, passagem alta e banda passada e banda-rejeição para exemplos desses). A principal diferença com esses filtros é que a média móvel é adequada para sinais para os quais a informação útil está contida no domínio do tempo. Dos quais suavizar medições por meio da média é um excelente exemplo. Os filtros Windowed-sinc, por outro lado, são performantes no domínio da frequência. Com equalização no processamento de áudio como um exemplo típico. Existe uma comparação mais detalhada de ambos os tipos de filtros no Time Domain vs. Frequency Domain Performance of Filters. Se você tem dados para os quais tanto o tempo como o domínio de freqüência são importantes, então você pode querer dar uma olhada em Variações na Média Móvel. Que apresenta uma série de versões ponderadas da média móvel que são melhores nisso. A média móvel do comprimento (N) pode ser definida como escrita como normalmente é implementada, com a amostra de saída atual como a média das amostras anteriores (N). Visto como um filtro, a média móvel realiza uma convolução da sequência de entrada (xn) com um impulso retangular de comprimento (N) e altura (1N) (para tornar a área do pulso e, portanto, o ganho do filtro , 1 ). Na prática, é melhor tomar (N) ímpar. Embora uma média móvel também possa ser calculada usando um número par de amostras, usando um valor ímpar para (N) tem a vantagem de que o atraso do filtro será um número inteiro de amostras, uma vez que o atraso de um filtro com (N) As amostras são exatamente ((N-1) 2). A média móvel pode então ser alinhada exatamente com os dados originais, deslocando-a por um número inteiro de amostras. Domínio do tempo Uma vez que a média móvel é uma convolução com um pulso retangular, sua resposta de freqüência é uma função sinc. Isso torna algo parecido com o dual do filtro windowed-sinc, uma vez que é uma convolução com um pulso sinc que resulta em uma resposta de freqüência retangular. Essa é essa resposta de freqüência de voz que torna a média móvel um desempenho pobre no domínio da freqüência. No entanto, ele funciona muito bem no domínio do tempo. Portanto, é perfeito suavizar os dados para remover o ruído e, ao mesmo tempo, manter uma resposta de passo rápido (Figura 1). Para o típico Black Gaussian Noise (AWGN) que é frequentemente assumido, as amostras de média (N) têm o efeito de aumentar o SNR por um fator de (sqrt N). Uma vez que o ruído para as amostras individuais não está correlacionado, não há motivo para tratar cada amostra de forma diferente. Assim, a média móvel, que dá a cada amostra o mesmo peso, eliminará a quantidade máxima de ruído para uma nitidez de resposta de passo dada. Implementação Por ser um filtro FIR, a média móvel pode ser implementada através da convolução. Em seguida, terá a mesma eficiência (ou falta dela) como qualquer outro filtro FIR. No entanto, também pode ser implementado de forma recursiva, de uma maneira muito eficiente. Ele segue diretamente da definição de que esta fórmula é o resultado das expressões para (yn) e (yn1), ou seja, onde percebemos que a mudança entre (yn1) e (yn) é que um termo extra (xn1N) aparece em O fim, enquanto o termo (xn-N1N) é removido desde o início. Em aplicações práticas, muitas vezes é possível excluir a divisão por (N) para cada termo, compensando o ganho resultante de (N) em outro local. Esta implementação recursiva será muito mais rápida do que a convolução. Cada novo valor de (y) pode ser calculado com apenas duas adições, em vez das adições (N) que seriam necessárias para uma implementação direta da definição. Uma coisa a procurar com uma implementação recursiva é que os erros de arredondamento se acumulam. Isso pode ou não ser um problema para a sua aplicação, mas também implica que esta implementação recursiva funcionará melhor com uma implementação inteira do que com números de ponto flutuante. Isso é bastante incomum, uma vez que uma implementação em ponto flutuante geralmente é mais simples. A conclusão de tudo isso deve ser que você nunca deve subestimar a utilidade do filtro de média móvel simples em aplicações de processamento de sinal. Ferramenta de design de filtro Este artigo é complementado com uma ferramenta de design de filtro. Experimente valores diferentes para (N) e visualize os filtros resultantes. Tente agora

No comments:

Post a Comment