Previsão por Técnicas de Suavização Este site é uma parte dos objetos de aprendizagem de JavaScript E-Labs para tomada de decisão. Outros JavaScript nesta série são categorizados sob diferentes áreas de aplicações na seção MENU nesta página. Uma série de tempo é uma seqüência de observações que são ordenadas no tempo. Inerente na coleta de dados levados ao longo do tempo é alguma forma de variação aleatória. Existem métodos para reduzir o cancelamento do efeito devido a variação aleatória. As técnicas amplamente utilizadas são suavização. Estas técnicas, quando devidamente aplicadas, revelam mais claramente as tendências subjacentes. Insira a série de tempo em ordem de linha em seqüência, começando pelo canto superior esquerdo e o (s) parâmetro (s) e, em seguida, clique no botão Calcular para obter uma previsão de um período antecipado. Caixas em branco não são incluídas nos cálculos, mas zeros são. Ao inserir seus dados para mover de célula para célula na matriz de dados use a tecla Tab não seta ou digite chaves. Características de séries temporais, que podem ser reveladas ao examinar seu gráfico. Com os valores previstos, eo comportamento residual, modelagem de previsão de condições. Médias móveis: As médias móveis classificam-se entre as técnicas mais populares para o pré-processamento de séries temporais. Eles são usados para filtrar o ruído branco aleatório dos dados, para tornar a série de tempo mais suave ou mesmo para enfatizar certos componentes informativos contidos na série de tempo. Suavização Exponencial: Este é um esquema muito popular para produzir uma Série de Tempo suavizada. Enquanto que em Médias Móveis as observações passadas são ponderadas igualmente, a Suavização Exponencial atribui pesos exponencialmente decrescentes à medida que a observação avança. Em outras palavras, as observações recentes recebem relativamente mais peso na previsão do que as observações mais antigas. O Double Exponential Smoothing é melhor para lidar com as tendências. Triple Exponential Smoothing é melhor no manuseio de tendências de parabola. Uma média móvel exponencialmente ponderada com uma constante de suavização a. Corresponde aproximadamente a uma média móvel simples de comprimento (isto é, período) n, onde a e n estão relacionados por: a 2 / (n1) OR n (2 - a) / a. Assim, por exemplo, uma média móvel exponencialmente ponderada com uma constante de suavização igual a 0,1 corresponderia aproximadamente a uma média móvel de 19 dias. E uma média móvel simples de 40 dias corresponderia aproximadamente a uma média móvel exponencialmente ponderada com uma constante de suavização igual a 0,04878. Suavização Linear Exponencial de Holts: Suponha que a série de tempo não é sazonal, mas exibe tendência. Holts método estima tanto o nível atual ea tendência atual. Observe que a média móvel simples é caso especial da suavização exponencial, definindo o período da média móvel para a parte inteira de (2-Alpha) / Alpha. Para a maioria dos dados empresariais, um parâmetro Alpha menor que 0,40 é frequentemente eficaz. No entanto, pode-se realizar uma busca de grade do espaço de parâmetro, com 0,1 a 0,9, com incrementos de 0,1. Então o melhor alfa tem o menor erro médio absoluto (erro MA). Como comparar vários métodos de alisamento: Embora existam indicadores numéricos para avaliar a precisão da técnica de previsão, a abordagem mais ampla consiste na comparação visual de várias previsões para avaliar a sua precisão e escolher entre os vários métodos de previsão. Nesta abordagem, é necessário plotar (usando, por exemplo, Excel) no mesmo gráfico os valores originais de uma variável de série temporal e os valores previstos de vários métodos de previsão diferentes, facilitando assim uma comparação visual. Você pode gostar de usar as Previsões Passadas por Técnicas de Suavização JavaScript para obter os valores de previsão anteriores com base em técnicas de suavização que usam apenas um único parâmetro. Holt e Winters usam dois e três parâmetros, respectivamente, portanto, não é uma tarefa fácil selecionar os valores ótimos, ou mesmo próximos, ótimos por tentativa e erros para os parâmetros. A suavização exponencial única enfatiza a perspectiva de curto alcance que define o nível para a última observação e é baseada na condição de que não há tendência. A regressão linear, que se ajusta a uma linha de mínimos quadrados aos dados históricos (ou dados históricos transformados), representa a faixa de longo alcance, que está condicionada à tendência básica. Holts linear suavização exponencial captura informações sobre tendência recente. Os parâmetros no modelo de Holts são níveis-parâmetro que devem ser diminuídos quando a quantidade de variação de dados é grande, e as tendências-parâmetro devem ser aumentadas se a tendência de direção recente é apoiada pelo causal alguns fatores. Previsão de Curto Prazo: Observe que cada JavaScript nesta página fornece uma previsão de um passo adiante. Para obter uma previsão de duas etapas. Basta adicionar o valor previsto ao final dos dados de séries temporais e, em seguida, clicar no mesmo botão Calcular. Você pode repetir este processo por algumas vezes, a fim de obter as previsões de curto prazo necessárias. Eu, essencialmente, têm uma matriz de valores como este: A matriz acima é simplificada, estou colecionando 1 valor por milissegundo no meu código real e eu preciso 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 veria 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 perguntou 8 de fevereiro à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 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 a sintonia 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.) Note que os primeiros termos na seqüência média saltarão em torno de 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 muito. 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 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 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 de três ou quatro, ou n. Observe como os dados são muito mais suaves. Uma boa maneira de ver 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 período determinado 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, esta é uma forma de polarizar o alisamento para trás. 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. Assim, a saída que você obtém seria o último x termos dividido por x. Pseudocódigo não testado: Note que você precisará lidar com as partes inicial e final dos dados, uma vez que claramente você não pode fazer a média dos últimos 5 termos quando estiver no seu 2º ponto de dados. Além disso, há maneiras mais eficientes de calcular essa média móvel (soma soma - mais antigo mais recente), mas isso é para obter o conceito do que está acontecendo em toda. Respondido Feb 8 12 at 20: 41Frame Rate-Independent filtro de passa-baixa Resumo Se você quiser um filtro low-pass independente de taxa de quadros (uma resposta de impulso infinita, ou IIR) para aplicar a um fluxo de dados, use esta fórmula: filterValue OldValue (newValue - oldValue) / (alisamento / timeSinceLastUpdate) Fundo Imagine que você tem um fluxo de dados que vem que tem algum ruído nele. Esta poderia ser a taxa de quadros de um jogo, o movimento do mouse do usuário desenhando uma linha, a tensão medida através de um resistorwhatever. Pontos traçando uma linha barulhenta de milhares de pontos. O ruído tem uma distribuição normal em torno de um valor de variação suave com dois saltos acentuados em valor. Você quer gráfico esse valor, mas você quer esconder o ruído. Uma solução é um filtro passa-baixa. Um filtro simples de passagem baixa Semelhante a um equalizador gráfico de áudio com os agudos discados para baixo, um filtro passa-baixa amortece mudanças de alta freqüência (rápidas) para o sinal. Ao contrário de uma média móvel. Ele requer apenas três números para cobrir todo o espectro de efeito, de nenhuma mudança para a entrada para unyielding snail-paced-graph. Aqui está um exemplo de como usar um filtro passa-baixo para alterar os valores de uma matriz, usando JavaScript: Toda a potência do filtro está no valor da linha (currentValue-value) / smoothing. Isso localiza a diferença entre o novo valor eo valor atual (alisado), encolhe-lo com base na força do filtro e, em seguida, adiciona-lo para o valor suavizado. Você pode ver que se alisamento é definido como 1, o valor suavizado sempre se torna o próximo valor. Se o alisamento é definido como 2, o valor suavizado move-se a meio caminho para cada novo ponto em cada nova moldura. Quanto maior o valor de suavização, menos a linha suavizada é perturbada por novas alterações. Tente você mesmo. A seguinte linha verde é o valor suavizado do nosso ruído azul. Ajuste a suavização abaixo e veja os efeitos na linha. Encontrar um valor que você acha que parece suave e agradável, enquanto ainda dando uma boa representação do que está acontecendo no azul. Uma única linha cujo ajuste se baseia no valor de suavização. O impacto de taxas de quadro inferiores Se você gosta de mim, você pode ter escolhido um valor de alisamento entre 20 e 60. Os valores mais altos suavizar o ruído bem, ao custo de um ligeiro atraso ao representar os dois instantâneos, saltos de sinal acentuado. No entanto, não foram em um bom lugar (ainda). Se a nossa taxa de quadros mudar a velocidade em que estavam amostragem do sinal, o efeito do nosso suavizado cuidadosamente escolhido pode ter efeitos drasticamente diferentes. O gráfico a seguir mostra os efeitos de 2x taxa de quadros reduzida (magenta), 5x reduzido (vermelho) e taxa de amostragem variável (amarelo). Um alisamento que funciona bem em uma alta taxa de amostragem é muito forte quando a taxa cai. (Se você não consegue ver as diferenças entre as linhas, tente aumentar a suavização acima). Três linhas traçadas na parte superior da linha original. O que precisamos é de uma fórmula que contabiliza alterações na taxa de quadros. Conseguindo a independência da taxa de quadros Você pode ter notado que há um efeito semelhante entre aumentar o valor de suavização e diminuir a taxa de amostragem. Na verdade, verifica-se que eles são mais do que semelhantes, eles são equivalentes. A duplicação do alisamento é o mesmo que uma redução para metade da taxa. Como tal, apenas um menor tweak é necessário para a nossa fórmula de suavização: valor (currentValue - valor) / (alisamento / timeSinceLastSample) A seguir estão as várias taxas de amostragem com suavização ajustada com base na taxa. Embora eles variam ligeiramente um do outro (com base em qual das amostras horrendosamente ruidosas que trava), você pode ver que eles geralmente correspondem, independentemente da configuração de suavização acima: Três linhas traçadas em cima da linha original. Finalmente, aqui está um bloco de código semelhante ao que eu uso: Eu preciso projetar um filtro de média móvel que tem uma freqüência de corte de 7,8 Hz. Eu usei filtros de média móvel antes, mas até onde estou ciente, o único parâmetro que pode ser alimentado é o número de pontos a serem calculados. Como isso pode se relacionar a uma freqüência de corte O inverso de 7,8 Hz é de 130 ms e Im trabalhando com dados que são amostrados a 1000 Hz. Isso implica que eu deveria estar usando um tamanho de janela de filtro média móvel de 130 amostras, ou há algo mais que estou faltando aqui pediu Jul 18 13 at 9:52 O filtro de média móvel é o filtro usado no domínio do tempo para remover O ruído adicionado e também para o propósito de suavização, mas se você usar o mesmo filtro de média móvel no domínio da freqüência para a separação de freqüência, o desempenho será pior. O filtro de média móvel (por vezes conhecido coloquialmente como um filtro de caixa) tem uma resposta de impulso retangular: Ou, afirmado de forma diferente: Lembrando que uma resposta de freqüência de sistemas de tempo discreto é Igual à transformada de Fourier de tempo discreto da sua resposta de impulso, podemos calculá-la da seguinte forma: O que mais interessou para o seu caso é a resposta de magnitude do filtro, H (ômega). Usando algumas manipulações simples, podemos obter isso em uma forma mais fácil de compreender: Isso pode não parecer mais fácil de entender. No entanto, devido à identidade Eulers. Lembre-se que: Portanto, podemos escrever o acima como: Como eu disse antes, o que você está realmente preocupado com a magnitude da resposta de freqüência. Assim, podemos tomar a magnitude do acima para simplificá-lo ainda mais: Nota: Nós somos capazes de soltar os termos exponenciais, porque eles não afetam a magnitude do resultado e 1 para todos os valores de ômega. Como xy xy para quaisquer dois números finitos x e y, podemos concluir que a presença de termos exponenciais não afeta a resposta de magnitude global (em vez disso, eles afetam a resposta de fase de sistemas). A função resultante dentro dos parênteses de magnitude é uma forma de um kernel de Dirichlet. Às vezes é chamado de função periódica sinc, porque se assemelha a função sinc um pouco na aparência, mas é periódica em vez disso. De qualquer forma, uma vez que a definição de freqüência de corte é um pouco underspecified (-3 dB ponto -6 dB ponto primeiro sidelobe nulo), você pode usar a equação acima para resolver o que você precisa. Especificamente, você pode fazer o seguinte: Definir H (omega) para o valor correspondente à resposta do filtro que você deseja na freqüência de corte. Defina ômega igual à frequência de corte. Para mapear uma freqüência de tempo contínuo para o domínio de tempo discreto, lembre-se que omega 2pi frac, onde fs é sua taxa de amostragem. Encontre o valor de N que lhe dá o melhor acordo entre os lados esquerdo e direito da equação. Isso deve ser o comprimento de sua média móvel. Se N é o comprimento da média móvel, então uma frequência de corte aproximada F (válida para N gt 2) na frequência normalizada Ff / fs é: O inverso disso é: Esta fórmula é assintoticamente correta para N grande e tem cerca de 2 para N2 e menos de 0,5 para N4. P. S. Depois de dois anos, aqui finalmente qual foi a abordagem seguida. O resultado foi baseado na aproximação do espectro de amplitude da MA em torno de f0 como uma parábola (série de 2ª ordem) de acordo com MA (Omega) aproximadamente 1 (frac-fra) Omega2 que pode ser feita mais exata perto do cruzamento zero de MA (Omega) Frac por multiplicação de Omega por um coeficiente de obtenção de MA (Omega) aprox. 10.907523 (frac-fra) Omega2 A solução de MA (Omega) - frac 0 dá os resultados acima, onde 2pi F Omega. Tudo o que acima se refere à freqüência de corte -3dB, o sujeito deste post. Às vezes, porém, é interessante obter um perfil de atenuação em banda de parada que é comparável com o de um filtro de baixa passagem IIR de 1ª ordem (LPF de um pólo) com uma determinada freqüência de corte -3dB (tal LPF é também chamado integrador com vazamento, Tendo um pólo não exatamente em DC, mas perto dele). De facto, tanto a MA como a 1ª ordem IIR LPF têm uma inclinação de -20dB / década na banda de paragem (é necessário um N maior do que o utilizado na figura, N32, para ver isto), mas enquanto que MA tem nulos especulares em Fk / N e um evelope 1 / f, o filtro IIR tem apenas um perfil 1 / f. Se se deseja obter um filtro MA com capacidades semelhantes de filtragem de ruído como este filtro IIR, e corresponder às frequências de corte 3dB para ser o mesmo, ao comparar os dois espectros, ele perceberá que a ondulação da banda de parada do filtro MA acaba 3dB abaixo do filtro IIR. Para obter a mesma ondulação de banda de parada (isto é, a mesma atenuação de potência de ruído) como o filtro IIR as fórmulas podem ser modificadas da seguinte forma: Eu encontrei de volta o script Mathematica onde eu calculava o corte para vários filtros, incluindo o MA. O resultado foi baseado na aproximação do espectro MA em torno de f0 como uma parábola de acordo com MA (Omega) Sin (OmegaN / 2) / Sin (Omega / 2) Omega 2piF MA (F) aproximadamente N1 / 6F2 (N-N3) pi2. E derivando o cruzamento com 1 / sqrt a partir daí. Ndash Massimo Jan 17 at 2:08 É possível implementar uma média móvel em C sem a necessidade de uma janela de amostras Ive descobri que eu posso otimizar um pouco, escolhendo um tamanho de janela thats uma potência de dois para permitir bit-shifting Em vez de dividir, mas não precisando de um buffer seria bom. Existe uma maneira de expressar um novo resultado da média móvel apenas como uma função do antigo resultado e da nova amostra Definir um exemplo de média móvel, através de uma janela de 4 amostras para ser: Adicionar nova amostra e: Uma média móvel pode ser implementada recursivamente , Mas para um cálculo exato da média móvel você deve se lembrar da amostra de entrada mais antiga na soma (ou seja, o a no seu exemplo). Para um comprimento N média móvel você calcula: onde 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 xn-N para calcular (2). Como indicado por Conrad Turner, você pode usar uma janela exponencial (infinitamente longa), que permite calcular a saída somente da saída anterior e da entrada atual: mas esta não é uma média móvel padrão (não ponderada), mas uma média exponencial Ponderada média móvel, 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 no passado). Inicialize total 0, count0 (cada vez que vê um novo valor) Então uma entrada (scanf), uma add totalnewValue, um incremento (count), uma divide average (total / count) Esta seria uma média móvel sobre todas as entradas Para calcular a média Sobre apenas as 4 últimas 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 das 4 variáveis de entrada, dividida por 4 (desvio para a direita 2 seria bom se todas as entradas fossem Positivo para fazer o cálculo médio
No comments:
Post a Comment