Wednesday, 18 October 2017

Exponencial Móvel Médio Cuda


Para outra abordagem, você pode truncar a janela de média móvel exponencial e, em seguida, calcular seu sinal filtrado, fazendo uma convolução entre o seu sinal ea janela exponencial. A convolução pode ser calculada usando a biblioteca CUDA FFT livre (cuFFT) porque, como você deve saber, a convolução pode ser expressa como a multiplicação ponto-sábia dos dois sinais no domínio fourier (Este é o apropriadamente chamado Convolution Theorem, Que é executado com uma complexidade de O (n log (n))). Este tipo de abordagem irá minimizar o seu código CUDA kernel e correr muito, muito rapidamente, mesmo em uma GeForce 570 Particularmente, se você pode fazer todos os seus cálculos em única (float) de precisão. Eu gostaria de propor a manipular a equação de diferença acima como indicado abaixo e, em seguida, usando CUDA Thrust primitivas. DIFERENÇA EQUAÇÃO MANIPULAÇÃO - FORMA EXPLÍCITA DA DIFERENÇA EQUAÇÃO Por álgebra simples, você pode encontrar o seguinte: Em conformidade, a forma explícita é a seguinte: CUDA THRUST IMPLEMENTAÇÃO Você pode implementar a forma explícita acima pelas seguintes etapas: Inicializar uma entrada sequencia dinput Alfa, excepto para dinput0 1. Definir um vetor d1 overbetatothen igual a 1, 1beta, 1beta2, 1beta3. Multiply elementwise dinput by d1overbetatothen Executar um inclusivescan para obter a seqüência do yn betan Divida a seqüência acima por 1, 1beta, 1beta2, 1beta3. A abordagem acima pode ser recomendada para sistemas Linear Time-Varying (LTV). Para os sistemas Linear Time-Invariant (LTI), a abordagem FFT mencionada por Paul pode ser recomendada. Eu estou fornecendo um exemplo dessa abordagem usando CUDA Thrust e cuFFT na minha resposta ao filtro FIR em CUDA. Eu essencialmente tenho uma matriz de valores como este: A matriz acima é simplificada, estou colecionando 1 valor por milissegundo no meu código real e eu Necessidade de processar a saída em um algoritmo que eu 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 verá o último número 0.25 como o pico, pois há uma diminuição para 0.24 antes dele. O objetivo é tomar esses valores e aplicar um algoritmo para eles que irá suavizar-los um pouco para que eu tenha mais valores lineares. (Ou seja: Id como meus resultados para ser curvy, não jaggedy) Ive foi dito para aplicar um filtro exponencial 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 processar valores em minha matriz, aplicando um cálculo exponencial de média móvel para igualá-los out perguntou 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 requer uma pequena classe (supondo que você está usando o Java 5 ou posterior): Instantiate com o parâmetro de decadência desejado (pode ter ajuste deve estar entre 0 e 1) e use a média () para filtrar. Ao ler uma página sobre alguma recorrência matemática, tudo o que você realmente precisa saber ao transformá-lo em código é que os matemáticos gostam de escrever índices em matrizes e seqüências com subscritos. (Eles têm algumas outras notações também, o que não ajuda.) No entanto, o EMA é bastante simples, como você só precisa se lembrar de um antigo valor não arrays estado complicado necessário. Respondeu 8 fevereiro às 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.) Observe que os primeiros termos na seqüência média saltarão um pouco 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 demais. Ndash Donal Fellows Feb 9 12 em 0:06 Estou tendo dificuldade em entender suas perguntas, mas vou tentar responder de qualquer maneira. 1) Se o seu algoritmo encontrado 0,25 em vez de 0,36, então ele está errado. É errado porque assume um aumento ou uma 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 deseja encontrar o valor máximo entre dois pontos no tempo, corte sua matriz de tmin para tmax e localize 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.4, 1.5, 1.5. Eu posso suavizar isto tomando a média de dois números: 1.45, 1.45, 1.45, 1.5. Observe que o primeiro número é a média de 1,5 e 1,4 (segundo e primeiro 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 (Quarto e terceiro), e assim por diante. Eu poderia ter feito o período três ou quatro, ou n. Observe como os dados são muito mais suaves. Uma boa maneira de ver as médias móveis no trabalho é ir ao Google Finance, selecionar um estoque (tente 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ínima exponencial para comparar suas diferenças. A média móvel exponencial é apenas mais uma elaboração disto, mas pondera os dados mais antigos menos do que os novos dados, isto é uma forma de influenciar a suavização em direção às costas. Por favor, leia a entrada da Wikipedia. Então, isso é mais um comentário do que uma resposta, mas a pequena caixa de comentários era apenas 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ê precisará manipular as partes inicial e final dos dados, uma vez que claramente você não consegue média dos últimos 5 termos quando você está no seu 2º ponto de dados. Além disso, há maneiras mais eficientes de calcular essa média móvel (soma sum - mais antigo mais recente), mas isso é para obter o conceito do que está acontecendo em toda. Respondida em 8 de fevereiro às 20: 41Quando computar uma média móvel em execução, colocando a média no período de tempo médio faz sentido No exemplo anterior, calculamos a média dos primeiros 3 períodos de tempo e colocá-lo próximo ao período 3. Poderíamos ter colocado A média no meio do intervalo de tempo de três períodos, ou seja, próximo ao período 2. Isso funciona bem com períodos de tempo ímpar, mas não tão bom para mesmo períodos de tempo. Então, onde colocamos a primeira média móvel quando M4 Tecnicamente, a Média Móvel cairá em t 2,5, 3,5. Para evitar esse problema, suavizamos as MAs usando M 2. Assim, suavizamos os valores suavizados Se formos um número médio de termos, precisamos suavizar os valores suavizados. A tabela a seguir mostra os resultados usando M 4.

No comments:

Post a Comment