Pergunta

Eu tenho um valor contínuo para o qual eu gostaria de calcular um média móvel exponencial . Normalmente eu só usar a fórmula padrão para isso:

  • S n = aY + (1-a) S n-1

onde S n é o novo média, a é o alfa, Y é a amostra, e S n-1 é a média anterior.

Infelizmente, devido a várias questões que não têm um tempo de amostra consistente. Eu saiba eu posso provar, no máximo, digamos, uma vez por milissegundo, mas devido a fatores fora do meu controle, eu posso não ser capaz de tomar uma amostra para vários milissegundos de cada vez. Um caso provável mais comum, no entanto, é que eu simples amostra um pouco cedo ou mais tarde: em vez de amostragem em 0, 1 e 2 ms. Eu amostra às 0, 0,9 e 2,1 ms. Eu faço antecipar que, independentemente dos atrasos, a minha frequência de amostragem será muito, muito acima do limite Nyquist, e, portanto, não precisa se preocupar com aliasing.

Eu acho que eu posso lidar com isso de uma forma mais ou menos razoável, variando o alfa de forma adequada, com base no período de tempo desde a última amostra.

Parte do meu raciocínio que este trabalho é que os EMA "interpola linearmente" entre o ponto de dados anterior e do atual. Se considerarmos o cálculo de um EMA da seguinte lista de amostras em intervalos t: [0,1,2,3,4]. Devemos obter o mesmo resultado se usarmos 2t intervalo, onde as entradas tornam-se [0,2,4], certo? Se o EMA tinha assumido que, em t 2 o valor tinha sido 2 desde t 0 , isso seria o mesmo que o cálculo t intervalo de cálculo em [0,2, 2,4,4], que ele não está fazendo. Ou isso faz sentido em tudo?

Alguém pode me dizer como variar o alfa de forma adequada? "Por favor, mostre o seu trabalho." Ou seja, mostre-me a matemática que prova que o seu método realmente está fazendo a coisa certa.

Foi útil?

Solução

Esta resposta com base na minha boa compreensão de filtros passa-baixa ( "média móvel exponencial" é realmente apenas um filtro passa-baixa unipolar), mas a minha obscura compreensão do que você está procurando. Eu acho que o seguinte é o que você quer:

Em primeiro lugar, você pode simplificar sua equação um pouco (parece mais complicado, mas é mais fácil no código). Eu vou usar "Y" para a saída e "X" para a entrada (em vez de S para a saída e Y para a entrada, como você tem feito).

Y n = aX + (1-a) Y n-1 ? Y n = Y n-1 + a (X - Y n-1 )

que codifica a:

 Y += alpha * (X-Y);

Em segundo lugar, o valor de a aqui é "igual" a 1-E -?t / t em que Dt é o tempo entre amostras, e t é a constante de tempo do filtro passa-baixo. Eu digo "igual" entre aspas porque isso funciona bem quando Dt / t é pequena em comparação a 1, e a = 1-e -?t / t ˜ Dt / t. (Mas não muito pequeno: você vai correr em problemas de quantização, ea menos que você recorrer a algumas técnicas exóticas, normalmente é necessário um extra de N bits de resolução em sua variável de estado S, onde N = -log 2 (a).) para valores maiores de Dt / t a filtragem de efeito começa a desaparecer, até chegar ao ponto onde a é próximo a 1 e você está basicamente apenas atribuir a entrada para a saída.

Isso deve funcionar adequadamente com diferentes valores de Dt (a variação de Dt não é muito importante, desde que alfa é pequeno, caso contrário, você vai correr em algumas questões, em vez estranhas Nyquist / aliasing / etc.), e se você estiver trabalhando em um processador onde multiplicação é mais barato do que a divisão, ou questões de ponto fixo são importantes, precalculate ? = 1 / t, e considerar a tentar aproximar a fórmula para a.

Se você realmente quer saber como derivar a fórmula

a = 1-e -?t / t

então considerar a sua fonte equação diferencial:

Y + t dy / dt = X

que, quando X é uma função degrau unitário, tem a solução Y = 1 - E -t / t . Para valores pequenos de? T, o derivado pode ser aproximada por Ay / Dt, obtendo-se

