Tuesday, 7 November 2017

Implementação De Eficiência Média Móvel


Eu essencialmente tenho uma série de valores como este: a matriz acima é simplificada demais, estou coletando 1 valor por milissegundo em meu código real e preciso processar a saída em 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 olhava para trás e veria o último número 0.25 como o pico, pois há uma diminuição para 0,24 antes dele. O objetivo é levar esses valores e aplicar um algoritmo para eles, que os suavizará um pouco para que eu tenha mais valores lineares. (Ie: Id como os meus resultados serem curvy, não jaggedy) Eu fui dito para aplicar um filtro exponencial de média móvel aos meus valores. Como posso fazer isso. É muito difícil para mim ler equações matemáticas, eu ligo muito melhor com o código. Como faço para processar valores na minha matriz, aplicando um cálculo exponencial da média móvel para os fazer sair 8 de fevereiro 12 às 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 exige uma pequena classe (supondo que você esteja usando o Java 5 ou posterior): Instantiate com o parâmetro de decaimento que você deseja (pode ter uma afinação deve estar entre 0 e 1) e depois 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 subíndices. (Contudo, algumas outras notações, o que não ajuda.) No entanto, o EMA é bastante simples, pois você só precisa se lembrar de um valor antigo, não é necessário nenhum arrays de estados complicados. Respondeu 8 de fevereiro às 20:42 TKKocheran: praticamente. Não é bom quando as coisas podem ser simples (Se começar com uma nova seqüência, obtenha uma nova média). Observe que os primeiros termos na seqüência média saltarão em torno de um bit devido a efeitos de limites, 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 média móvel na média e experimentar sem perturbar demais o seu programa. Ndash Donal Fellows 9 de fevereiro às 0:06 Estou tendo dificuldade em entender suas perguntas, mas vou tentar responder de qualquer maneira. 1) Se o seu algoritmo encontrou 0,25 em vez de 0,36, então está errado. É errado porque assume um aumento ou diminuição monotônico (que sempre está subindo ou sempre está descendo). A menos que você tenha TODOS OS seus dados, seus pontos de dados --- como você os apresenta --- são não-lineares. Se você realmente quer 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.4, 1.5, 1.5. Eu posso suavizá-lo 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úmero), 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 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 para o Google Finance, selecionar um estoque (tente Tesla Motors bastante volátil (TSLA)) e clique em técnicas na parte inferior do gráfico. Selecione a média móvel com um período determinado e uma média móvel exponencial para comparar suas diferenças. A média móvel exponencial é apenas uma outra elaboração deste, mas considera os dados anteriores menos do que os novos dados, é uma maneira de polarizar o alisamento na parte de trás. Leia a entrada da Wikipedia. Então, isso é mais um comentário do que uma resposta, mas a pequena caixa de comentários foi apenas pequena. Boa sorte. Se você estiver 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 os últimos x termos divididos por x. Pseudocódigo não testado: note que você precisará lidar com as partes de início e fim dos dados, pois claramente você não pode usar os 5 últimos termos quando estiver no seu segundo ponto de dados. Além disso, existem formas mais eficientes de calcular essa média móvel (soma sumária - a mais nova), mas é para obter o conceito do que está acontecendo. Respondeu 8 de fevereiro às 20:41 Sua resposta 2017 Stack Exchange, Inc Atualmente estou desenvolvendo um sistema LCD gráfico para exibir temperaturas, fluxos, voltagens, energia e energia em um sistema de bomba de calor. O uso de um LCD gráfico significa que metade do meu SRAM e 75 do meu flash foram usados ​​por um buffer de tela e strings. Atualmente estou mostrando números de minmaxaverage para energia À meia-noite, quando o valor diário é reiniciado, o sistema verifica se o consumo do dia está acima ou abaixo do mínimo ou mínimo anterior e armazena o valor. A média é calculada dividindo o consumo cumulativo de energia pelo número de dias. Gostaria de exibir a média diária na última semana e mês (4 semanas por simplicidade), ou seja, uma média móvel. Atualmente, isso envolve a manutenção de uma série de valores nos últimos 28 dias e o cálculo de uma média em toda a matriz para mensalmente e últimos 7 dias por semana. Inicialmente eu estava fazendo isso usando uma série de flutuadores (como a energia está na forma 12.12kWh), mas isso foi usando 28 4 bytes 112 bytes (5.4 de SRAM). Eu não me importo de ter apenas um único ponto decimal de resolução, então eu mudei para usar uint16t e multiplicando a figura por 100. Isso significa que 12.12 é representado como 1212, e eu dividir por 100 para exibição. O tamanho da matriz agora é de até 56 bytes (muito melhor). Não há uma maneira trivial de reduzir a figura para um uint8t que eu possa ver. Eu poderia tolerar a perda de uma casa decimal (12.1kWh em vez de 12.12kWh), mas o consumo é freqüentemente maior do que 25.5kWh (255 sendo o valor mais alto representado por um inteiro não assinado de 8 bits). O consumo nunca foi inferior a 10.0kWh ou acima de 35.0kWh, então, eu poderia subtrair 10 das figuras armazenadas, mas eu sei que um dia superaremos esses limites. Então testei o código para empacotar valores de 9 bits em uma matriz. Isso dá uma faixa de 0-51.2kWh e usa 32 bytes no total. No entanto, aceder a uma matriz como esta é bastante lento, especialmente quando você precisa iterar sobre todos os valores para calcular uma média. Então, minha pergunta é: existe uma maneira mais eficiente de calcular uma média móvel com três janelas - vida, 28 dias e 7 dias. Eficiência significa menor em termos de uso SRAM, mas sem a pena de um código enorme. Posso evitar armazenar todos os valores solicitados em 7 de março às 8:32. Eu já pensei e você está certo. Então, tecnicamente, torna minha resposta incorreta. Estou investindo mais tempo e paciência nisso. Talvez algo fora da caixa. Vou avisá-lo se eu encontrar alguma coisa. Fazemos algo assim muito no meu local de trabalho. Deixe-me perguntar ao redor. Desculpe pela confusão. Ndash Aditya Somani Mar 8 14 às 17:15 existe uma maneira mais eficiente de calcular uma média móvel com. 28 dias e 7 dias. Precisando lembrar 27 dias de história. Você pode ficar perto o suficiente armazenando 11 valores em vez de 28 valores, talvez algo como: Em outras palavras, ao invés de armazenar todos os detalhes de todos os dias durante os últimos 27 dias, (a) armazene 7 ou mais valores de informações diárias detalhadas para o passado 7 ou mais dias, e também (b) armazenar 4 ou mais valores resumidos de informações totais ou médias para cada uma das últimas 4 semanas.

No comments:

Post a Comment