Thursday 31 August 2017

Movimento Média Padrão Desvio Matlab


Eu tenho uma série de dados x, y e eu estou tentando encontrar a média móvel. Os números de dados x são inteiros de 1 a 100 enquanto os dados y são números de 0,01 a 1 e também têm um desvio padrão ydev (que derivamos porque a experiência é repetida várias vezes). Eu estou tentando encontrar a média móvel usando os 20 vizinhos mais próximos (usando Matlab): A maneira acima deriva a média móvel, mas eu não sei como usar o desvio padrão que eu tenho para cada ponto de dados y porque alguns pontos de dados têm muito Desvios padrão maiores do que outros, o que significa que eles não são tão confiáveis ​​quanto os outros (então eles provavelmente pesam menos). Como posso incluir o desvio padrão para cada ponto de dados no cálculo acima perguntado Jul 5 15 at 15:07 Mover média ou mover mediana. Quanto à questão "Como posso incluir o desvio padrão para cada ponto de dados no cálculo acima", depende do que você quer fazer. Você deve primeiro decidir que (que não é uma questão de programação). Uma sugestão: você não pode usar todo o conjunto de dados para cada x (em vez de apenas a média e desvio padrão) e calcular medico médio a partir desse ndash Luis Mendo Jul 5 15 em 15:12 LuisMendo Eu queria fazer média móvel (editei o Código para refletir isso). O conjunto de dados é uma experiência de séries temporais e tem sido repetido várias vezes (que é como eu tenho desvios padrão para cada ponto). Eu quero usar o desvio padrão para cada ponto no meu cálculo de média móvel, porque eu quero os pontos com menor desvio padrão para pesar mais do que os pontos com maior desvio padrão. Ndash AL B Jul 5 15 at 16:50 Digamos que você tem um vetor a. Em seguida, outra forma de escrever significa (a) como uma média ponderada é awts. Onde wts uns (1, numel (a)) numel (a). No seu caso, você tem um y (ind1 (i): ind2 (i)). Parece que o que você está querendo usar é uma média móvel ponderada, onde seus pesos wts não são mais idênticos, mas são escolhidos usando o desvio padrão dos valores correspondentes. Assumindo que o vetor sd contém os desvios-padrão, uma maneira de fazer isso: Aqui, os valores com desvios padrão menores contribuirão com pesos maiores. Uma idéia alternativa é calcular a média móvel simples de y e seus desvios padrão sd. E então traçá-los ao lado um do outro. Isso tem a vantagem de ser mais estatisticamente interpretável do que escolher pesos em função dos desvios padrão. Agora você pode ver o meu método C para calcular Bandas de Bollinger para cada ponto (média móvel, banda alta, banda para baixo). Como você pode ver este método usa 2 para loops para calcular o desvio padrão móvel usando a média móvel. Usou-se conter um laço adicional para calcular a média móvel durante os últimos n períodos. Isso que eu poderia remover adicionando o novo valor de ponto para totalaverage no início do loop e removendo o valor de ponto i - n no final do loop. Minha pergunta agora é basicamente: Posso remover o loop interno restante de uma maneira semelhante que eu consegui com a média móvel perguntou Jan 31 13 às 21:45 A resposta é sim, você pode. Em meados dos anos 80 desenvolvi um algoritmo (provavelmente não original) no FORTRAN para uma aplicação de monitoramento e controle de processos. Infelizmente, isso foi há mais de 25 anos e eu não me lembro das fórmulas exatas, mas a técnica foi uma extensão da de médias móveis, com cálculos de segunda ordem, em vez de apenas linear. Depois de olhar para o seu código alguns, eu acho que posso suss como eu fiz isso naquela época. Observe como seu laço interno está fazendo uma Soma de Quadrados: da mesma forma que sua média deve ter originalmente teve uma Soma de Valores As únicas duas diferenças são a ordem (seu poder 2 em vez de 1) e que você está subtraindo a média Cada valor antes de quadrá-lo. Agora que pode parecer inseparável, mas na verdade eles podem ser separados: Agora o primeiro termo é apenas uma soma de quadrados, você lidar com isso da mesma maneira que você faz a soma de valores para a média. O último termo (k2n) é apenas a média ao quadrado vezes o período. Desde que você divide o resultado pelo período de qualquer maneira, você pode apenas adicionar o quadrado médio novo sem o laço extra. Finalmente, no segundo termo (SUM (-2vi) k), uma vez que SUM (vi) kn total você pode então mudá-lo para isso: ou apenas -2k2n. Que é -2 vezes a média ao quadrado, uma vez que o período (n) é dividido novamente. Assim, a fórmula combinada final é: (Certifique-se de verificar a validade deste, uma vez que estou derivando-lo fora do topo da minha cabeça) E incorporando em seu código deve ser algo como isto: O problema com as abordagens que calculam a soma dos quadrados É que ele eo quadrado de somas podem ficar bastante grande, eo cálculo de sua diferença pode introduzir um erro muito grande. Então vamos pensar em algo melhor. Por que isso é necessário, veja o artigo da Wikipédia sobre Algoritmos para a variância de computação e John Cook sobre a explicação teórica para resultados numéricos) Primeiro, em vez de calcular o stddev, vamos focar na variância. Uma vez que temos a variância, stddev é apenas a raiz quadrada da variância. Suponha que os dados estejam em uma matriz chamada x rolando uma janela de tamanho n por um pode ser pensado como removendo o valor de x0 e adicionando o valor de xn. Vamos denotar as médias de x0..xn-1 e x1..xn por e respectivamente. A diferença entre as variâncias de x0..xn-1 e x1..xn é, depois de cancelar alguns termos e aplicar (ab) (ab) (ab): Portanto, a variância é perturbada por algo que não exige que você mantenha a Soma de quadrados, o que é melhor para precisão numérica. Você pode calcular a média e a variância uma vez no início com um algoritmo apropriado (método de Welfords). Depois disso, cada vez que você tem que substituir um valor na janela x0 por outro xn você atualiza a média e variância como este: Obrigado por isso. Eu usei-o como a base de uma implementação em C para o CLR. Descobri que, na prática, você pode atualizar tal que newVar é um número negativo muito pequeno, eo sqrt falhar. Eu introduzi um if para limitar o valor para zero para este caso. Não idéia, mas estável. Isso ocorreu quando cada valor na minha janela tinha o mesmo valor (eu usei um tamanho de janela de 20 eo valor em questão era 0,5, no caso de alguém queira tentar reproduzir isso.) Ndash Drew Noakes Jul 26 13 às 15:25 Ive Usado commons-math (e contribuiu para que a biblioteca) para algo muito semelhante a este. Sua fonte aberta, portar para C deve ser fácil como loja-comprado pie (você já tentou fazer uma torta do zero). Confira: commons. apache. orgmathapi-3.1.1index. html. Eles têm uma classe StandardDeviation. Ir para a cidade respondeu Jan 31 13 at 21:48 You39re bem-vindo Lamento não ter a resposta que você está procurando. Eu definitivamente didn39t significa sugerir portar toda a biblioteca Apenas o código mínimo necessário, que deve ser algumas centenas de linhas ou assim. Note que eu não tenho idéia do que legal restrições de direitos autorais apache tem sobre esse código, então você deve ter que verificar isso. No caso de você persegui-lo, aqui está o link. Assim que a variância FastMath ndash Jason Jan 31 13 em 22:36 A informação a mais importante já foi dada acima --- mas talvez este é ainda do interesse geral. Uma pequena biblioteca Java para calcular a média móvel eo desvio padrão está disponível aqui: githubtools4jmeanvar A implementação é baseada em uma variante do método Welfords mencionado acima. Métodos para remover e substituir os valores foram derivados que podem ser usados ​​para mover o valor windows. What seria a maneira ideal para encontrar a média e desvio padrão de um sinal para uma aplicação em tempo real. Id gostaria de ser capaz de acionar um controlador quando um sinal foi mais de 3 desvio padrão fora da média por um determinado período de tempo. Estou assumindo um DSP dedicado faria isso muito facilmente, mas há algum atalho que não pode exigir algo tão complicado perguntou 11 de dezembro de 2011 às 5:11 Theres uma falha em Jason resposta Rs, que é discutido em Knuths Art of Computer Programming vol. 2. O problema vem se você tiver um desvio padrão que é uma pequena fração da média: o cálculo de E (x2) - (E (x) 2) sofre de sensibilidade severa a erros de arredondamento de ponto flutuante. Você pode até tentar isso sozinho em um script Python: Eu recebo -128.0 como uma resposta, que claramente não é computacionalmente válida, já que a matemática prediz que o resultado deve ser não-negativo. Knuth cita uma abordagem (eu não me lembro do nome do inventor) para calcular média de corrida e desvio padrão que vai algo como isto: e depois de cada etapa, o valor de m é a média eo desvio padrão pode ser calculado como sqrt (Sn) ou sqrt (Sn-1) dependendo de qual é a sua definição favorita de desvio padrão. A equação que escrevo acima é ligeiramente diferente da de Knuth, mas é computacionalmente equivalente. Quando eu tiver mais alguns minutos, código mal acima da fórmula acima em Python e mostrar que você obterá uma resposta não negativa (que esperamos que esteja perto do valor correto). Atualização: aqui está. Youll nota que theres ainda algum erro de arredondamento, mas não é ruim, enquanto naivestats apenas pukes. Editar: Apenas notado comentário Belisariuss citando Wikipedia que menciona o algoritmo Knuth. Qual seria a maneira ideal de encontrar a média eo desvio padrão de um sinal para uma aplicação em tempo real. Id gostaria de ser capaz de acionar um controlador quando um sinal foi mais de 3 desvio padrão fora da média por um determinado período de tempo. A abordagem certa em situações como esta é tipicamente para calcular uma média ponderada exponencialmente ponderada e desvio padrão. Na média ponderada exponencialmente, as estimativas da média e variância são tendenciosas em relação à amostra mais recente, fornecendo estimativas da média e variância nos últimos segundos tau. Que é provavelmente o que você quer, um pouco do que a média aritmética usual sobre todas as amostras vistas nunca. No domínio da frequência, uma média ponderada exponencialmente ponderada é simplesmente um pólo real. É simples de implementar no domínio do tempo. Implementação de domínio de tempo Vamos significar e significarq as estimativas atuais da média e da média do quadrado do sinal. Em cada ciclo, atualize essas estimativas com a nova amostra x: Aqui 0 lt a lt 1 é uma constante que determina o comprimento efetivo da média corrente. Como escolher a é descrito abaixo na análise. O que é expresso acima como um programa imperativo também pode ser descrito como um diagrama de fluxo de sinal: O algoritmo acima calcula yi a xi (1-a) y onde xi é a entrada na amostra i, e yi é a saída (ou seja, a estimativa de O significativo). Este é um filtro IIR simples, de um só pólo. Tomando a transformada z, encontramos a função de transferência H (z) frac. Condensando os filtros IIR em seus próprios blocos, o diagrama agora se parece com isto: Para ir para o domínio contínuo, fazemos a substituição z e onde T é o tempo de amostragem e fs 1T é a taxa de amostragem. Resolvendo 1- (1-a) e 0, descobrimos que o sistema contínuo tem um pólo em s frac log (1-a). Um método Ive usado antes em um aplicativo de processamento embutido é manter acumuladores da soma e soma de quadrados do sinal de interesse: Além disso, manter o controle do instante de tempo atual i nas equações acima (ou seja, observe o número De amostras que você adicionou nos acumuladores). Então, a média da amostra eo desvio padrão no tempo i são: sigma2 operatorname (X2) - (operatorname (X)) 2 Eu usei estes com sucesso no passado (embora eu estava preocupado apenas com estimativa de variância, não desvio padrão) Tem que ter cuidado com os tipos numéricos que você usa para segurar os acumuladores se você está indo para ser somando durante um longo período de tempo que você não quer transbordar. Edit: Além do comentário acima sobre estouro, deve-se notar que este não é um algoritmo numericamente robusto quando implementado em aritmética de ponto flutuante, potencialmente causando grandes erros nas estatísticas estimadas. Olhe para Jason resposta Ss para uma abordagem melhor nesse caso. Respondeu Dec 6 11 at 13:34 Parece haver um par de erros de digitação aqui. Por que a média é subtraída sob o sinal da raiz quadrada para sigma deve ser mu2 para corresponder à equação exibida sigma2 E (X2) - (E (X)) 2, não Também, embora não venha a votar nesta resposta, concordo com Jason S que pode haver problemas numéricos nesta abordagem. Ndash Dilip Sarwate Jan 20 12 at 1:33 Semelhante à resposta preferida acima (Jason S.), e também derivado da fórmula tomada de Knut (Vol.2, p 232), também se pode derivar uma fórmula para substituir um valor , Ou seja, remover e adicionar um valor em uma etapa. De acordo com os meus testes, substituir fornece melhor precisão do que a versão de dois passos removeadd. O código abaixo está em Java, mean e s get updated (global member variables), mesmo que m e s acima no post Jasons. A contagem de valores refere-se ao tamanho da janela n.

No comments:

Post a Comment