Sunday 28 May 2017

C Moving Average Algorithm


Eu sei que isso é viável com o impulso de acordo com: Mas eu realmente gostaria de evitar o uso de impulso. Eu mencionei e não encontrei nenhum exemplo adequado ou legível. Basicamente eu quero acompanhar a média móvel de um fluxo contínuo de um fluxo de números de ponto flutuante usando os números 1000 mais recentes como uma amostra de dados. Qual é a maneira mais fácil de conseguir isso, experimentei usar uma matriz circular, uma média móvel exponencial e uma média móvel mais simples e descobriu que os resultados da matriz circular correspondiam melhor às minhas necessidades. 12 de junho 12 às 4:38 Se suas necessidades são simples, você pode tentar usar uma média móvel exponencial. Simplificando, você faz uma variável de acumulador e, conforme seu código examina cada amostra, o código atualiza o acumulador com o novo valor. Você escolhe um alfa constante que está entre 0 e 1, e calcula isso: Você só precisa encontrar um valor de alfa onde o efeito de uma determinada amostra dura apenas cerca de 1000 amostras. Hmmm, na verdade, não tenho certeza de que isso é adequado para você, agora que eu coloquei aqui. O problema é que 1000 é uma janela bastante longa para uma média móvel exponencial. Não tenho certeza se houver um alfa que espalhe a média nos últimos 1000 números, sem fluxo inferior no cálculo do ponto flutuante. Mas se você quisesse uma média menor, como 30 números ou mais, esta é uma maneira muito fácil e rápida de fazê-lo. Respondeu 12 de junho 12 às 4:44 1 na sua postagem. A média móvel exponencial pode permitir que o alfa seja variável. Então isso permite que ele seja usado para calcular médias base de tempo (por exemplo, bytes por segundo). Se o tempo decorrido desde a última atualização do acumulador for superior a 1 segundo, você deixa alfa ser 1.0. Caso contrário, você pode deixar o alfa ser (usecs desde a última atualização1000000). Ndash jxh 12 de junho 12 às 6:21 Basicamente eu quero acompanhar a média móvel de um fluxo contínuo de um fluxo de números de ponto flutuante usando os 1000 números mais recentes como amostra de dados. Observe que as atualizações abaixo atualizam o total como elementos como adicionados substituídos, evitando a passagem O (N) dispendiosa para calcular a soma - necessária para a demanda média. Total é feito um parâmetro diferente de T para suportar, e. Usando um longo tempo quando totalizando 1000 long s, um int para char s, ou um duplo para float total s. Isso é um pouco falho em que numsamples poderia ultrapassar o INTMAX - se você se importar, você poderia usar um sinal não assinado por muito tempo. Ou use um membro adicional de dados do bool para gravar quando o recipiente é preenchido pela primeira vez ao andar de bicicleta numsamples em torno da matriz (o melhor que renomeou algo inócuo como pos). Respondeu 12 de junho 12 às 5:19 um assume que quotvoid operator (T sample) quot é realmente quotvoid operatorltlt (T sample) quot. Ndash oPless Jun 8 14 às 11:52 oPless ahhh. Bem visto. Na verdade, eu quis dizer que ele seria um operador vazio () (amostra T), mas é claro que você poderia usar qualquer notação que você gostasse. Vou consertar, obrigado. Ndash Tony D 8 de junho 14 às 14: 27 É possível implementar uma média móvel em C sem a necessidade de uma janela de amostras Achei que posso otimizar um pouco, escolhendo um tamanho de janela que seja um poder de dois para permitir o bit - shifting em vez de dividir, mas não precisar de um buffer seria bom. Existe uma maneira de expressar um novo resultado de média móvel apenas como função do resultado antigo e da nova amostra. Definir um exemplo de média móvel, em uma janela de 4 amostras para ser: Adicionar nova amostra e: Uma média móvel pode ser implementada de forma recursiva , Mas para uma computação exata da média móvel você deve lembrar a amostra de entrada mais antiga na soma (ou seja, 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 de forma recursiva, então você sempre precisa se lembrar da amostra xn-N para calcular (2). Conforme indicado por Conrad Turner, você pode usar uma janela exponencial (infinitamente longa) em vez disso, o que permite calcular a saída apenas da saída passada e da entrada atual: mas esta não é uma média móvel padrão (não ponderada), mas exponencialmente Média móvel ponderada, onde as amostras no passado obtêm um peso menor, mas (pelo menos em teoria) você nunca esquece nada (os pesos ficam menores e menores para amostras no passado). Eu implementei uma média móvel sem memória de item individual para um programa de rastreamento de GPS que escrevi. Comece com 1 amostra e divida em 1 para obter o valor médio atual. Em seguida, adicione uma amostra e divida em 2 para a média atual. Isso continua até chegar ao comprimento da média. Cada vez, adiciono na nova amostra, obtenho a média e retire essa média do total. Eu não sou um matemático, mas isso pareceu uma boa maneira de fazê-lo. Achei que isso tornaria o estômago de um verdadeiro matemático, mas, é uma das maneiras aceitas de fazê-lo. E funciona bem. Basta lembrar que, quanto mais alto for seu comprimento, mais lento seguirá o que deseja seguir. Isso pode não ser importante na maioria das vezes, mas ao seguir os satélites, se você estiver lento, a trilha pode estar longe da posição atual e parecerá ruim. Você poderia ter uma lacuna entre o Sáb e os pontos de fuga. Eu escolhi um comprimento de 15 atualizado 6 vezes por minuto para obter um alisamento adequado e não chegar muito longe da posição real de SAT com os pontos de trilhos alisados. Respondeu 16 de novembro 16 às 23:03 inicialize o total 0, count0 (cada vez que vê um novo valor) Então uma entrada (scanf), um add totalnewValue, um incremento (contagem), uma média de divisão (quantidade total) Esta seria uma média móvel em relação a Todas as entradas Para calcular a média apenas nas últimas 4 entradas, seria necessário 4 variáveis ​​de entrada, talvez copiando cada entrada para uma variável de entrada mais antiga e, em seguida, calculando a nova média móvel. Como soma das 4 variáveis ​​de entrada, divididas por 4 (o turno direito 2 seria Bom, se todas as entradas fossem positivas para que o cálculo médio fosse respondido em 3 de fevereiro de 15 às 4:06 Isso realmente calculará a média total e NÃO a média móvel. À medida que a contagem aumenta, o impacto de qualquer nova amostra de entrada se torna ndash extremamente lento Hilmar Feb 3 15 às 13:53 Sua resposta 2017 Stack Exchange, algoritmo IncC para média móvel exponencial de latência zero Última modificação: 2012-08-13 Tenho tentado implementar um corte de baixa freqüência em c que essencialmente leva um fluxo de números e smoo A saída dos resultados (filtragem do movimento de alta freqüência), no entanto, é importante que os números ponderados da frente sejam considerados imediatamente, pois os dados são críticos no tempo (é controlar uma base de simulação de movimento usando o resultado de um software de jogo). Eu tenho um algoritmo de média móvel ponderada trabalhando, mas poderia fazer com algo um pouco mais responsivo no front-end, e eu achei isso: - O pseudo-código é o seguinte: Entradas: Preço (NumericSeries), Periodo (NumericSimple) Variáveis: Fator (0), lag (0) se CurrentBar lt 1 começar ZLEMA Fator de preço 2 (Período1) atraso (Período-1) 2 final, então, começar Fator ZLEMA (2Preço-Pricelag) (1 fator) ZLEMA1 fim Eu traduzi isso em Para C e meu código é o seguinte: No entanto, ele não parece se comportar bem como espero. Parece estar quase lá, mas às vezes eu recebo um valor ligeiramente inferior ao de todos os itens na fila (quando eles são todos mais altos). Minha fila e o número de itens nele são passados ​​como parâmetros, sendo o mais recente na frente em todos os momentos, também passo um contador de incrementos a partir de 0, conforme exigido pela função. Eu não tenho certeza de que interpretei o significado do ZLEMA1 corretamente, pois não está claro em seu pseudocódigo, então eu considerei que isso é o último zlema de chamadas e também suponho que o preço realmente significa Price0. Talvez eu tenha feito isso errado. Eu deveria estar copiando os valores calculados zlema reais de volta para minha fila original antes da próxima chamada. Eu não mudo a fila original, exceto simplesmente deslocando todos os valores um para o final e inserindo o último no começo . O código que eu uso para fazer isso é: ficaria extremamente agradecido se alguém com uma melhor compreensão da matemática pudesse sanar a sanidade verifique isso para mim para ver se eu tenho algo um pouco errado. Agradeço muito com antecedência se você puder ajudar. Em primeiro lugar, agradeço tudo por Sua contribuição, muito apreciada. Isso faz sentido, acho, então suponho que o melhor que eu possa esperar é simplesmente uma média móvel exponencial, aceitando que haverá um pouco de atraso, mas isso será minimizado pela ponderação frontal mais pesada do que a dada em tipical ponderada Média móvel também tenho esse algoritmo, mas um problema semelhante na medida em que os valores não parecem bastante corretos (a menos que esta seja a natureza da fórmula). Por exemplo, diga que minha matriz contém 16 valores, todos os 0.4775 - a saída é 0.4983, mas espero que seja 0.4775 Isso parece diretamente para você. Média móvel exponencial. Float ema (float vals, int numVals, int currentSample) static float factor 0 static float lastema 0 float ema if (currentSample lt 1) ema vals0 factor 2.0 ((float) numVals) 1.0) else ema (factor vals0) ((1.0 - factor) lastema) lastema ema return ema Inversamente, as vezes a saída é inferior a todas e cada uma das entradas, mesmo que todas sejam mais altas. É chamado da mesma maneira que zlema (.) Acima, com um contador de incremento. A fórmula e o pseudocódigo para este estão aqui: - autotradingstrategy. wordpress20091130exposential-moving-average Obrigado novamente, desculpas pelo meu mal-entendido de alguns dos conceitos básicos: (Atenciosamente, Chris J Quanto ao código que postei, você está certo sobre o tamanho da matriz Situação. Isso deve ser facilmente corrigido. Quanto às suas perguntas: 1) A constante do filtro representa um corte de freqüência. Utilizei um Processamento de Sinal Digital (DSP) para esta técnica. En. wikipedia. orgwi kiLow-pas sfilter é uma explicação simples. Você quer a seção Realização de Tempo Discreto. No meu caso, o A é o RC-Constant de que falam. Portanto, a freqüência que ele corta é acima de 1 (2piA). Se você não tem uma compreensão da teoria do domínio de freqüência, isso pode se tornar complicado. No seu caso, quanto maior você fizer A, menor será a frequência que este filtro permitirá, o que significa que irá suavizar a curva mais e mais. Quanto mais baixo você conseguir, mais ruído é permitido no sistema. Lembre-se de que A deve ser maior ou igual a 1 para ser efetivo. Voltei a colocar o XLS novamente, desta vez sem os números mut rand (). Ajuste a constante A e veja como quotsmoothsquot (ou filtra) as variações de alta freqüência. 2) O último ponto da matriz de entrada tem o valor mais recente. 3) O mesmo é verdadeiro para a matriz de saída. O último é o valor mais recente. 5) O NUMVALS é arbitrário. Você pode adicionar continuamente à matriz de entrada e saída, quantas vezes você quiser e não afetará o filtro. Em particular, usei 49 pontos. Mas eu posso excluir facilmente os últimos 20 e as primeiras 29 saídas permaneceriam as mesmas. A função não é baseada em quantos pontos estão sendo usados. Gostaria de mencionar que desenvolvi essa função para uma conversão única. Se você quisesse fazer uma conversão para o próximo valor, pode tentar algo mais simples (em anexo). Novamente estou enferrujado em c. Espero que isso esteja certo. A única coisa que você precisaria fornecer é a constante de entrada e filtro. Deixe-me saber se isso ajuda. Médias: média móvel em média Média média móvel simples Você é encorajado a resolver esta tarefa de acordo com a descrição da tarefa, usando qualquer idioma que você conheça. Calculando a média móvel simples de uma série de números. Crie uma função de função estatal que leva um período e retorna uma rotina que leva um número como argumento e retorna uma média móvel simples de seus argumentos até agora. Uma média móvel simples é um método para calcular uma média de um fluxo de números apenas com a média dos últimos 160 P 160 números da corrente, 160 em que 160 P 160 é conhecido como o período. Pode ser implementado chamando uma rotina de inicialização com 160 P 160 como seu argumento, 160 I (P), 160, o que deve retornar uma rotina que, quando chamada com membros individuais e sucessivos de um fluxo de números, calcula a média de (acima Para), o último 160 P 160 deles, vamos chamar este 160 SMA (). A palavra 160 160 com estado na descrição da tarefa refere-se à necessidade de 160 SMA () 160 para lembrar certas informações entre chamadas para ela: 160 O período, 160 P 160 Um recipiente ordenado de pelo menos os últimos 160 P 160 números de cada um São chamadas individuais. O 160 declarado também significa que as chamadas sucessivas para 160 I (), 160 o inicializador, 160 devem retornar rotinas separadas que 160 não 160 compartilham o estado salvo para que possam ser usadas em dois fluxos de dados independentes. Pseudo-código para uma implementação de 160 SMA 160 é: Esta versão usa uma fila persistente para manter os valores p mais recentes. Cada função retornada da média init-moving tem seu estado em um átomo que possui um valor de fila. Esta implementação usa uma lista circular para armazenar os números dentro da janela no início de cada ponteiro de iteração refere-se à célula da lista que mantém o valor simplesmente deslocando-se da janela e para ser substituído pelo valor adicionado. Usando uma edição de encerramento Atualmente, esse sma não pode ser nogc porque ele aloca um fecho no heap. Algumas análises de escape podem remover a alocação de pilha. Usando uma edição de estrutura Esta versão evita a alocação de pilha do fechamento mantendo os dados no quadro de pilha da função principal. Mesmo resultado: para evitar que as aproximações de ponto flutuante continuem empilhando e crescendo, o código poderia executar uma soma periódica em toda a matriz de fila circular. Esta implementação produz dois (função) estado de compartilhamento de objetos. É idiomático em E para separar a entrada da saída (ler da escrita) ao invés de combiná-los em um único objeto. A estrutura é a mesma que a implementação do Desvio PadrãoE. O programa elixir abaixo gera uma função anônima com um período incorporado p, que é usado como o período da média móvel simples. A função de execução lê a entrada numérica e passa para a função anônima recém-criada e, em seguida, inspeciona o resultado para o STDOUT. A saída é mostrada abaixo, com a média, seguida da entrada agrupada, formando a base de cada média móvel. Erlang possui fechamentos, mas variáveis ​​imutáveis. Então, uma solução é usar processos e uma mensagem simples passando a API baseada. As linguas Matrix têm rotinas para calcular os padrões de deslizamento para uma determinada sequência de itens. É menos eficiente para loop como nos seguintes comandos. Indica continuamente uma entrada I. Que é adicionado ao final de uma lista L1. L1 pode ser encontrado pressionando 2ND1, e significa pode ser encontrado em ListOPS Pressione ON para terminar o programa. Função que retorna uma lista contendo os dados médios do argumento fornecido Programa que retorna um valor simples em cada invocação: a lista é a média da lista: p é o período: 5 retorna a lista média: Exemplo 2: Usando o programa movinav2 (i 5) - Inicializando o cálculo da média móvel e define o período de 5 movinav2 (3, x): x - novos dados na lista (valor 3), eo resultado será armazenado na variável x e exibido movinav2 (4, x) : X - novos dados (valor 4), e o novo resultado será armazenado na variável x e exibido (43) 2. Descrição da função movinavg: variável r - é o resultado (a lista média) que será retornada variável i - é a variável índice, e aponta para o final da sub-lista a lista em média. Variável z - uma variável auxiliar A função usa a variável i para determinar quais valores da lista serão considerados no próximo cálculo médio. Em cada iteração, a variável i aponta para o último valor na lista que será usado no cálculo médio. Então, só precisamos descobrir qual será o primeiro valor na lista. Normalmente, é preciso considerar os elementos p, então o primeiro elemento será o indexado por (i-p1). No entanto, nas primeiras iterações, esse cálculo geralmente será negativo, então a seguinte equação evitará índices negativos: max (i-p1,1) ou, organizando a equação, max (i-p, 0) 1. Mas o número de elementos nas primeiras iterações também será menor, o valor correto será (índice final - iniciar índice 1) ou, organizando a equação, (i - (max (ip, 0) 1) 1) e, em seguida, , (I-max (ip, 0)). A variável z mantém o valor comum (max (ip), 0) para que o beginindex seja (z1) e o número dos itens serão (iz) mid (list, z1, iz) retornará a lista de valor que será a soma média ( .) Irá somar-lhes soma (.) (Iz) ri irá em média e armazenar o resultado no lugar apropriado na lista de resultados fp1 cria uma aplicação parcial que conserta o (neste caso) o segundo e terceiro parâmetros

No comments:

Post a Comment