C source moving average


Poderia ser se você aplicar um peso inversamente proporcional ao tamanho da janela: public class AverageCounter int RunningAvg int RunningCount // Isso substitui a lista circular int WindowSize public AverageCounter (int windowSize) WindowSize windowSize public void AddValue (float NewValue) // Crescer o tamanho da janela como mais amostras são registradas se (RunningCount lt WindowSize) RunningCount // média móvel recursiva: // gt avg (n) (W - 1) / W amostra (1 / W) Onde W é o tamanho da janela RunningAvg ((((RunningCount - 1) / RunningCount) (1 / RunningCount) NewValue público flutuante Average () return RunningAvg - modificado às 13:53 sexta-feira 9 de novembro de 2007 pwasser 8-Jan-08 16 : 25 Esta fórmula funciona bem para estimar a média móvel, desde que algumas restrições sejam mantidas em mente. Calcula uma estimativa da média móvel (não a média móvel real) com base na suposição importante de que os valores da amostra são normalmente distribuídos em torno da média. Eu indiquei isso em um post anterior. Toadth 9-Oct-11 15:46 Bem, isso não era estúpido. 4 anos e eu poderia ter uma melhor sugestão. Em vez de usar uma lista circular, use uma lista vinculada e mantenha manualmente o tamanho máximo de lista. Desta forma, você pode manter um total de corrida do agregado - ao adicionar à lista de links, adicionar ao agregado, ao aparar um nó, subtrair esse valor do agregado. Para um contador médio com 5 nós, talvez você não notará uma melhoria de desempenho, no entanto, para muitos casos com dizer milhares de nós seria importante. 1. No método AddValue, adicione um novo nó de lista de links e adicione a média 2. Depois de adicionar, verifique o tamanho 3. Se o limite de tamanho: Subtrair de média e, em seguida, aparar nó. Para obter ainda mais eficiência, em vez de usar lista vinculada, você pode implementar sua própria lista circular com base em uma matriz de valores - subtraindo de AVERAGE quando você substituir um valor de matriz. Marc Clifton 10-Oct-11 1:37 4 anos e eu poderia ter uma sugestão melhor. Na verdade, isso funcionaria melhor. Im não certeza da solução correta embora desde somar a média de cada amostra iria introduzir uma quantidade razoável de erro de arredondamento. Hmm. Gostaria de saber se seperating a parte fracionária de toda a parte iria ajudar. Divida a parte inteira de cada número pela contagem. Manter três somas correntes: 1) A média das partes inteiras, 2) O restante de cada divisão, e 3) A parte fracionária de cada número. Cada vez que a parte inteira de um número é dividida, o resultado da parte inteira é adicionado à soma corrente média e o restante é adicionado à soma corrente restante. Quando a soma corrente restante obtém um valor maior ou igual à contagem, a sua divisão pela contagem com o resultado da peça inteira adicionada à soma média corrente e o restante adicionado à soma restante em curso. Também, em cada cálculo, a parte fracionária é adicionada à soma de corrida fracionária. Quando a média é terminada, a soma corrente restante é dividida pela contagem e o resultado é adicionado à soma média corrente como um número flutuante. Por exemplo: Agora o que fazer com a soma de execução fracionada. O perigo de estouro é muito menos provável aqui, embora ainda possível, então uma maneira de lidar com isso seria dividir a soma de execução fracionária pela contagem no final e adicioná-lo ao nosso resultado: Uma alternativa seria verificar a execução fracionária Soma em cada cálculo para ver se ele é maior ou igual a contar. Quando isso acontece, basta fazer a mesma coisa que fazemos com o restante executando soma.

Comments