Y + t Ay / Dt = X

Ay / Dt = (X-Y) / t

Ay = (X-Y) (Dt / t) = a (X-Y)

e a "extrapolação" de a = 1-e -?t / t vem de tentar igualar-se o comportamento com o caso função degrau unitário.

Outras dicas

Dê uma olhada aqui: http://www.eckner.com/research.html

Olhe para o segundo link: "" Algoritmos para desigualmente espaçados Séries Temporais: Médias Móveis e outros operadores rolamento "

O documento descreve exatamente os algoritmos de programação que você precisa, eu acho.

Esta não é uma resposta completa, mas pode ser o início de um. É tanto quanto eu tenho com isso em uma hora ou assim de jogar; Estou postando-o como um exemplo do que eu estou procurando, e talvez uma inspiração para outros que trabalham sobre o problema.

I começar com S 0 , que é a média resultante da média anterior S -1 e a amostra Y 0 tomado em t 0 . (T 1 - t 0 ). É o meu intervalo de amostra e a está definido para o que for apropriado para esse intervalo de amostra eo período durante o qual gostaria de média

Eu considerei o que acontece se eu perder a amostra a t 1 e em vez disso tem que se contentar com a amostra Y 2 tomada em t 2 ? Bem, podemos começar pela expansão da equação para ver o que teria acontecido se tivéssemos tido Y 1 :

  • S 2 = aY 2 + (1-a) S 1 , onde S 1 = aY 1 + (1-a) S 0

Substituir:

  • S 2 = aY 2 + (1-a) (aY 1 + (1-a) S 0 )
  • S 2 = aY 2 + (1-a) aY 1 + (1-a) (1-a) S < sub> 0
  • S 2 = aY 2 + (1-a) aY 1 + (1-a) 2 S 0

Eu observo que a série parece se estender infinitamente desta forma, porque podemos substituir o S n no lado direito por tempo indeterminado:

  • S 2 = aY 2 + (1-a) aY 1 + (1-a) 2 (aY 0 + (1-a) S -1 )
  • S 2 = aY 2 + (1-a) aY 1 + (1-a) 2 aY 0 + (1-a) 3 S -1
  • etc.

Ok, por isso não é realmente um polinômio (bobo mim), mas se multiplicar o termo inicial a um, vemos, então, um padrão:

  • S 2 = (1-a) 0 aY 2 + (1-a) aY 1 + (1-a) 2 aY 0 + (1-a) 3 S -1

Hm: é uma série exponencial. Quelle surpresa! Imagine que vem de fora da equação para um móvel exponencial! Média

De qualquer forma, eu tenho essa x 0 + x 1 + x 2 + x 3 +. .. coisa acontecendo, e eu tenho certeza que estou cheirando e ou um logaritmo natural chutando por aqui, mas não me lembro onde eu estava indo ao lado antes de eu corri para fora de tempo.

Qualquer resposta a esta pergunta, ou qualquer prova de correção de tal resposta, altamente depende dos dados que você está medindo.

Se suas amostras foram tomadas em t 0 = 0ms, t 1 = 0.9ms e t 2 = 2.1ms, mas sua escolha de a é baseado em 1ms-intervalos, e, portanto, você quer um a ajustada localmente n , a prova de correção da escolha significaria conhecer os valores da amostra em t = 1 ms e t = 2ms.

Isso leva à pergunta: Você pode interpolar seus dados resonably ter palpites sãs do que in-between valores poderia ter sido? Ou você ainda pode interpolar a média em si?

Se nenhuma dessas é possível, então, tanto quanto eu vê-lo, a escolha lógica de um in-between valor Y (t) é o mais recentemente calculado média , ou seja, Y (t) ˜ S n em que n é tal que t maxmial n

Esta escolha tem uma consequência simples:. Deixe a sozinho, não importa o que a diferença de tempo era

Se, por outro lado, é possível interpolar seus valores, então isso vai lhe dar amostras constantes do intervalo averagable. Por último, se é mesmo possível para interpolar a média em si, o que tornaria o sentido questão.

Usando um a ligeiramente diferente que é igual a (1-a a um a partir da pergunta ), a fórmula básica para adicionar um novo valor de Y a uma média existente de S 0 esta aparência:

