Saturday, 31 August 2019

Algoritmo de média móvel


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-2017. 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. Posts recentes 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 31 de agosto 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: 49Moving Average Function resultmovingmean (data, window, dim, option) calcula uma média móvel centrada dos dados da matriz de dados usando um tamanho de janela especificado na janela em dim dimension, usando o algoritmo especificado na opção. Dim e opção são entradas opcionais e serão padrão para 1. As entradas opcionais Dim e opcional podem ser ignoradas ou podem ser substituídas por uma. Por exemplo, motionmean (dados, janela) dará os mesmos resultados como motionmean (data, window, 1,1) ou motionmean (data, window ,, 1). O tamanho e a dimensão da matriz de dados de entrada são limitados apenas pelo tamanho máximo da matriz para a plataforma. A janela deve ser um número inteiro e deve ser ímpar. Se a janela for igual, então é arredondada para baixo para o próximo número ímpar mais baixo. A função calcula a média móvel incorporando um ponto central e (janela-1) 2 elementos antes e depois na dimensão especificada. Nas bordas da matriz, o número de elementos antes ou depois é reduzido para que o tamanho real da janela seja menor do que a janela especificada. A função é dividida em duas partes, um algoritmo 1d-2d e um algoritmo 3d. Isso foi feito para otimizar a velocidade da solução, especialmente em matrizes menores (ou seja, 1000 x 1). Além disso, vários algoritmos diferentes para o problema 1d-2d e 3d são fornecidos, como em certos casos o algoritmo padrão não é o mais rápido. Isso normalmente acontece quando a matriz é muito ampla (ou seja, 100 x 100000 ou 10 x 1000 x 1000) e a média móvel está sendo calculada na menor dimensão. O tamanho em que o algoritmo padrão é mais lento dependerá do computador. MATLAB 7.8 (R2009a) Tags para este arquivo Faça login para marcar arquivos. Faça login para adicionar um comentário ou classificação. Comentários e classificações (8) A função lida com as extremidades cortando a parte traseira ou principal da janela e a transição para uma média móvel inicial ou posterior, em vez de uma centrada. Para acompanhar o exemplo que você deu no seu comentário, se o tamanho da janela for 3, então, no centro de 1, a média da função é de dados dos pontos 1 e 2 em um centro de 2 pontos 1, 2 e 3 com média de 9 Os pontos 8, 9 e 10 são calculados em média e no centro de 10 (vamos assumir que o vetor possui 10 entradas), os pontos 9 e 10 são calculados em média. Como o movimento move-se com as extremidades Começa com um tamanho de janela que abrange apenas o ponto 1 em 1, depois 3 pontos no ponto 2 e, em seguida, aumentando o tamanho da janela até que o tamanho da janela seja o especificado na entrada da função Obrigado. Agradável e simples. Obrigado. Bom trabalho muito útil como disse Stephan Wolf. Apenas o que eu estava procurando. Média móvel centrada que é capaz de trabalhar em um gráfico em toda a largura, sem ter que procurar o tamanho da janela do filtro e mover o início. Ótimo Acelerar o ritmo da engenharia e da ciência O MathWorks é o principal desenvolvedor de software de computação matemática para engenheiros e cientistas.

No comments:

Post a Comment