Sunday 6 August 2017

Média Móvel Ponderada C


Estou tentando calcular a média móvel de um sinal. O valor do sinal (um duplo) é atualizado em horários aleatórios. Estou procurando uma maneira eficiente de calcular sua média ponderada no tempo ao longo de uma janela de tempo, em tempo real. Eu poderia fazê-lo sozinho, mas é mais desafiante do que eu pensava. A maioria dos recursos que encontrei através da internet calculam a média móvel do sinal periódico, mas as atualizações das minas em tempo aleatório. Alguém conhece bons recursos para isso. O truque é o seguinte: você obtém atualizações em horários aleatórios através de atualização vazia (tempo int, valor flutuante). No entanto, você também precisa acompanhar quando uma atualização cai na janela de tempo, de modo que você configure um alarme chamado no momento N, que remove a atualização anterior de ser novamente considerado novamente na computação. Se isso acontecer em tempo real, você pode solicitar o sistema operacional para fazer uma chamada para um método void dropoffoldestupdate (int time) para ser chamado no tempo N Se esta é uma simulação, você não pode obter ajuda do sistema operacional e você precisa Faça-o manualmente. Em uma simulação, você chamaria métodos com o tempo fornecido como um argumento (que não se correlaciona com o tempo real). No entanto, uma suposição razoável é que as chamadas são garantidas de tal forma que os argumentos de tempo estão aumentando. Neste caso, você precisa manter uma lista ordenada de valores de hora do alarme e, para cada atualização e leitura, você verifica se o argumento de tempo é maior que o cabeçalho da lista de alarmes. Embora seja maior, você faz o processamento relacionado ao alarme (abandone a atualização mais antiga), remova a cabeça e verifique novamente até que todos os alarmes anteriores ao tempo fornecido sejam processados. Em seguida, faça a chamada de atualização. Tenho até agora assumido que é óbvio o que você faria para a computação real, mas vou elaborar apenas no caso. Eu suponho que você tenha um método flutuante lido (int time) que você usa para ler os valores. O objetivo é tornar este chamado tão eficiente quanto possível. Então você não calcula a média móvel sempre que o método de leitura é chamado. Em vez disso, você precomputa o valor a partir da última atualização ou o último alarme, e ajuste esse valor por algumas operações de ponto flutuante para explicar a passagem do tempo desde a última atualização. (I. E. Um número constante de operações, exceto para talvez processar uma lista de alarmes empilhados). Esperemos que isso seja claro - este deve ser um algoritmo bastante simples e bastante eficiente. Otimização adicional. Um dos problemas restantes é se um grande número de atualizações acontecerem dentro da janela de tempo, então há muito tempo para o qual não há leituras nem atualizações e, em seguida, uma leitura ou atualização vem junto. Nesse caso, o algoritmo acima será ineficiente ao atualizar de forma incremental o valor de cada uma das atualizações que está caindo. Isso não é necessário, porque nós só nos preocupamos com a última atualização além da janela de tempo, então, se houver uma maneira de descartar todas as atualizações mais antigas, isso ajudaria. Para fazer isso, podemos modificar o algoritmo para fazer uma pesquisa binária de atualizações para encontrar a atualização mais recente antes da janela de tempo. Se houver relativamente poucas atualizações que precisam ser descartadas, pode-se incrementar o valor para cada atualização descartada. Mas se houver muitas atualizações que precisam ser descartadas, pode-se recalcular o valor a partir do zero depois de deixar as atualizações antigas. Apêndice em Computação Incremental: Devo esclarecer o que quero dizer pela computação incremental acima na frase ajustar esse valor por um par de operações de ponto flutuante para explicar a passagem do tempo desde a última atualização. Computação inicial não incremental: então iterar sobre os atuais relevantes em ordem crescente de tempo: tempo de exibição de motionaverage (sum tempo de atraso). Agora, se exatamente uma atualização cai fora da janela, mas nenhuma nova atualização chegou, ajuste a soma como: (note que é priorupdate, que tem seu timestamp modificado para iniciar o início da última janela). E se exatamente uma atualização entrar na janela, mas nenhuma nova atualização cair, ajuste a soma como: Como deve ser óbvio, este é um esboço áspero, mas espero que mostre como você pode manter a média de que é O (1) operações por atualização Em uma base amortizada. Mas observe uma otimização adicional no parágrafo anterior. Observe também as questões de estabilidade aludidas em uma resposta mais antiga, o que significa que os erros de ponto flutuante podem se acumulam em um grande número dessas operações incrementais, de modo que existe uma divergência com o resultado da computação total que é significativa para o aplicativo. Se uma aproximação é OK e há um tempo mínimo entre amostras, você pode tentar super-amostragem. Tenha uma matriz que represente intervalos de tempo uniformemente espaçados que sejam menores do que o mínimo, e em cada período de tempo armazene a última amostra que foi recebida. Quanto menor o intervalo, mais próxima será a média para o valor verdadeiro. O período não deve ser superior a metade do mínimo ou há uma chance de perder uma amostra. Respondeu 15 de dezembro às 18:12 respondido 15 de dezembro às 22:38 Obrigado pela resposta. Uma melhoria que seria necessária para que o quotcachequot fosse o valor da média total, de modo que não estivemos todos os dias. Além disso, pode ser um ponto menor, mas não seria mais eficiente usar um deque ou uma lista para armazenar o valor, já que assumimos que a atualização virá na ordem correta. A inserção seria mais rápida do que no mapa. Ndash Arthur 16 de dezembro 11 às 8:55 Sim, você pode armazenar em cache o valor da soma. Submeta os valores das amostras que você apaga, adicione os valores das amostras que você inseriu. Além disso, sim, um dequeltpairltSample, Dategtgt pode ser mais eficiente. Eu escolhi o mapa para a legibilidade e a facilidade de invocar o mapa :: upperbound. Como sempre, escreva o código correto primeiro, depois faça o perfil e mude as mudanças incrementais. Ndash Rob Dec 16 11 at 15:00 Nota: Aparentemente, esta não é a maneira de abordar isso. Deixando-o aqui para referência sobre o que está errado com essa abordagem. Verifique os comentários. ATUALIZADO - com base no comentário Olis. Não tenho certeza sobre a instabilidade de que ele está falando. Use um mapa ordenado de tempos de chegada contra valores. Após a chegada de um valor, adicione a hora de chegada ao mapa ordenado juntamente com seu valor e atualize a média móvel. Advertindo isso é pseudo-código: aí. Não totalmente elaborado, mas você consegue a ideia. Coisas a serem observadas. Como eu disse, o acima é pseudo-código. Você precisará escolher um mapa apropriado. Não remova os pares conforme você itera, pois você invalidará o iterador e terá que começar de novo. Veja o comentário Olis abaixo também. Respondeu 15 de dezembro às 12:22 Isso não funciona: ele não leva em consideração a proporção do comprimento de janela de cada valor para. Além disso, essa abordagem de adicionar e depois subtrair é apenas estável para tipos inteiros, não flutuadores. Ndash Oliver Charlesworth 15 de dezembro às 12:29 OliCharlesworth - desculpe, perdi alguns pontos-chave na descrição (dupla e ponderada no tempo). Vou atualizar. Obrigado. Ndash Dennis 15 de dezembro 11 às 12:33 A ponderação do tempo é mais um problema. Mas isso não é o que eu estou falando. Eu estava me referindo ao fato de que quando um novo valor primeiro entra na janela de tempo, sua contribuição para a média é mínima. Sua contribuição continua a aumentar até um novo valor entrar. Ndash Oliver Charlesworth 15 de dezembro 11 às 12: 35 Meu objetivo é obter uma média ponderada de uma tabela, com base em outra tabela de chave primária. Eu preciso obter uma média ponderada com base no comprimento de um segmento e preciso ignorar valores de -1. Eu sei como fazer isso no SQL, mas meu objetivo é fazer isso no LINQ. Parece algo assim no SQL: ainda sou muito novo para o LINQ e tenho dificuldade em descobrir como eu traduziria isso. A média ponderada do resultado deve chegar a cerca de 55,3. Obrigado. Perguntei 26 de abril 10 às 15:23 Eu faço isso o suficiente para criar um método de extensão para o LINQ. Depois de obter o seu subconjunto de dados, a chamada parece assim. Isso se tornou extremamente útil porque eu posso obter uma média ponderada de qualquer grupo de dados com base em outro campo dentro do mesmo registro. Verifique agora a divisão por zero e lance uma exceção mais detalhada em vez de retornar 0. Permite que o usuário capture a exceção e manipule conforme necessário. Se você está certo de que, para cada chave estrangeira na Tabela 2, há um registro correspondente na Tabela 1, então você pode evitar a junção apenas fazendo um grupo. Nesse caso, a consulta LINQ é assim: é assim que você pode obter a média de uma chave estrangeira específica. O método ToList chamado ao buscar os registros é evitar a execução da consulta duas vezes, ao mesmo tempo em que agrega os registros nas duas operações de Soma separadas. Journey Energy Inc (JOY) Atualizado para Desempenho por AltaCorp Capital AltaCorp Capital atualizou ações da Journey Energy Inc (TSE: JOY) de um setor de classificação de desempenho para uma classificação de desempenho superior em uma nota de pesquisa emitida aos investidores na segunda-feira de manhã. Uma série de outros analistas de pesquisa de ações também pesaram em JOY. O CIBC aumentou seu preço-alvo na Journey Energy de C2.25 para C2.75 em uma nota de pesquisa na quarta-feira, 19 de outubro. A Canaccord Genuity aumentou seu preço-alvo na Journey Energy de C2.50 para C2.75 e deu à empresa uma classificação de compra especulativa em uma nota de pesquisa na quarta-feira, 12 de outubro. Journey Energy (TSE: JOY) abriu às 3h23 na segunda-feira. O estoque tem um preço médio móvel de 50 dias de 2,77 e um preço médio móvel de 200 dias de 2,13. A empresa possui um limite de mercado de 141,12 milhões e uma relação preço / lucro de 3,45. Journey Energy tem uma baixa de 12 meses de 0,91 e uma alta de 12,25 meses de 3,25. AVISO DE VIOLAÇÃO DE DIREITOS AUTORAIS: 8220Journey Energy Inc (JOY) Atualizado para o Outperform por AltaCorp Capital8221 foi relatado pela primeira vez pelo Mideast Time e é propriedade da Mideast Time. Se você estiver acessando este conteúdo em outra publicação, ele foi copiado ilegalmente e republicado em violação da legislação internacional sobre marcas registradas e direitos autorais. A versão correta deste conteúdo pode ser lida no mideasttimejourney-energy-inc-joy-upgrade-to-outperform-by-altacorp-capital1478473.html. Sobre Journey Energy Journey Energy Inc (Journey) é uma empresa de produção e exploração baseada no Canadá. A Companhia dedica-se à exploração, desenvolvimento e produção de petróleo e gás natural na Bacia Sedimentar do Canadá Ocidental. A Companhia está focada em operações convencionais, ponderadas pelo petróleo, no oeste do Canadá. A Região Central Journey8217s está localizada a oeste de Edmonton. Receba novidades para Journey Energy Inc Daily - Digite seu endereço de e-mail abaixo para receber um resumo diário conciso das últimas novidades e avaliações de analistas para Journey Energy Inc e empresas relacionadas com o boletim informativo diário GRATUITO do MarketBeats.

No comments:

Post a Comment