S (Y, S 0 ) =

(1-a) Y + aS 0 =

Y - aY + aS 0 =

Y + a (S 0 -Y)

Se agora adicionar o comprimento do intervalo de tempo t e assumir que apenas a depende de que t, que se parece fórmula como esta:

S (Y, T, S 0 ) = Y + a t (S 0 -Y)

Agora vamos supor que t = t 1 + t 2 . Se a média é criada pela adição de dois valores de Y para intervalos de tempo de tempo t 1 e t 2 , as resultantes olhares médios como este:

S (Y, t 2 , S (Y, t 1 , S 0 )) =

Y + a t 2 (S (Y, t 1 , S 0 ) - Y) =

Y + a t 2 ((Y + a t 1 (S 0 -Y)) - Y) =

Y + a t 2 a t 1 (S 0 - Y)

Se esta média deve ser o mesmo que se todo o intervalo t teria sido adicionado de uma só vez, segue-se que a t = a t 1 a t 2 . A definição de a que cumpre este requisito seria:

a x : = A x (para uma constante A)

Porque:

a t = A t = Um t 1 + t 2 = Um t 1 A t 2 = a t 1 a t 2

Isto resulta na seguinte função média:

S (Y, T, S 0 ) = Y + A t (S 0 -Y)

Eu realmente não tenho testado isso, mas se os pressupostos que fez caber seu cenário Isto parece uma função de média que pode lidar com variações nos intervalos de amostragem muito bem.

Vamos dizer que gostaria de fazer um declínio exponencial média em uma função contínua. No entanto, não temos todos os valores dessa função, apenas algumas amostras. Esta fórmula faria uma média ponderada das amostras que nós temos com os pesos que teriam na média contínua.

Multiplicador n = Alpha Tempo n -Tempo n-1

Soma n = Val n + Soma n-1 * Multiplicador n

Contagem n = 1 + Contagem n-1 * Multiplicador n

Média n = Soma n / Contagem n

Eu deixaria o valor alpha sozinho, e preencher os dados em falta.

Uma vez que você não sabe o que acontece durante o tempo em que você não pode amostra, você pode preencher essas amostras com 0s, ou manter o estábulo valor anterior e usar esses valores para o EMA. Ou algum interpolação para trás uma vez que você tem uma nova amostra, preencha os valores em falta, e recalcular o EMA.

O que estou tentando dizer é que você tem um x[n] entrada que tem buracos. Não há maneira de contornar o fato de que está faltando dados. Assim, você pode usar uma ordem de espera zero, ou configurá-lo para zero, ou algum tipo de interpolação entre x[n] e x[n+M], onde M é o número de amostras que faltam e n o início da lacuna. Possivelmente, até mesmo usando valores antes n.

Este é semelhante a um problema em aberto na minha lista de afazeres. Eu tenho um esquema funcionou até certo ponto, mas não têm trabalho matemático para fazer esta sugestão ainda.

Atualização & resumo: gostaria de manter a (alpha) independente fator de suavização do fator de compensação (que me refiro como beta aqui). excelente resposta de Jason já aceito aqui funciona muito bem para mim.

A primeira etapa.

  • Se você também pode medir o tempo desde a última amostra foi colhida (em múltiplos arredondadas de seu tempo de amostragem constante - assim 7,8 ms desde a última amostra seria de 8 unidades), que poderiam ser usados ??para aplicar a suavização várias vezes. Aplicar a fórmula 8 vezes neste caso. Você efetivamente fez um alisamento inclinado mais para o valor atual.

O segundo passo.

  • Para obter uma suavização melhor, precisamos de ajustar o alfa ao aplicar a fórmula 8 vezes no caso anterior.

Qual será esta suavização aproximação falta?

  • Ele já perdeu 7 amostras no exemplo acima
  • Este foi aproximada na etapa 1 com um achatada re-aplicação do valor corrente de um adicional de 7 vezes
  • Se nós definimos um factor de aproximação beta que vai ser aplicado juntamente com alfa (como alfa beta * em vez de apenas alfa), que vai ser assumindo que o 7 perdeu as amostras foram mudança sem problemas entre os valores das amostras anteriores e actuais.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top