C ++ Média Móvel
É possível implementar uma média móvel em C sem a necessidade de uma janela de amostras. Achei que posso otimizar um pouco, escolhendo um tamanho de janela que seja um poder de dois para permitir a mudança de bits em vez de dividir, mas não precisar Um buffer seria bom. Existe uma maneira de expressar um novo resultado de média móvel apenas como função do resultado antigo e da nova amostra. Definir um exemplo de média móvel, em uma janela de 4 amostras para ser: Adicionar nova amostra e: Uma média móvel pode ser implementada de forma recursiva , Mas para uma computação exata da média móvel você deve lembrar a amostra de entrada mais antiga na soma (ou seja, a no seu exemplo). Para um comprimento N média móvel você calcula: onde yn é o sinal de saída e xn é o sinal de entrada. Eq. (1) pode ser escrito de forma recursiva, então você sempre precisa se lembrar da amostra xn-N para calcular (2). Conforme indicado por Conrad Turner, você pode usar uma janela exponencial (infinitamente longa) em vez disso, o que permite calcular a saída apenas da saída passada e da entrada atual: mas esta não é uma média móvel padrão (não ponderada), mas exponencialmente Média móvel ponderada, onde as amostras no passado obtêm um peso menor, mas (pelo menos em teoria) você nunca esquece nada (os pesos ficam menores e menores para amostras no passado). Eu implementei uma média móvel sem memória de item individual para um programa de rastreamento de GPS que escrevi. Comece com 1 amostra e divida em 1 para obter o valor médio atual. Em seguida, adicione uma amostra e divida em 2 para a média atual. Isso continua até chegar ao comprimento da média. Cada vez, adiciono na nova amostra, obtenho a média e retire essa média do total. Eu não sou um matemático, mas isso pareceu uma boa maneira de fazê-lo. Achei que isso tornaria o estômago de um verdadeiro matemático, mas, parece ser uma das formas aceitas de fazê-lo. E funciona bem. Basta lembrar que, quanto mais alto for seu comprimento, mais lento seguirá o que deseja seguir. Isso pode não ser importante na maioria das vezes, mas ao seguir os satélites, se você estiver lento, a trilha pode estar longe da posição atual e parecerá ruim. Você poderia ter uma lacuna entre o Sáb e os pontos de fuga. Eu escolhi um comprimento de 15 atualizado 6 vezes por minuto para obter um alisamento adequado e não chegar muito longe da posição real de SAT com os pontos de trilhos alisados. Respondeu 16 de novembro às 23:03 inicialize o total 0, count0 (cada vez que vê um novo valor, então, uma entrada (scanf), um add totalnewValue, um incremento (contagem), uma média de divisão (contagem total) Esta seria uma média móvel em relação a Todas as entradas Para calcular a média apenas nas últimas 4 entradas, seria necessário 4 variáveis de entrada, talvez copiando cada entrada para uma variável de entrada mais antiga e, em seguida, calculando a nova média móvel. Como soma das 4 variáveis de entrada, divididas por 4 (o turno direito 2 seria Bom, se todas as entradas fossem positivas para que o cálculo médio fosse respondido em 3 de fevereiro de 15 às 4:06 Isso realmente calculará a média total e NÃO a média móvel. À medida que a contagem aumenta, o impacto de qualquer nova amostra de entrada se torna ndash extremamente lento Hilmar Feb 3 15 às 13:53 Sua resposta 2016 Stack Exchange, Inc. Médias móveis extraordinárias para séries temporais irregulares Na análise de séries temporais, muitas vezes há necessidade de funções de suavização que reagem rapidamente às mudanças no sinal. Na aplicação típica , Você pode estar processando um sinal de entrada em tempo real e quer calcular coisas como o valor médio recente ou obter uma inclinação instantânea para isso. Mas os sinais do mundo real são frequentemente ruidosos. Algumas amostras ruidosas farão com que o valor atual do sinal, ou sua inclinação, varie amplamente. Médias móveis A função de suavização mais simples é uma média móvel com janelas. À medida que as amostras chegam, você toma uma média dos valores N mais recentes. Isso suavizará os picos, mas introduz um atraso de 8211 ou latência. Sua média sempre será adiada pela largura da sua média móvel. O exemplo acima é relativamente caro para calcular. Para cada amostra, você deve iterar em todo o tamanho da janela. Mas há formas mais baratas de manter a soma de todas as amostras na janela em um buffer e ajustar a soma como novas amostras entrar: Outro tipo de média móvel é a média móvel 8220weighted8221 que pesa cada posição na janela de amostra. Antes de calcular a média, multiplique cada amostra pelo peso dessa posição da janela. Tecnicamente isso é chamado de 8220convolution8221. Uma função de ponderação típica aplica uma curva de sino à janela de amostra. Isso dá um sinal que está mais ajustado ao centro da janela, e ainda é um pouco tolerante às amostras ruidosas. Na análise financeira, você geralmente usa uma função de ponderação que valora mais as amostras recentes, para dar uma média móvel que rastreia mais as amostras recentes. As amostras mais antigas recebem progressivamente menos peso. Isso mitiga um pouco os efeitos da latência, embora ainda dê um bom alisamento razoavelmente: com uma média ponderada, você sempre precisa repetir todo o tamanho da janela para cada amostra (a menos que você possa restringir os pesos permitidos a certas funções). A média móvel exponencial Outro tipo de média é a média móvel exponencial, ou EMA. Isso geralmente é usado onde a latência é crítica, como na análise financeira em tempo real. Nesta média, os pesos diminuem exponencialmente. Cada amostra é avaliada um pouco menor do que a próxima amostra mais recente. Com essa restrição, você pode calcular a média móvel de forma muito eficiente. Onde alfa é uma constante que descreve como os pesos das janelas diminuem ao longo do tempo. Por exemplo, se cada amostra fosse ponderada em 80 do valor da amostra anterior, você definiu alfa 0.2. O alfa menor torna-se maior a sua média móvel. (Por exemplo, torna-se mais suave, mas menos reactivo para novas amostras). Os pesos para uma EMA com alpha0.20 Como você pode ver, para cada nova amostra, você só precisa de média com o valor da média anterior. Então, a computação é muito rápida. Em teoria, todas as amostras anteriores contribuem para a média atual, mas sua contribuição se torna exponencialmente menor ao longo do tempo. Esta é uma técnica muito poderosa, e provavelmente a melhor se você deseja obter uma média móvel que responda rapidamente a novas amostras, possui boas propriedades de suavização e é rápido para calcular. O código é trivial: EMA para Série de Tempo Irregular O EMA padrão é bom quando o sinal é amostrado em intervalos de tempo regulares. Mas e se suas amostras vierem em intervalos irregulares Imagine um sinal contínuo que seja amostrado em intervalos irregulares. Esta é a situação habitual na análise financeira. Em teoria, há uma função contínua para o valor de qualquer instrumento financeiro, mas você só pode provar esse sinal sempre que alguém realmente executa um comércio. Portanto, seu fluxo de dados consiste em um valor, além do tempo em que foi observado. Uma maneira de lidar com isso é converter o sinal irregular em um sinal regular, interpolando entre observações e reescrevendo. Mas isso perde dados e re-introduz a latência. É possível calcular uma EMA para uma série de tempo irregular diretamente: nesta função, você passa a amostra atual do seu sinal e a amostra anterior e a quantidade de tempo decorrido entre os dois e o valor anterior retornado por este função. Então, quão bem isso funciona. Para demonstrar que I8217ve gerou uma onda senoidal, então a amostra em intervalos irregulares e introduziu cerca de 20 ruídos. Esse é o sinal variará aleatoriamente - 20 do sinal seno original 8220true8221. Quão bem a média móvel exponencial irregular recupera o sinal. A linha vermelha é a onda senoidal original 8211 amostrada em intervalos irregulares. A linha azul é o sinal com o ruído adicionado. A linha azul é o único sinal que a EMA vê. A linha verde é o EMA suavizado. Você pode vê-lo recuperar o sinal muito bem. Um pouco bamboleante, mas o que você pode esperar de um sinal de fonte tão ruidoso. Ele é deslocado cerca de 15 para a direita, porque o EMA apresenta alguma latência. Quanto mais suave você quiser, mais latência você verá. Mas disso, você pode, por exemplo, calcular uma inclinação instantânea para um sinal irregular ruidoso. O que você pode fazer com esse Hmm8230. Recursos:
Comments
Post a Comment