Tuesday 19 September 2017

C ++ Média Móvel


Eu sei que isso é possível com impulso como per. But eu realmente gostaria de evitar o uso de impulso eu tenho googled e não encontrei qualquer exemplos adequados ou legíveis. Basicamente eu quero acompanhar a média móvel de um fluxo em curso de um fluxo de números em ponto flutuante Usando os números mais recentes de 1000 como uma amostra de dados. Qual é a maneira mais fácil de conseguir this. I experimentei com o uso de uma matriz circular, média móvel exponencial e uma média móvel mais simples e descobriu que os resultados da matriz circular adequado às minhas necessidades melhor . Se suas necessidades são simples, você pode tentar usar uma média móvel exponencial. Basta, você faz uma variável de acumulador, e como seu código olha para cada amostra, o código atualiza o acumulador com o Novo valor Você escolhe um alfa constante que está entre 0 e 1, e calcula isso. Você só precisa encontrar um valor de alfa onde o efeito de uma determinada amostra dura apenas cerca de 1000 samples. Hmm, eu realmente não tenho certeza que isso é Adequado para você, agora t O que eu colocar aqui O problema é que 1000 é uma janela muito longa para uma média móvel exponencial Eu não tenho certeza se há um alfa que iria espalhar a média sobre os últimos 1000 números, sem subfluxo no cálculo do ponto flutuante Mas se você Queria uma média menor, como 30 números ou assim, esta é uma maneira muito fácil e rápida de fazê-lo. 12 12 em 4 44. 1 em sua postagem A média móvel exponencial pode permitir que o alfa ser variável Então isso permite que ele Ser usado para computar médias de base de tempo, por exemplo bytes por segundo Se o tempo desde a última atualização de acumulador é mais de 1 segundo, você deixa alfa ser 1 0 Caso contrário, você pode deixar alfa usecs desde a última atualização 1000000 jxh 12 de junho 12 em 6 21.Basicamente, eu quero acompanhar a média móvel de um fluxo em curso de um fluxo de números de ponto flutuante usando os mais recentes números 1000 como um exemplo de dados. Note que o abaixo atualiza o total como elementos como adicionado substituído, evitando costoso ON traversal para calcular A soma - necessária para o E média - on demand. Total é feito um parâmetro diferente de T para suportar, por exemplo, usando um longo longo quando totalizando 1000 long s, um int para char s, ou um dobro ao total float s. This é um pouco falho em que numsamples poderia Passar INTMAX passado - se você se importa que você poderia usar um unsigned long long ou usar um membro extra bool dados para gravar quando o recipiente é preenchido pela primeira vez enquanto ciclismo numsamples em torno da matriz melhor então renomeado algo inócuo como pos. answered 12 de junho 12 em 5 19.um pressupõe que o operador vazio T amostra é, na verdade void operador T amostra oPless Jun 8 14 at 11 52. oPless ahhh bem vislumbrado realmente eu quis dizer para ele ser vazio operador T amostra, mas é claro que você poderia usar qualquer nota que você gostou Will fix, Agradecimentos Tony D junho 8 14 em 14 27.Máximas exponenciais móveis para Irregular Time Series. In análise de séries temporais há muitas vezes uma necessidade de suavização funções que reagem rapidamente a mudanças no sinal Na aplicação típica, você pode estar a processar um sinal de entrada Em tempo real E, queremos calcular coisas como o valor médio recente, ou obter uma inclinação instantânea para ele Mas os sinais do mundo real são freqüentemente ruidosos Algumas amostras barulhentas farão com que o valor atual do sinal, ou sua inclinação, varie amplamente. . A função de suavização mais simples é uma média móvel com janelas Como as amostras vêm em você tomar uma média dos valores de N mais recentes Isso vai suavizar picos, mas introduz um atraso ou latência Sua média será sempre atrasada pela largura da sua média móvel. O exemplo acima é relativamente caro para calcular Para cada amostra que você tem que iterar em todo o tamanho da janela Mas há maneiras mais baratas 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 ponderada que pondera para cada posição na janela da amostra. Antes de calcular a média, você multiplica cada amostra pelo peso dessa posição da janela. Tecnicamente isso é chamado de convolução. A função de ponderação ypical aplica uma curva de sino para a janela de amostra Isto dá um sinal que está mais sintonizado para o centro da janela, e ainda um pouco tolerante de amostras ruidosas Na análise financeira você freqüentemente usa uma função de ponderação que as amostras recentes mais recentes, para dar Uma média móvel que acompanha mais de perto amostras recentes Amostras mais antigas são dadas progressivamente menos peso Isso minimiza um pouco os efeitos de latência, enquanto ainda dando razoavelmente bom alisamento. Com uma média ponderada, você sempre tem que iterar sobre o tamanho da janela para cada amostra a menos Você pode restringir os pesos permitidos a determinadas funções. A média móvel exponencial. Um outro tipo de média é a média móvel exponencial, ou EMA Isto é usado frequentemente onde a latência é crítica, tal como na análise financeira em tempo real Nesta média, os pesos diminuem Exponencialmente Cada amostra é avaliada em algumas porcentagens menor do que a próxima amostra mais recente Com esta restrição você pode calcular a movin G média muito eficiente. Onde alfa é uma constante que descreve como os pesos das janelas diminuem ao longo do tempo Por exemplo, se cada amostra foi ponderada em 80 do valor da amostra anterior, você iria definir alfa 0 2 O alfa menor torna-se o mais longo Sua média móvel é, por exemplo, torna-se mais suave, mas menos reativa a novas amostras. Os pesos para um EMA com alfa 0 20. Como você pode ver, para cada nova amostra você só precisa de média com o valor da média anterior So computation É muito muito rápido. Em teoria todas as amostras anteriores contribuem para a média atual, mas sua contribuição torna-se exponencialmente menor ao longo do tempo. Esta é uma técnica muito poderosa, e provavelmente o melhor se você deseja obter uma média móvel que responde rapidamente a novas amostras , Tem boas propriedades de suavização e é rápido para computar. O código é trivial. EMA para Irregular Time Series. The EMA padrão é bom quando o sinal é amostrado em intervalos de tempo regular Mas e se suas amostras vêm em irregular Esta é a situação usual 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. Fluxo de dados consiste em um valor, mais o tempo em que foi observado. Uma maneira de lidar com isso é converter o sinal irregular para um sinal regular, interpolando entre observações, e reamostragem Mas isso perde dados, e re-introduz Latência. É possível calcular um EMA para uma série de tempo irregular diretamente. Nesta função, você passa na amostra atual de seu sinal, ea amostra anterior, eo tempo decorrido entre os dois eo valor anterior retornado Por esta função. Assim como este trabalho para demonstrar I ve gerou uma onda senoidal, em seguida, amostrados em intervalos irregulares, e introduziu cerca de 20 ruído que é o sinal irá variar aleatoriamente - 20 A partir do sinal de seno verdadeiro original. Como bem a média móvel exponencial irregular recuperar o sinal. A linha vermelha é a onda sinusoidal original amostrados em intervalos irregulares A linha azul é o sinal com o ruído adicionado A linha azul é o único sinal da EMA Vê A linha verde é a EMA suavizada Você pode ver que recupera o sinal muito bem Um pouco vacilante, mas o que você pode esperar de um sinal de fonte tão ruidosa. É deslocado cerca de 15 para a direita, porque a EMA introduz alguma latência O Mais suave que você quer, mais latência você vai ver Mas a partir deste você pode, por exemplo, calcular uma inclinação instantânea para um sinal ruidoso irregular. O que você pode fazer com que Hmm. I estou tentando calcular a média móvel de um sinal O valor do sinal Um duplo é atualizado aleatoriamente vezes que eu estou procurando uma maneira eficiente de calcular a sua média ponderada tempo sobre uma janela de tempo, em tempo real eu poderia fazê-lo meu auto, mas é mais desafiador do que eu pensei. A maioria dos recursos que eu Ve fo Und sobre a internet estão calculando média móvel de sinal periódico, mas atualizações de minas em tempo aleatório. Alguém sabe bons recursos para o truque that. The é o seguinte Você recebe atualizações em tempos aleatórios por meio de tempo void update int, valor float No entanto, você também precisa Para também acompanhar quando uma atualização cai fora da janela de tempo, então você definir um alarme que chamado no tempo N que remove a atualização anterior de ser sempre considerado novamente no computation. If isso acontece em tempo real, você pode solicitar o sistema operacional para Fazer uma chamada para um método void dropoffoldestupdate int tempo para ser chamado no momento N. Se esta é uma simulação, você não pode obter ajuda do sistema operacional e você precisa fazê-lo manualmente Em uma simulação você chamaria métodos com o tempo fornecido como Um argumento que não se correlaciona com o tempo real No entanto, uma suposição razoável é que as chamadas são garantidos para ser tal que os argumentos de tempo estão aumentando Neste caso, você precisa manter uma lista ordenada de alarme v Alues e para cada atualização e chamada de leitura você verifica se o argumento de tempo é maior do que o chefe da lista de alarme Enquanto é maior você faz o processamento relacionado com o alarme cair a atualização mais antiga, remova a cabeça e verifique novamente até todos os alarmes anteriores Para o tempo dado são processados ​​Então faça a chamada de atualização. Eu até agora assumiu que é óbvio o que você faria para a computação real, mas vou elaborar apenas no caso de eu assumir que você tem um método float read int tempo que você usa para Leia os valores O objetivo é tornar essa chamada tão eficiente quanto possível Assim, você não calcular a média móvel cada vez que o método de leitura é chamado Em vez disso você precompute o valor a partir da última atualização ou o último alarme e ajustar este valor por um Um par de operações de ponto flutuante para explicar a passagem do tempo desde a última atualização, um número constante de operações, exceto para talvez processar uma lista de alarmes empilhados. Felizmente isso é claro - este deve ser um algoritmo bastante simples e bastante Eficiente. Otimização adicional um dos problemas restantes é se um grande número de atualizações acontecem dentro da janela de tempo, então há um longo tempo para que não há nem lê nem atualizações e, em seguida, uma leitura ou atualização vem Neste caso, o Acima algoritmo será ineficaz em atualizar incrementalmente o valor para cada uma das atualizações que está caindo Isso não é necessário porque nós só cuidado sobre a última atualização além da janela de tempo, então se houver uma maneira de deixar todas as atualizações mais velhas, Para fazer isso, podemos modificar o algoritmo para fazer uma pesquisa binária de atualizações para encontrar a atualização mais recente antes da janela de tempo Se houver relativamente poucas atualizações que precisa ser descartada, então um pode atualizar o valor para cada drop Update Mas se houver muitas atualizações que precisam ser descartadas, então um pode recomputer o valor do zero após deixar cair as atualizações antigas. Apêndice em Computação Incremental Eu deveria esclarecer o que quero dizer por incre Computação mental acima na sentença tweak este valor por um par de operações de ponto flutuante para contabilizar a passagem de tempo desde a última atualização inicial não incremental computation. then iterar sobre relevantesupdates em ordem crescente time. movingaverage sum lastupdate timesincelastupdate windowlength. Now Se exatamente uma atualização cai da janela, mas não novas atualizações chegam, ajuste a soma como. Note que é priorupdate que tem o seu timestamp modificado para iniciar o início da última janela E se exatamente uma atualização entra na janela, mas não novas atualizações cair, ajustar soma as. As deve ser óbvio, este é um esboço, mas espero que mostre como você Pode manter a média de tal forma que é O 1 operações por atualização em uma base amortizada Mas note otimização adicional no parágrafo anterior Observe também as questões de estabilidade aludidas em uma resposta mais antiga, o que significa que os erros de ponto flutuante podem acumular sobre um grande número de tais incremental Operações tais que há uma divergência do resultado do cálculo completo que é significativo para o aplicativo. Se uma aproximação é OK e há um mínimo de tempo entre as amostras, você poderia tentar super-amostragem tem uma matriz que representa intervalos de tempo uniformemente espaçados que São mais curtos do que o mínimo, e em cada período de tempo armazenar a última amostra que foi recebida Quanto mais curto o intervalo, mais próxima a média será para o verdadeiro valor E O período não deve ser maior do que a metade do mínimo ou há uma chance de faltar uma amostra. Respondida em Dez 15 11 em 18 12.Thanks para a resposta Uma melhoria que seria necessário para realmente armazenar em cache o valor da média total assim Nós don t loop o tempo todo Também, pode ser um ponto menor, mas não seria mais eficiente usar um deque ou uma lista para armazenar o valor, uma vez que assumimos que a atualização virá na ordem certa Inserção seria mais rápido Que no mapa Arthur Dec 16 11 at 8 55.Sim, você poderia armazenar em cache o valor da soma Subtrair os valores das amostras que você apagar, adicione os valores das amostras que você inserir Também, sim, um par deque Exemplo, Data pode ser Mais eficiente Eu escolhi o mapa para a legibilidade, ea facilidade de invocar o mapa upperbound Como sempre, escreva código correto primeiro, então perfil e medida mudanças incrementais Rob Dec 16 11 at 15 00.Note Aparentemente esta não é a maneira de abordar isto Deixando-o aqui Para referência sobre o que está errado com esta abordagem Verifique os comentários. UP DATADO - com base no comentário de Oli não sei sobre a instabilidade de que ele está falando though. Use um mapa ordenado de tempos de chegada contra valores Após a chegada de um valor adicionar a hora de chegada para o mapa ordenado juntamente com o seu valor s e atualizar o movimento Average. warning isso é pseudo-code. There Não totalmente expandido, mas você começa a idéia. Coisas a nota Como eu disse o acima é pseudo-código Você precisará escolher um mapa apropriado Don t remover os pares como você percorrer como você Invalidará o iterador e terá que começar novamente Veja o comentário de Oli abaixo também. Respondido Dec 15 11 at 12 22. Isso não funciona, não leva em conta que proporção do comprimento da janela de cada valor existe para também, esta abordagem De somar e depois subtrair é apenas estável para tipos inteiros, não flutuadores Oliver Charlesworth 15 de dezembro de 11 em 12 29. OliCharlesworth - desculpe eu perdi alguns pontos-chave na descrição dupla e ponderada no tempo vou atualizar Agradecimentos Dennis Dec 15 11 at 12 33 . O tempo-peso é ye T outro problema Mas isso não é o que eu estou falando Eu estava se referindo ao fato de que quando um novo valor entra pela primeira vez janela de tempo, sua contribuição para a média é mínima Sua contribuição continua a aumentar até um novo valor entra Oliver Charlesworth 15 de dezembro 11 em 12 35.

No comments:

Post a Comment