Tuesday 25 July 2017

Implementação De Média Móvel Ponderada


Eu gostaria de executar uma média móvel ponderada exponencialmente com parametrização definida aqui em um vetor em R Existe uma implementação melhor do que a minha primeira tentativa abaixo. Minha primeira tentativa foi. Na minha segunda tentativa, eu pensei que poderia fazer melhor vectorizing. I Acho que eu não deveria ter sido muito surpreso com os resultados na minha segunda tentativa Foi uma tentativa muito feio de vectorização Mas tem que haver algo como isso que melhora na minha primeira tentativa direita. Eu encontrei uma melhor implementação aqui e adaptou-o como Seguinte. DigEmAll foi muito gentil com uma versão Rcpp, mas também note que você poderia apenas usar o pacote TTR, ou, como seu autor observa, a abordagem de filtro de estatísticas que eu usei em um post no agora desaparecido R Graph Gallery uma década ago. Anyway, Um tiroteio rápido shootout mostra a versão Rcpp muito mais rápido o que provavelmente significa que temos a parametrização errado. Actualmente, lambda 0 5 é uma decaimento excepcionalmente forte que corresponderia a uma meia-vida em um dia, ou N 1 Se eu usar isso, A diferença é ainda mais ampla. Para completar, o arquivo inteiro que pode ser apenas Rcpp sourceCpp - ed. answered Mar 13 em 22 30.I iria definir TTR EMA y, relação 0 5 para o benchmark não que eu acho que vai fazer muita diferença Observe também que o TTR EMA está fazendo um pouco mais do que o filtro de estatísticas e esta versão do Rcpp tem alguns erros de verificação, lida NA e usa o paradigma e reclass para lidar internamente com muitos tipos diferentes de objetos Joshua Ulrich Mar 13 at 22 58.Thanks Para o lembrete sobre a relação Dirk Eddelbuettel Mar 13 em 23 46.Y Nosso Answer.2017 Stack Exchange, Inc. I essencialmente tem uma matriz de valores como este. A matriz acima é simplificada, estou coletando 1 valor por milissegundo no meu código real e eu preciso processar a saída de um algoritmo que escrevi para encontrar O pico mais próximo antes de um ponto no tempo Minha lógica falha porque no meu exemplo acima, 0 36 é o pico real, mas meu algoritmo olharia para trás e veria o último número 0 25 como o pico, pois há uma diminuição para 0 24 antes O objetivo é tomar esses valores e aplicar um algoritmo para eles que irá suavizá-los um pouco para que eu tenho mais valores lineares, ou seja, eu gostaria que meus resultados para ser curvy, não jaggedy. Me disseram para aplicar uma exponencial Filtro de média móvel para os meus valores Como posso fazer isso É muito difícil para mim ler equações matemáticas, eu lidar muito melhor com o código. Como posso processar valores em minha matriz, aplicando um cálculo de média móvel exponencial para até mesmo out. asked Feb 8 12 at 20 27.Para calcular uma média móvel exponencial você Precisa manter algum estado ao redor e você precisa de um parâmetro de ajuste Isso chama para uma pequena classe supondo que você está usando Java 5 ou posterior. Com o parâmetro de decadência que você deseja pode ter ajuste deve ser entre 0 e 1 e, em seguida, usar a média para filtrar. Ao ler uma página sobre alguma recorrência matemática, tudo o que você realmente precisa saber quando transformá-lo em código é que os matemáticos gostam de escrever índices em matrizes e seqüências com subscritos Eles também algumas outras notações, o que não ajuda No entanto, a EMA É bastante simples como você só precisa se lembrar de um valor antigo sem arranjos de estado complicado required. answered Feb 8 12 at 20 42. TKKocheran Muito bonito Não é bom quando as coisas podem ser simples Se começar com uma nova seqüência, obter um novo averager Nota Que os primeiros poucos termos na seqüência média saltarão em torno de um bit devido a efeitos de limite, mas você obtém aqueles com outras médias móveis também No entanto, uma boa vantagem é que você pode envolver a lógica de média móvel para o averager E experimentar sem perturbar o resto do seu programa muito Donal Fellows Feb 9 12 em 0 06.Eu estou tendo dificuldade em entender suas perguntas, mas vou tentar responder anyway.1 Se o seu algoritmo encontrado 0 25 em vez de 0 36, Então é errado É errado porque ele assume um aumento ou diminuição monotônica que está sempre subindo ou sempre indo para baixo A menos que você média TODOS os seus dados, seus pontos de dados --- como você apresentá-los --- são não-lineares Se você realmente quer Para encontrar o valor máximo entre dois pontos no tempo, então corte sua matriz de tmin para tmax e encontre o máximo desse subarray.2 Agora, o conceito de médias móveis é muito simples imagine que eu tenho a seguinte lista 1 4, 1 5 1 45, 1 45, 1 5 Observe que o primeiro número é a média de 1 5 e 1 4 segundos e primeiros números A segunda nova lista é a média de 1 4 e 1 5 terceira e segunda lista antiga a terceira nova lista a média de 1 5 e 1 4 f Ourth e terceiro, e assim por diante Eu poderia ter feito período de três ou quatro, ou n Observe como os dados são muito mais suave Uma boa maneira de ver as médias móveis no trabalho é ir para o Google Finance, selecione uma ação tentar Tesla Motors bastante volátil TSLA e clique em technicals na parte inferior do gráfico Selecione Média Móvel com um determinado período, e média móvel exponencial para comparar as suas diferenças. A média móvel exponencial é apenas mais uma elaboração deste, mas pondera os dados mais antigos menos do que os novos dados isso é Uma maneira de polarizar a suavização em direção à parte de trás Por favor, leia a entrada de Wikipedia. Então, isso é mais um comentário do que uma resposta, mas a pequena caixa de comentário foi apenas a pequena boa sorte. Se você está tendo problemas com a matemática, você poderia ir Com uma média móvel simples em vez de exponencial Então, a saída que você obtém seria o último x termos dividido por x pseudocódigo não testado. Note que você vai precisar para lidar com o início e fim partes dos dados uma vez que claramente você pode t média dos últimos 5 termos quando você Estão no seu 2º ponto de dados Além disso, existem maneiras mais eficientes de calcular esta soma média móvel - a mais antiga, mas isso é para obter o conceito do que está acontecendo em toda a gente. Uma média móvel em C sem a necessidade de uma janela de samples. I ve descobri que eu posso otimizar um pouco, escolhendo um tamanho de janela que sa potência de dois para permitir bit-shifting em vez de dividir, mas não precisando de um buffer seria Ser bom Existe uma maneira de expressar um novo resultado média móvel apenas como uma função do antigo resultado e da nova amostra. Define um exemplo de média móvel, através de uma janela de 4 amostras para ser. Add nova amostra eA média móvel pode ser implementada Recursivamente, mas para um cálculo exato da média móvel você tem que lembrar a mais antiga amostra de entrada na soma ou seja, o a no seu exemplo Para um comprimento N média móvel que você compute. where yn é o sinal de saída e xn é o sinal de entrada Eq 1 pode ser escrito recursivamente como. Então você sempre Precisa lembrar a amostra x nN para calcular 2. Como apontado por Conrad Turner, você pode usar uma janela exponencial infinitamente longa em vez disso, que permite que você calcule a saída somente da saída anterior e da entrada atual. Não uma média móvel não ponderada padrão, mas uma média móvel exponencialmente ponderada, onde as amostras mais no passado obter um peso menor, mas pelo menos em teoria você nunca esquecer nada os pesos apenas ficar menor e menor para amostras longe no passado. Média móvel sem memória de item individual para um programa de rastreamento GPS que eu escrevi. Começo com 1 amostra e dividir por 1 para obter o atual avg. I, em seguida, adicionar outra amostra e dividir por 2 para o atual avg. This continua até chegar a O comprimento da média. Cada tempo depois, eu adiciono na nova amostra, obter a média e remover essa média do total. Eu não sou um matemático, mas isso parecia ser uma boa maneira de fazê-lo eu pensei que iria transformar o estômago De um real Cara de matemática, mas, acontece que é uma das formas aceitas de fazê-lo E funciona bem Basta lembrar que quanto maior o seu comprimento mais lento é seguir o que você quer seguir Isso pode não importar a maior parte do tempo, mas quando os satélites seguintes , Se você estiver lento, a trilha poderia estar longe da posição real e ficará ruim Você poderia ter uma lacuna entre o sat e os pontos à direita Eu escolhi um comprimento de 15 atualizado 6 vezes por minuto para obter alisamento adequado e não obter Muito longe da posição real sentado com a trilha liso dots. answered 16 de novembro de 16 às 23 03.initialize total 0, contagem de 0 cada vez vendo um novo valor. Then um scanf de entrada, um add newValue total, uma contagem de incremento, uma divisão Para calcular a média sobre apenas as últimas 4 entradas, exigiria 4 variáveis ​​de entrada, talvez copiando cada entrada para uma variável de entrada mais antiga, calculando a nova média móvel como a soma dos 4 Variáveis ​​de entrada, dividida Por 4 direito turno 2 seria bom se todas as entradas foram positivas para fazer a média de cálculo. respondeu 3 de fevereiro 15 em 4 06. Isso vai realmente calcular a média total e não a média móvel Como conta aumenta o impacto de qualquer nova entrada A amostra torna-se extremamente pequena Hilmar Feb 3 15 at 13 53.Your Answer.2017 Stack Exchange, Inc.

No comments:

Post a Comment