Monday 19 February 2018

Moving average recursive


O principal defeito no seu programa é que o cálculo recursivo está incorreto. Para calcular a média, você tem que obter a soma do valor atual e os valores restantes. Em seguida, dividir essa soma pelo número de valores. O número de valores é num. O valor atual é o que calculatenumber () retorna. A soma dos valores remanescentes é num-1 multiplicada pela média dos valores remanescentes. A média dos valores restantes é calculada fazendo uma chamada recursiva para a média (). Assim, escrevemos o seguinte: Um programa completo usando essa função pode ser assim: Note que esta não é uma maneira muito boa de calcular a média porque você perde precisão toda vez que você divide a soma atual por num. Quando essa média for multiplicada novamente à medida que a chamada recursiva retorna, os dígitos significativos que você perdeu na divisão não são restaurados. Você está destruindo informações dividindo e multiplicando a soma. Para maior precisão, você deseja manter o controle da soma como você percorrer os elementos, em seguida, dividir no final. Outro ponto a considerar é o que se entende por uma média móvel. O que implementamos acima não é uma média móvel, mas uma média fixa. É a média de uma janela fixa de elementos. Se você mover a janela por uma posição, você tem que começar tudo de novo e calcular a soma novamente. A maneira correta de implementar uma janela em movimento é manter o controle de todos os elementos na janela. Quando você desloca a janela uma posição para a direita, você remove o elemento mais à esquerda da janela e subtrai seu valor da soma, em seguida, adicione o novo elemento mais à direita para a janela e adicione seu valor à soma. Isso é o que o torna uma quantia em movimento. Dividindo a soma móvel pelo número de elementos dá-lhe a média móvel. A maneira natural de implementar uma janela em movimento é com uma fila porque você pode adicionar novos elementos à cabeça e pop elementos antigos da cauda. Respondeu Nov 22 14 at 17:44 quotThe maneira adequada para implementar uma janela em movimento é manter o controle de todos os elementos na janela. Quando você muda a janela de uma posição para a direita, você remove o elemento mais à esquerda da janela e subtrair o seu valor do sumquot como seria este me interessou muito e muito obrigado ndash cheroky Nov 22 14 em 18:17 Sua resposta 2017 Stack Exchange , IncThe cientista e engenheiros guia para processamento de sinal digital Por Steven W. Smith, Ph. D. Uma grande vantagem do filtro de média móvel é que ele pode ser implementado com um algoritmo que é muito rápido. Para entender esse algoritmo, imagine passar um sinal de entrada, x, através de um filtro de média móvel de sete pontos para formar um sinal de saída, y. Agora, veja como dois pontos de saída adjacentes, y 50 e y 51, são calculados: Estes são quase os mesmos pontos de cálculo x 48 a x 53 devem ser adicionados para y 50 e novamente para y 51. Se y 50 já foi calculado , A maneira mais eficiente de calcular y 51 é: Uma vez que y 51 tenha sido encontrado usando y 50, então y 52 pode ser calculado a partir da amostra y 51, e assim por diante. Depois que o primeiro ponto é calculado em y, todos os outros pontos podem ser encontrados com apenas uma única adição e subtração por ponto. Isso pode ser expresso na equação: Observe que esta equação usa duas fontes de dados para calcular cada ponto na saída: pontos a partir da entrada e pontos previamente calculados a partir da saída. Isso é chamado de equação recursiva, o que significa que o resultado de um cálculo é usado em cálculos futuros. (O termo recursivo também tem outros significados, especialmente na informática). O Capítulo 19 discute uma variedade de filtros recursivos em mais detalhes. Lembre-se de que o filtro recursivo de média móvel é muito diferente dos filtros recursivos típicos. Em particular, a maioria dos filtros recursivos tem uma resposta de impulso infinitamente longa (IIR), composta de sinusoides e exponenciais. A resposta de impulso da média móvel é um pulso retangular (resposta de impulso finito, ou FIR). Este algoritmo é mais rápido que outros filtros digitais por várias razões. Primeiro, há apenas dois cálculos por ponto, independentemente do comprimento do kernel do filtro. Em segundo lugar, a adição e subtração são as únicas operações matemáticas necessárias, enquanto a maioria dos filtros digitais requerem multiplicação demorada. Em terceiro lugar, o esquema de indexação é muito simples. Cada índice na Eq. 15-3 é encontrado adicionando ou subtraindo constantes inteiras que podem ser calculadas antes do início da filtragem (isto é, p e q). Em seguida, todo o algoritmo pode ser realizado com representação de inteiro. Dependendo do hardware usado, os inteiros podem ser mais do que uma ordem de magnitude mais rápida do que o ponto flutuante. Surpreendentemente, a representação de números inteiros funciona melhor do que o ponto flutuante com este algoritmo, além de ser mais rápido. O erro round-off de aritmética de ponto flutuante pode produzir resultados inesperados se você não for cuidadoso. Por exemplo, imagine um sinal de 10.000 amostras sendo filtrado com este método. A última amostra no sinal filtrado contém o erro acumulado de 10.000 adições e 10.000 subtracções. Isso aparece no sinal de saída como um deslocamento à deriva. Os inteiros não têm esse problema porque não há nenhum erro round-off na aritmética. Se você deve usar ponto flutuante com este algoritmo, o programa na Tabela 15-2 mostra como usar um acumulador de dupla precisão para eliminar esta deriva. O cientista e engenheiros guia para processamento de sinal digital Por Steven W. Smith, Ph. D. Capítulo 21: Comparação de Filtros Correspondência 3: Média Móvel versus Pólo Único A nossa terceira competição será uma batalha dos filtros do domínio do tempo. O primeiro lutador será um filtro de média móvel de nove pontos. Seu oponente para o jogo de hoje será um filtro recursivo de um único pólo usando a técnica bidirecional. Para obter uma resposta de frequência comparável, o filtro de um único pólo utilizará um decaimento de amostra para amostra de x 0,70. A batalha começa na Fig. 21-6 onde a resposta em frequência de cada filtro é mostrada. Nem um é muito impressionante, mas, claro, a separação de freqüência não é o que esses filtros são usados. Nenhum ponto para qualquer lado. A Figura 21-7 mostra as respostas de passo dos filtros. Em (a), a resposta de passo média móvel é uma linha reta, a maneira mais rápida de se mover de um nível para outro. Em (b), a resposta do passo dos filtros recursivos é mais suave, o que pode ser melhor para algumas aplicações. Um ponto para cada lado. Estes filtros são bastante igualados em termos de desempenho e muitas vezes a escolha entre os dois é feita sobre a preferência pessoal. No entanto, existem dois casos em que um filtro tem uma ligeira vantagem sobre o outro. Estes são baseados no trade-off entre tempo de desenvolvimento e tempo de execução. Em primeiro lugar, você quer reduzir o tempo de desenvolvimento e está disposto a aceitar um filtro mais lento. Por exemplo, você pode ter uma única necessidade de filtrar alguns milhares de pontos. Uma vez que todo o programa é executado em apenas alguns segundos, é inútil gastar tempo otimizando o algoritmo. Ponto flutuante quase certamente será usado. A escolha é usar o filtro de média móvel realizado por convolução, ou um filtro recursivo de um único pólo. O vencedor aqui é o filtro recursivo. Será um pouco mais fácil de programar e modificar, e executará muito mais rápido. O segundo caso é exatamente o oposto seu filtro deve operar o mais rápido possível e você está disposto a gastar o tempo de desenvolvimento extra para obtê-lo. Por exemplo, este filtro pode ser uma parte de um produto comercial, com o potencial de ser executado milhões de vezes. Você provavelmente usará números inteiros para a maior velocidade possível. Sua escolha de filtros será a média móvel realizada por recursão. Ou o filtro recursivo de um único pólo implementado com tabelas de consulta ou matemática inteira. O vencedor é o filtro de média móvel. Ele irá executar mais rápido e não ser suscetível ao desenvolvimento e execução de problemas de aritmética inteira. Nas estatísticas de uma média móvel simples é um algoritmo que calcula a média não ponderada das últimas n amostras. O parâmetro n é muitas vezes chamado de tamanho de janela, porque o algoritmo pode ser pensado como uma janela que desliza sobre os pontos de dados. Usando uma formulação recursiva do algoritmo, o número de operações necessário 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 do tempo de execução é O (1). I. e. constante. A fórmula recursiva da média móvel não ponderada é, onde avg é 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, ​​desce e um ponto de dados, a cabeça, move-se. Implementação Uma implementação da média móvel simples tem que levar em conta o seguinte: Algoritmo de inicialização Contanto 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 é totalmente preenchida com valores e, de outra forma, muda para a fórmula, que atualiza a média recalculando 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 requisitos de memória constante independentes do tamanho da janela. Aqui está o procedimento de atualização que desliza a janela para a direita. Na maioria das coleções invalidar seus enumeradores quando a coleção subjacente é modificada. A implementação, no entanto, depende de enumeradores válidos. Especialmente em aplicativos baseados em fluxo contínuo, as necessidades de coleta subjacentes são modificadas quando um novo elemento chega. 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, adicionar um elemento e chamar Shift. Eu gostaria de descobrir como realmente implementar isso, como a função de teste é muito confuso para me8230 Eu preciso converter dados para matriz, em seguida, execute SMA sma novo SMA (20, matriz) para um período de 20 SMA Como faço para lidar Shift () É necessário implementar construtores. (Desculpe pela confusão). Não você precisa don8217t converter seus dados em uma matriz, desde que seus dados implementa IEnumerable1 eo tipo enumerado é duplo. No que diz respeito à sua mensagem privada está em causa, você precisa converter o DataRow para algo que é enumerável de valores duplos. Sua abordagem funciona. Shift, desliza a janela uma posição para a esquerda. Para um conjunto de dados de dizer 40 valores e um período de 20 SMA você tem 21 posições a janela se encaixa em (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, em essência Espero que isso ajude. Quaisquer outras perguntas AVISO DE DIREITOS DE AUTOR Christoph Heindl e cheind. wordpress, 2009-2017. O uso não autorizado e / ou a duplicação deste material sem permissão expressa e por escrito deste autor de blogs e / ou proprietário é estritamente proibido. Excertos e links podem ser usados, desde que crédito completo e claro seja dado a Christoph Heindl e cheind. wordpress com direção apropriada e específica para o conteúdo original. Recent Recent Archives Recent Posts O recente aumento e queda dos preços das ações da Internet levou a impressões populares de uma bolha especulativa no setor de Internet. Nós investigamos se os investidores poderiam ter explorado o impulso nos estoques da Internet usando simples média móvel (MA) negociação regras. Simulamos o comércio técnico em tempo real usando uma estratégia de negociação recursiva aplicada a mais de 800 regras de média móvel. A inferência estatística leva em consideração a heterocedasticidade condicional e as dependências conjuntas. Nenhuma evidência de lucros comerciais significativos é encontrada. A maioria dos estoques da Internet comportar-se como passeios aleatórios isso, combinado com alta volatilidade, pode ser a razão para o desempenho sombrio das regras de média móvel. Palavras-chave Existências na Internet Regras de média móvel Estratégia recursiva Bootstrap Classificação JEL Autor correspondente. Tel. 65-6874-6693 fax: 65-6779-2083. Copyright copy 2004 Elsevier B. V. Todos os direitos reservados. Os cookies são usados ​​por este site. Para obter mais informações, visite a página de cookies. Copyright 2017 Elsevier B. V. ou seus licenciadores ou contribuintes. ScienceDirect é uma marca registada da Elsevier B. V.

No comments:

Post a Comment