Seu interior está iterando toda a matriz assim thats porque você sempre tem a mesma média (a única para toda a matriz), você deve iterar de 0 para o número atual do exterior para em vez disso. Sua média móvel está sendo atualizada com base em j de seu interior para isso significa que ele irá substituir os valores anteriores de cada novo loop, isso deve estar dentro do exterior para em vez do interior usando i como índice. Você está dividindo sum / j para calcular médias, cada novo loop interno j você vai dividir por 0 a primeira soma. Eu acredito que você pretende usar j1 em vez disso, o índice não é o mesmo que o comprimento atual Dicas para solucionar problemas: Evite usar variáveis para arrays de loop, você deve usar array. length em vez disso. Para uma questão de reproduzir seu problema, você poderia nos dar o problema isolado em vez de seu código atual. Ou seja: Imagine se o erro está em suas entradas, como poderíamos acreditar que você realmente as usou respondidas Você está looping sobre todos os dados de cada vez. Você deve ter (j) (ou algo similar) para sua média mais interna. Além disso, movingAverageisum / j deve ser modificado para lidar com o caso quando j é 0. Em particular, provavelmente deve ser movingAverageisum / averageLength e deve ser aplicado ao slot movingAveragei fora do loop de média. A próxima vez, tome os comentários sobre a atribuição fora da questão antes de publicá-la. Mas desde que você parece muito novo nisso, pense sobre como você iria passar os dados, e fazê-lo fazer isso. Você deve tentar se certificar de que cada loop está parando no ponto correto, e lembre-se que se você parar quando não há mais números, (como quando você está fazendo o loop interno e você só pode obter mais 3 números em vez de 4) O programa precisa parar também. Certifique-se de que seu código está verificando isso. Resposta Sem quaisquer detalhes adicionais, você provavelmente precisará de uma média móvel não ponderada. Em qualquer ponto Ai na matriz de entrada A de comprimento N (com 0ltiltN), isso é simplesmente a média das entradas K anteriores da matriz, até e incluindo Ai. Se não houver K tais valores, então a média dos valores (i1) de A0 a Ai. Inclusive. Um pouco de pensamento irá mostrar-lhe que você não precisa adicionar todos os valores de K cada vez. Basta manter a soma e, ao passar para o próximo ponto (esta é uma média móvel), subtraia o valor que está sendo substituído e adicione o novo valor que irá substituí-lo. (Durante os primeiros pontos K-1, basta adicionar o novo valor à soma e aumentar o contador por 1.) Em qualquer ponto desse processo, a média móvel é a soma corrente dividida pelo valor da contagem atual. Resposta Em uma média móvel, você precisa ter algum tipo de tamanho de janela. Seu tamanho de janela é averageLength, então ele será algo parecido com isto: O loop for começa nos dados atuais e retorna pontos de dados averageLength e os adiciona. Você só terá uma média móvel quando tiver você tem quando você tem pontos de dados suficientes ea média será a soma dividida pelo comprimento médio. Nota: Não testado apenas sudo código, mas esta é a idéia. Respondida Oct 4 13 at 21:05 Sua resposta 2016 Stack Exchange, Incjas. statistics. functions Classe MovingAverageArrayFunction Esta classe calcula a média do último número dado de valores em uma matriz tirada de uma fonte de dados. A função mean retorna sempre um valor duplo, então implementa a interface IDoubleSource ea IDoubleSource padrão. Descrição: biblioteca de simulação baseada em Java Agent Copyright (C) 2002 Michele Sonnessa Esta biblioteca é um software livre que você pode redistribuí-lo e / ou modificá-lo sob os termos da GNU Lesser General Public License A Licença, ou (a seu critério) qualquer versão posterior. Esta biblioteca é distribuída com a esperança de que seja útil, mas SEM NENHUMA GARANTIA, mesmo sem a garantia implícita de COMERCIALIZAÇÃO ou ADEQUAÇÃO A UM DETERMINADO PROPÓSITO. Consulte a GNU Lesser General Public License para obter mais detalhes. Você deve ter recebido uma cópia da GNU Lesser General Public License juntamente com esta biblioteca, se não, escreva para a Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307, EUA. Author: Michele SonnessaA Simples Moving Average Implementação em Java Em várias ocasiões Ive queria calcular métricas simples em minhas aplicações Java, por exemplo, o número de hits por hora, ou erros ao longo de um período de tempo. Enquanto a computação de métricas simples não é muito difícil, o seu trabalho e apenas Id extra passar esse tempo no domínio do problema. Fiquei surpreso ao não encontrar nenhuma solução amplamente aceita para métricas em Java. Eu encontrei Metrics, mas parecia um pouco complicado e não bem documentado - Tudo o que eu realmente queria era calcular uma média móvel. Eu pensei sobre o problema um pouco mais e decidiu que não é um problema difícil. Heres minha solução Isso funciona criando uma matriz de janela / tamanho de freqüência de atualização, em seguida, um segmento define a contagem para o próximo índice na matriz na freqüência de atualização. A contagem para o intervalo é simplesmente arrayi - arrayi1, que é a contagem mais recente menos a contagem mais antiga. Para um intervalo de 10 minutos, a contagem mais antiga (i1) tem exatamente 10 minutos. Para adicionar uma média móvel ao nosso primeiro código bem precisa de um contador, usando AtomicLong. Esse contador deve ser incrementado com base nos eventos que você está interessado em computação (por exemplo, solicitações POST para um serviço REST). Precisamos fornecer a implementação com acesso ao contador e que é realizado através da interface GetCount. Aqui Ill criar uma média móvel com uma janela de 5 minutos que atualiza a cada segundo. E para obter a média atual, basta chamar o método getAverage: Um detalhe de implementação chave é como o tamanho do array é determinado: dividindo a janela pela frequência de atualização. Assim, uma grande janela com freqüência de atualização freqüente pode consumir uma quantidade significativa de memória. Neste exemplo, o tamanho da matriz é 300 razoável. No entanto, se criamos uma média móvel de 24 horas com um intervalo de 1 segundo o tamanho seria 86400 A freqüência de atualização mais razoável para um período de 24 horas pode ser a cada 5 minutos (matriz de 288 ). Outra consideração de escolher a janela e atualizar freqüência é a janela deve ser divisível pela freqüência. Por exemplo, uma janela de 2 minutos com uma frequência de atualização de 6 segundos é ok, mas uma frequência de atualização de 7 segundos não é, uma vez que não é divisível por 120. Uma IllegalArgumentException é lançada se a freqüência de atualização do módulo de janela não for zero. Esta implementação requer um thread por média móvel, o que não é muito eficiente. Uma solução melhor seria compartilhar um segmento em muitas médias. Atualização. Eu atualizei o código para compartilhar um tópico aqui. Por último, há um problema de estado inicial: não temos dados ainda para toda a janela. Por exemplo, se você tem uma janela de 5 minutos e apenas 15 segundos de dados. Esta implementação retorna null até que tenhamos 5 minutos de dados. Outra abordagem é estimar a média. Suponha que temos uma contagem de 10 em 30 segundos, então podemos estimar a média como 40 em 2 minutos. No entanto, existe o risco de erro significativo pela extrapolação de dados incompletos. Por exemplo, se tivéssemos uma explosão de 20 acessos em 2 segundos, wed ser estimando 1200 por 2 minutos, o que com toda a probabilidade é maneira off. Moving Average - MA BREAKING DOWN média móvel - MA Como um exemplo SMA, considere uma segurança com Os seguintes preços de fecho durante 15 dias: Semana 1 (5 dias) 20, 22, 24, 25, 23 Semana 2 (5 dias) 26, 28, 26, 29, 27 Semana 3 (5 dias) 28, 30, 27, 29, 28 A MA de 10 dias seria a média dos preços de fechamento para os primeiros 10 dias como o primeiro ponto de dados. O ponto de dados seguinte iria cair o preço mais antigo, adicionar o preço no dia 11 e tomar a média, e assim por diante, como mostrado abaixo. Conforme mencionado anteriormente, MAs atraso ação preço atual, porque eles são baseados em preços passados quanto maior for o período de tempo para o MA, maior o atraso. Assim, um MA de 200 dias terá um grau muito maior de atraso do que um MA de 20 dias porque contém preços nos últimos 200 dias. A duração da MA a ser utilizada depende dos objetivos de negociação, com MAs mais curtos usados para negociação de curto prazo e MAs de longo prazo mais adequados para investidores de longo prazo. O MA de 200 dias é amplamente seguido por investidores e comerciantes, com quebras acima e abaixo desta média móvel considerada como sinais comerciais importantes. MAs também transmitir sinais comerciais importantes por conta própria, ou quando duas médias se cruzam. Um aumento MA indica que a segurança está em uma tendência de alta. Enquanto um declínio MA indica que ele está em uma tendência de baixa. Da mesma forma, o impulso ascendente é confirmado com um crossover de alta. Que ocorre quando um MA de curto prazo cruza acima de um MA de longo prazo. Momento descendente é confirmado com um crossover de baixa, que ocorre quando um MA de curto prazo cruza abaixo de um MA. Java mais longo prazo média móvel Se você estiver procurando por um EMA que é otimizado para streaming de dados, obtido a partir de um arquivo ou serviço de cotação , A classe de exemplo a seguir fará você multa, ao contrário de usar cálculos de força bruta. Esta abordagem é particularmente útil se você estiver processando dados em tempo real. Os EMAs, um caso especial de médias móveis ponderadas, têm o benefício de que a ponderação relativa para cada período sucessivo diminui com um fator constante f 2 / (N1), onde N é o número de períodos sobre os quais a EMA deve ser aplicada. Eman fprice (1-f) eman-1 A classe de exemplo a seguir implementa essa natureza iterativa do EMA e minimiza os requisitos computacionais sobre os parâmetros brute - Métodos de força ou métodos de pós-processamento. Private int numPeriods 0 private int totalPeriods 0 privado double runningEMA 0.0 privado double factor 0.0 público EMA (int numPeriods) this. numPeriods numPeriods factor 2.0 / (numPeriods 1.0) / Reset cálculos para gerar EMA para o período determinado. / Public void reset (int numPeriods) / Retorna EMA para o período define durante o construtor. Se os períodos processados forem inferiores ao intervalo EMA, zero será retornado. / Public double calcular (preço duplo) runningEMA factorprice (1-factor) runningEMA se (totalPeriods lt numPeriods) De onde você origina os dados de preço eo que você faz com os resultados da EMA é com você. Por exemplo, se você tivesse os dados de preço em uma matriz e deseja calcular uma EMA em outra matriz, o snippet a seguir funcionará: os preços duplos. (50) // 50 EMA período para (int idx0 iltprices. length idx) emaidx ema (pricesidx) Boa sorte e os melhores votos para o seu projeto .
No comments:
Post a Comment