Simple Moving Average Algorithm Java


Eu preciso acompanhar os últimos 7 dias de trabalho em um loop de leitura de arquivos planos. Está sendo usado para medir a fatigabilidade das listas de trabalho. Agora eu tenho algo que funciona, mas parece bastante detalhado e não tenho certeza se há um padrão que é mais sucinto. Atualmente, eu tenho uma classe Java com uma matriz estática para armazenar os últimos dados de x dias, então, ao ler o arquivo, retiro o primeiro elemento e mova os outros 6 (por um total de uma semana) de volta por um. O processamento desta matriz estática é feito em seu próprio método, ou seja. A minha pergunta: esta é uma abordagem de design razoável, ou há algo cegamente óbvio e simples para fazer esta tarefa. Obrigado, eles pediram 30 de agosto 11 às 14:33. Obrigado, pessoal: eu recebi a mensagem: use um objeto de nível superior e explore o Métodos relevantes ou um buffer circular. Excelentes respostas, todas elas. Quando você pensa sobre isso, você sempre precisa ter acesso a toda a matriz para que você possa se livrar daquela primeira entrada - da qual eu não tinha certeza por minha conta. Eu aliviei que eu não tivesse perdido algum liner e estava basicamente em uma faixa razoável, se não eficiente e fácil. Isto é o que eu adoro neste site: respostas de alta qualidade e relevantes de pessoas que conhecem o seu sht. Ndash Pete855217 30 de agosto 11 às 15:05 Por que você inicializa o runningTotal para null O que é seu tipo Onde é declarado Isso faria bem se você colocar alguns exemplos de código que se assemelham ao código Java real. Continuando, minha crítica seria a seguinte: sua função faz demais. Uma função ou método deve ser coeso. Mais apropriadamente, eles devem fazer uma coisa e uma coisa apenas. Pior ainda, o que acontece no seu loop for quando x 5 Você copia runningTotal6 em runningTotal5. Mas então você tem duas cópias do mesmo valor na posição 5 e 6. No seu projeto, sua função movesshuffles os itens em sua matriz calcula o material total de impressões para o erro padrão retorna o total. Faz demais. Minha primeira sugestão não é mover coisas na matriz. Em vez disso, implemente um buffer circular e use-o em vez da matriz. Isso simplificará seu design. A minha segunda sugestão é dividir as coisas em funções que são coesas: tenha uma estrutura de dados (um buffer circular) que lhe permita adicionar a ela (e isso diminui a entrada mais antiga sempre que ela atinja sua capacidade). Interator tem uma função que calcula o total no iterador (você não se importa se você estiver calculando o total de uma matriz, lista ou bufer circular). Não o chame total. Chame isso de soma, que é o que você está informando. Isso é o que eu faço :) Essa é a ótima informação de luis, no entanto, lembre-se de que esta função é uma pequena parte da funcionalidade da classe, e seria um excesso para adicionar muito código para torná-la perfeita. Você é tecnicamente correto, e eu entendo que meu código faz 39 muito muito39, mas, ao mesmo tempo, às vezes é melhor errar ao lado de um código menor e mais claro do que ir para a perfeição. Dadas as minhas habilidades em Java, mesmo fazer o pseudocódigo que você descreve a compilação me faria soprar meu orçamento neste (), mas obrigado pela descrição clara. Ndash Pete855217 31 de agosto 11 às 2:23 Hmmm, não é sobre a perfeição, mas sobre práticas industriais estabelecidas que conhecemos há 3 décadas. O código limpo é sempre um que é particionado. Temos décadas de evidências que indicam que este é o caminho a seguir no caso geral (em termos de custo-eficiência, redução de defeitos, compreensão, etc.). A menos que seja um código descartável por um tipo de coisa única. Nunca é dispendioso fazer isso quando se inicia qualquer análise de problema dessa maneira. Codificação 101, quebra o problema e o código segue, nem excesso nem dificuldade) ndash luis. espinal Aug 31 11 às 15:55 Sua tarefa é muito simples e o enfoque que você adotou é certamente bom para o trabalho. No entanto, se você quiser usar um design melhor, você deve se livrar de todo esse movimento numérico, você usa uma fila FIFO e faz bom uso de métodos push e pop, de modo que o código não reflete qualquer movimento de dados, apenas as duas ações de lógica De novos dados e remova dados com mais de 7 dias. Resposta 30 de agosto 11 às 14: 49 Médias média móvel simples Médias Média móvel simples Você é encorajado a resolver esta tarefa de acordo com a descrição da tarefa, usando qualquer idioma que você possa saber. Calculando a média móvel simples de uma série de números. Crie uma função de função estatal que leve um período e retorna uma rotina que leva um número como argumento e retorna uma média móvel simples de seus argumentos até agora. Uma média móvel simples é um método para calcular uma média de um fluxo de números apenas com a média dos últimos 160 P 160 números da transmissão, 160 onde 160 P 160 é conhecido como o período. Pode ser implementado chamando uma rotina de inicialização com 160 P 160 como argumento, 160 I (P), 160, o que deve retornar uma rotina que, quando chamada com membros individuais, sucessivos de um fluxo de números, calcula a média de (acima Para), os últimos 160 P 160 deles, vamos chamar isso de 160 SMA (). A palavra 160 160 com estado na descrição da tarefa refere-se à necessidade de 160 SMA () 160 para lembrar certas informações entre as chamadas para ela: 160 O período, 160 P 160 Um recipiente ordenado de pelo menos os últimos 160 P 160 números de cada um São chamadas individuais. 160 declarante também significa que as chamadas sucessivas para 160 I (), 160 o inicializador, 160 devem retornar rotinas separadas que 160 160 não compartilham o estado salvo para que elas possam ser usadas em dois fluxos de dados independentes. Pseudo-código para uma implementação de 160 SMA 160 é: Esta versão usa uma fila persistente para manter os valores p mais recentes. Cada função retornada da média init-moving tem seu estado em um átomo que possui um valor de fila. Esta implementação usa uma lista circular para armazenar os números dentro da janela no início de cada ponteiro de iteração refere-se à célula de lista que mantém o valor simplesmente deslocando-se da janela e para ser substituído pelo valor adicionado. Usando uma edição de encerramento Atualmente, esse sma não pode ser nogc porque ele aloca um fecho no heap. Algumas análises de escape podem remover a alocação de pilha. Usando uma edição de estrutura Esta versão evita a alocação de pilha do fechamento mantendo os dados no quadro de pilha da função principal. Mesmo resultado: para evitar que as aproximações de ponto flutuante continuem empilhando e crescendo, o código poderia executar uma soma periódica em toda a matriz de fila circular. Esta implementação produz dois (função) estado de compartilhamento de objetos. É idiomático em E separar a entrada da saída (ler da escrita) ao invés de combiná-los em um objeto. A estrutura é a mesma que a implementação do Desvio PadrãoE. O programa Elixir abaixo gera uma função anônima com um período incorporado p, que é usado como o período da média móvel simples. A função de execução lê a entrada numérica e passa para a função anônima recém-criada e, em seguida, inspeciona o resultado para STDOUT. A saída é mostrada abaixo, com a média, seguida da entrada agrupada, formando a base de cada média móvel. Erlang possui fechamentos, mas variáveis ​​imutáveis. Então, uma solução é usar processos e uma mensagem simples passando a API baseada. As linguas matriciais têm rotinas para calcular os padrões de deslizamento para uma determinada seqüência de itens. É menos eficiente para loop como nos seguintes comandos. Indica continuamente uma entrada I. Que é adicionado ao final de uma lista L1. L1 pode ser encontrado pressionando 2ND1, e significa pode ser encontrado em ListOPS Pressione ON para terminar o programa. Função que retorna uma lista contendo os dados médios do argumento fornecido Programa que retorna um valor simples em cada invocação: a lista está em média: p é o período: 5 retorna a lista média: Exemplo 2: Usando o programa movinav2 (i , 5) - Inicializando o cálculo da média móvel e define o período de 5 movinav2 (3, x): x - novos dados na lista (valor 3), eo resultado será armazenado na variável x e exibido movinav2 (4, x) : X - novos dados (valor 4), e o novo resultado será armazenado na variável x e exibido (43) 2. Descrição da função movinavg: variável r - é o resultado (a lista média) que será retornada variável i - é a variável índice, e aponta para o final da sub-lista a lista em média. Variável z - uma variável auxiliar A função usa a variável i para determinar quais valores da lista serão considerados no próximo cálculo médio. Em cada iteração, a variável i aponta para o último valor na lista que será usado no cálculo médio. Então, só precisamos descobrir qual será o primeiro valor na lista. Normalmente, é preciso considerar os elementos p, então o primeiro elemento será o indexado por (i-p1). No entanto, nas primeiras iterações, o cálculo geralmente será negativo, então a seguinte equação evitará índices negativos: max (i-p1,1) ou, organizando a equação, max (i-p, 0) 1. Mas o número de elementos nas primeiras iterações também será menor, o valor correto será (índice final - iniciar o índice 1) ou, organizando a equação, (i - (max (ip, 0) 1) 1) e, em seguida, , (I-max (ip, 0)). A variável z contém o valor comum (max (ip), 0) para que o beginindex seja (z1) e o número dos itens serão (iz) mid (list, z1, iz) retornará a lista de valor que será a soma média ( .) Irá somar-lhes a soma (.) (Iz) ri irá em média e armazenará o resultado no lugar apropriado na lista de resultados Usando um fechamento e criando uma função. Uma implementação média simples simples em Java. Em várias ocasiões, eu queria calcular métricas simples Em meus aplicativos Java, por exemplo, o número de visitas 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, seja estimado 1200 por 2 minutos, o que, com toda a probabilidade, está fora.

Comments

Popular Posts