Seu interno 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 sumj para calcular médias, cada novo laço interno j você dividirá por 0 a primeira soma. Eu acredito que você pretendia 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 o 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 usou respondidas? Você está looping sobre todos os dados de cada vez. Você deve ter para (int j (igtaverageLengthi-averageLength2: 0) jlt iaverageLength2 ampamp jltnumDataPoints j) (ou algo semelhante) para a sua média innermost. Além disso, movingAverageisumj deve ser modificado para lidar com o caso quando j é 0. Em particular, provavelmente deve ser movingAverageisumaverageLength e deve ser aplicado ao slot movingAveragei fora do loop de média. Respondido Oct 4 13 at 20:42 Da 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 certificar-se 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 o seu código está a verificar. 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 o código sudo, mas esta é a idéia. 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 seguinte classe exemplo vai fazer você bem, como Contrária ao uso de 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 durante os quais a EMA deve ser aplicada. Eman fprice (1-f) eman-1 A classe de exemplo a seguir implementa essa natureza iterativa de EMA e minimiza os requisitos de computação em relação a brute - 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) Redefinir 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 if (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. Fonte de cálculos, arquivo ou serviço de cotação duplo ema novo doubleprices. length EMA ema novo EMA (50) 50 EMA período para (int idx0 iltprices. length idx) emaidx ema (pricesidx) Boa sorte e melhores votos para o seu project. Cloudera Blog de Engenharia Moderação Média Simples, Classes Secundárias e MapReduce (Parte 3) Esta é a peça final para uma série de blog de três partes. Se você gostaria de ver as partes anteriores desta série, por favor use o seguinte link: Anteriormente eu expliquei como usar o Excel e R como as ferramentas de análise para calcular a Média Móvel Simples de um pequeno conjunto de preços de fechamento de ações. Nesta peça final para a série de blog de três partes, vou aprofundar usando MapReduce para encontrar a média móvel simples de nosso pequeno conjunto de dados de amostra. Então, vou mostrar-lhe como usando o mesmo código, você será capaz de calcular a média móvel simples de cada preço de fechamento das ações desde 1980. Abaixo do buraco de coelho com Hadoop Nos exemplos acima nós demos uma olhada no cálculo da média móvel simples De uma quantidade relativamente pequena de dados. Para um monte de análise, excel e R são ferramentas muito eficazes, mas à medida que escalamos para gigabyte, terabyte e petabyte armazena dados que correm em alguns problemas com localidade de dados, velocidades de disco e velocidades de processamento. Para ilustrar esses fatores, podemos usar uma máquina mítica que possuía um único disco de 1 petabyte, que funcionava de forma semelhante às velocidades de disco atualmente. Para os propósitos deste exemplo bem usar uma velocidade de leitura de 40 MBs. Vamos dizer que é nosso trabalho para digitalizar através destes dados e produzir uma média móvel simples, o processador não impede o cálculo, e podemos sustentar um cálculo de janela em movimento através dos dados no total de 40 MBs. Vamos também assumir que os dados foram previamente classificados e que só tivemos de realizar uma varredura seqüencial que maximiza a taxa de transferência de dados a partir do disco e que poderia consistentemente entregar 40MBs para o pipeline de processamento. Baseado em Jeff Deans 12 Números Cada engenheiro deve saber slide este é uma configuração plausível. Nessa taxa, nosso cálculo de média móvel simples de 1 petabyte de dados levaria cerca de 310 dias para ser concluído. Para a maioria das situações, este custo operacional, em termos de tempo, torna pouco razoável considerar. Felizmente, a mecânica de HDFS e MapReduce mitigar esses fatores de tal forma que podemos fazer este problema um tempo linear e função de capital para nos ajudar a decidir o número de máquinas que queremos implementar de forma eficiente realizar esta varredura de média móvel simples. No exemplo de média móvel simples acima, negligenciamos considerar as restrições de: Armazenar o petabyte de dados em hardware não-mítico. Classificando o petabyte de dados. Considerando falha de hardware durante os 310 dias de tempo de processamento. Normalmente, as aplicações de séries temporais precisam de digitalizar os dados em algum momento, o que cria grandes montanhas para subir, se quisermos abordar grandes volumes de dados de séries temporais nos sistemas atuais. Estavam vendo multi-terabyte e multi-petabyte fontes de dados no domínio de série de tempo todos os dias, incluindo e em cada um desses domínios o cenário acima é um desafio muito real para enfrentar. HDFS resolve os problemas de armazenamento e falha acima, mas o que acontece com os problemas de classificação e processamento? Separar grandes quantidades de dados em si é um problema não trivial, mas é acessível com alguns truques no MapReduce. Vamos dar uma olhada no código MapReduce real que podemos baixar para compilar e produzir nossa própria média móvel escalável simples, para resolver alguns desses pontos de dor. Média móvel simples em MapReduce Normalmente, um aplicativo MapReduce é composto de duas funções: (você adivinhou) uma função de mapa e uma função de redução. No mundo da programação em Java criamos uma classe de mapa e uma classe de redução, cada uma com métodos herdados úteis para seus propósitos respeitosos. Usamos o modelo de programação MapReduce porque ele é construído para mitigar problemas de concorrência em nossos algoritmos e obtemos nosso paralelismo escalável relativamente sem dor. A função de mapa pode envolver o código que executa uma operação de par por valor-chave, mas sua principal operação lógica é agrupar dados por chaves. Uma maneira muito fácil de pensar sobre uma função de mapa é pensar nela como uma projeção lógica dos dados ou uma cláusula por grupo. A função de redução é usada para levar esses grupos (individualmente) e executar um processo entre os valores que foram agrupados. Operações comuns em funções de redução incluem: Em nosso exemplo de média móvel simples, no entanto, não operamos especificamente em uma base por valor, nem produzimos um agregado em todos os valores. Nossa operação no sentido agregado envolve uma janela deslizante, que executa suas operações em um subconjunto dos dados em cada etapa. Também temos que considerar que os pontos em nossos dados de séries temporais não são garantidos para chegar à redução em ordem e precisam ser classificados em seções anteriores. Isso ocorre porque com múltiplas funções de mapa lendo várias seções dos dados de origem, MapReduce não impõe nenhuma ordem nos pares de valores-chave agrupados nos esquemas de partição e de classificação padrão. Há o cenário onde temos dados particionados classificados, mas para o bem deste exemplo foram indo para lidar com o mais jardim-variedade dados de série de tempo não ordenados. Deixa para fazer exame de um primeiro passo em como nós poderíamos projetar este trabalho simples médio movente de MapReduce. Queremos agrupar todos os valores ajustados ajustados de ações para que possamos aplicar a operação de média móvel simples nos dados de séries temporais classificadas. Queremos emitir cada um dos pares de valores-chave da série de tempo, codificados em um símbolo de estoque, para agrupar esses valores. Na fase de redução podemos executar uma operação, aqui a média móvel simples, sobre os dados. Uma vez que os dados mais do que provavelmente não vai chegar ao redutor na ordem ordenada bem necessidade de classificar os dados antes de podermos calcular a média móvel simples. Uma maneira comum de classificar dados é carregar os dados na memória em uma estrutura de dados, como um heap, bem como como isso é feito em um programa java normal. Neste caso, use a classe de filas de prioridade do Javas para classificar nossos dados. Também precisamos considerar a quantidade de memória usada pelos dados da série de tempo de entrada durante a classificação, pois este é um fator limitante na quantidade de dados que podemos classificar. Neste projeto, temos de carregar todos os dados da série de tempo antes que possamos iniciar o processamento e se a quantidade de dados para classificar exceder o tamanho de heap disponível, temos um problema. Um exemplo desta implementação está hospedado no github: Para executar este código em seu próprio cluster Hadoop, faça o download do CDH do Cloudera e configure um cluster pseudo-distribuído 8211 que é um único nó do Hadoop. Pseudo-modo distribuído é uma ótima maneira de experimentar código com Hadoop. Em seguida, faça o download e compile o código da média móvel em um jar. Para baixar o código diretamente do github (no shell no MacOSX, janela do terminal ssh no linux, ou MINGW32 para win32) we8217ll usar o comando: Nossa primeira passagem é uma solução decente, mas foram limitados pela nossa máquina Java Virtual Machine (JVM) Heap tamanho e estamos tendo tempo para manualmente ordenar os dados nós mesmos. Com algumas mudanças de design, podemos resolver ambos os problemas aproveitando algumas propriedades inerentes do MapReduce. Primeiro, queremos olhar para o caso de classificar os dados na memória em cada redutor. Atualmente, temos de nos certificar de que nunca enviamos mais dados para um único redutor do que pode caber na memória. A maneira que podemos atualmente controlar isso é dar a cada criança redutor JVM mais heap andor ou mais para particionar nossos dados de séries de tempo na fase de mapa. Neste caso, partição wed mais pelo tempo, quebrando nossos dados em janelas menores do tempo. Em oposição a uma maior partição dos dados, outra abordagem para este problema é permitir que o Hadoop classifique os dados para nós no que é chamado de fase shuffle do MapReduce. Se os dados chegam a um redutor já em ordem ordenada, podemos diminuir a pegada de memória e reduzir o número de loops através dos dados, observando somente as N amostras seguintes para cada cálculo de média móvel simples. Isso nos leva ao aspecto crucial deste artigo, que é chamado de shuffles secundário mecânico de classificação. Classificar é algo que podemos deixar Hadoop fazer por nós e Hadoop tem provado ser muito bom em classificar grandes quantidades de dados, ganhando a competição Grey Sort em 2008. Ao usar o mecânico de classificação secundário, podemos resolver tanto as nossas questões heap e classificar de forma bastante simples E eficientemente. Para empregar o tipo secundário em nosso código, precisamos fazer a chave um composto da chave natural eo valor natural. Abaixo, na Figura 1, vemos um diagrama de como isso ficaria visualmente. Figura 1: Diagrama de Teclado Composto A Tecla Composto dá ao Hadoop as informações necessárias durante o shuffle para executar uma classificação não apenas no 8220stock symbol8221, mas também no carimbo de data / hora. A classe que classifica essas teclas composites é chamada de comparador chave ou aqui 8220CompositeKeyComparator8221. O comparador chave deve ordenar pela chave composta, que é a combinação da chave natural e do valor natural. Podemos ver abaixo na Figura 2 onde uma versão abstrata do tipo secundário está sendo executada em uma chave composta de 2 inteiros. Figura 2: CompositeKeyComparator classificando Composite Keys (teclas são inteiros). Na Figura-3 abaixo vemos um exemplo mais realista onde we8217ve mudou a Chave Composta para ter uma seqüência de símbolo de estoque (K1) e um timestamp (K2, exibido como uma data, mas no código é um longo em ms). O diagrama classificou os pares KV tanto por 8220K1: símbolo de estoque8221 (chave natural) e 8220K2: marca de tempo8221 (chave secundária). Figura 3: CompositeKeyComparator no trabalho em nossas chaves compostas. A chave composta agora é representada com um símbolo de estoque de cordas (K1) e uma data (K2). Uma vez que nós classificamos nossos dados na chave composta, agora precisamos dividir os dados para a fase de redução. Na Figura 4 abaixo vemos como os dados da Figura 3 acima foram particionados com o NaturalKeyPartitioner. Figura 4: Particionamento pela chave natural com o NaturalKeyPartitioner. Uma vez que we8217ve particionou nossos dados, os redutores agora podem começar a baixar os arquivos de partição e iniciar sua fase de mesclagem. Inf Figura 5 abaixo veremos como o comparador de agrupamento, ou NaturalKeyGroupingComparator, é usado para garantir que uma chamada de reduce () veja apenas os dados logicamente agrupados significados para essa chave composta. Figura 5: Agrupando Comparator mesclando arquivos de partição. O comparador e o comparador de agrupamento para a chave composta devem considerar apenas a chave natural para particionamento e agrupamento. Abaixo está uma breve descrição do código Simple Moving Average que é alterado para usar o tipo secundário e é hospedado no github. Se você notar, os nomes das classes correspondem à terminologia usada nos diagramas acima e em Tom Whites Hadoop: O Guia Definitivo (capítulo 8 MapReduce Recursos) para tornar o código mais fácil de entender. NaturalKey 8211 o que você normalmente usaria como a chave ou grupo por operador. Neste caso, a Chave Natural é o símbolo de grupo ou de ações, pois precisamos agrupar dados de estoque potencialmente não ordenados antes de podermos classificá-los e calcular a média móvel simples. Composite Key 8211 Uma chave que é uma combinação da chave natural e do valor natural que queremos classificar por. 5 respostas em ldquo Simple Moving Average, Secundário Sort, e MapReduce (Parte 3) rdquo Cool truque com o split sorterpartitioner. Tanto quanto eu posso dizer isto trabalha grande até que a série se torne extremamente longa (pense 30 anos de dados do nível do carrapato) 8211 parece como particionar pelo tempo pode ser muito complicado. Você sabe de alguma coisa construída no hadoop como um particionador que pode cuspir os mesmos dados em várias partições que eu experimentei com mapeadores que duplicam valores em várias chaves, mas eu me pergunto se existe uma maneira mais convencional de fazer isso. Evan, Você está morto com o tamanho dos dados em um único espaço de teclas. Eu bati este mesmo problema quando trabalhando no projeto openPDC para o NERC: Um sensor poderia ter literalmente bilhões de pontos em um período muito curto de tempo, por isso, para trabalhos de protótipo nós coisas chaveado para um único dia (3.600.000ms): Em um mais Versão complexa eu teria usado sobreposição de slots de tempo para que o mapeador obteria dados suficientes de keyspaces adjacentes para cobrir um único comprimento de janela. Por enquanto, I8217d diz que você está no caminho certo com os valores duplicados. Eu sei que isso não está relacionado a médias móveis, mas quão preciso foi a série de tempo SAX correspondência usado no PDC eu implementado algo como isso (exceto usando o MapReduce API 2), e no loop da função reduce (), sempre que o. Next () método é chamado no Iterator, obtemos um novo valor, mas a chave também milagrosamente muda. Em vez disso, a parte da chave composta que não foi usada como uma chave natural (o timestamp neste exemplo) muda. Isso foi bastante surpreendente. Como isso acontece Postagem de navegação Adotando o Apache Hadoop no Governo Federal Médias Médias médias simplesUma média móvel simples Você é encorajado a resolver esta tarefa de acordo com a descrição da tarefa, usando qualquer linguagem que você conheça. Calculando a média móvel simples de uma série de números. Crie um functioncloisstance stateful 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�ia m�el simples �um m�odo para calcular uma m�ia de uma corrente de n�eros calculando apenas a m�ia dos �timos n�eros de 160 P 160 a partir da corrente 160, em que 160 P 160 �conhecido como o per�do. Ele pode ser implementado chamando uma rotina de iniciação com 160 P 160 como argumento, 160 I (P), 160 que deve retornar uma rotina que, quando chamada com membros individuais, sucessivos de um fluxo de números, calcula a média de Para), os últimos 160 P 160 deles, permite chamar este 160 SMA (). A palavra 160 stateful 160 na descrição da tarefa refere-se à necessidade de 160 SMA () 160 lembrar certas informações entre as chamadas para ela: 160 O período, 160 P 160 Um contêiner ordenado de pelo menos os últimos 160 P 160 números de cada um dos Suas chamadas individuais. Stateful 160 também significa que chamadas sucessivas para 160 I (), 160 o inicializador, 160 devem retornar rotinas separadas que não 160 não 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 conter os valores p mais recentes. Cada função retornada de init-moving-average tem seu estado em um átomo contendo 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 de lista que contém o valor apenas movendo para fora da janela e para ser substituído com o valor apenas adicionado. Usando um fechamento editar Atualmente, este sma não pode ser nogc porque ele aloca um encerramento no heap. Alguma análise de escape pode remover a alocação de heap. Usando uma edição de estrutura Esta versão evita a alocação de heap do fechamento mantendo os dados no quadro de pilha da função principal. Mesmo resultado: Para evitar que as aproximações de ponto flutuante sigam se acumulando e crescendo, o código poderia executar uma soma periódica em toda a matriz de filas circulares. Esta implementação produz dois estados de compartilhamento de objetos (função). É idiomático em E separar a entrada da saída (ler a partir da escrita) em vez 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 embutido p, que é usado como o período da média móvel simples. A função de execução lê entrada numérica e passa para a função anônima recém-criada e, em seguida, inspeciona o resultado para STDOUT. A saída é mostrada abaixo, com a média, seguida da entrada agrupada, formando a base de cada média móvel. Erlang tem fechamentos, mas variáveis imutáveis. Uma solução então é usar processos e uma simples mensagem passando API baseada. As linguagens de matriz têm rotinas para calcular os avarages de deslizamento para uma dada seqüência de itens. É menos eficiente para loop como nos comandos a seguir. Solicita continuamente uma entrada I. Que é adicionado ao final de uma lista L1. L1 pode ser encontrado pressionando 2ND1, ea média pode ser encontrada 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: list é 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 definindo o período de 5 movinav2 (3, x): x - novos dados na lista (valor 3), e o resultado será armazenado na variável x e exibido movinav2 (4, x) : X - novos dados (valor 4), eo 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 de índice, e aponta para o fim da sub-lista a lista sendo calculada a 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 cálculo da média seguinte. Em cada iteração, a variável i aponta para o último valor na lista que será usado no cálculo médio. Portanto, só precisamos descobrir qual será o primeiro valor na lista. Geralmente bem tem que considerar p elementos, então o primeiro elemento será o indexado por (i-p1). No entanto, nas primeiras iterações, esse cálculo será normalmente negativo, de modo que a seguinte equação irá evitar índices negativos: max (i-p1,1) ou, arranjar 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 - começar o índice 1) ou, arranjando a equação, (i - (max (ip, 0) 1) e então , (I-max (ip, 0)). A variável z possui o valor comum (max (ip), 0), então o beginindex será (z1) eo numberofelements será (iz) mid (list, z1, iz) retornará a lista de valor que será a soma média .) Irá somá-los soma (.) (Iz) ri irá média deles e armazenar o resultado no lugar apropriado na lista de resultados fp1 cria uma aplicação parcial fixando o (neste caso) o segundo e terceiro parâmetros
No comments:
Post a Comment