Sunday 3 December 2017

Erro padrão médio em movimento


Eu preciso acompanhar os últimos 7 dias de trabalho em um loop de leitura de arquivos planos. Está sendo usado para medir a fatigabilidade das listas de trabalho. Agora eu tenho algo que funciona, mas parece bastante detalhado e não tenho certeza se há um padrão que é mais sucinto. Atualmente, eu tenho uma classe Java com uma matriz estática para armazenar os últimos dados de x dias, então, ao ler o arquivo, retiro o primeiro elemento e mova os outros 6 (por um total de uma semana) de volta por um. O processamento desta matriz estática é feito em seu próprio método, ou seja. A minha pergunta: esta é uma abordagem de design razoável, ou há algo cegamente óbvio e simples para fazer esta tarefa. Obrigado, eles pediram 30 de agosto 11 às 14:33. Obrigado, pessoal: eu recebi a mensagem: use um objeto de nível superior e explore o Métodos relevantes ou um buffer circular. Excelentes respostas, todas elas. Quando você pensa sobre isso, você sempre precisa ter acesso a toda a matriz para que você possa se livrar daquela primeira entrada - da qual eu não tinha certeza por minha conta. Eu aliviei que eu não tivesse perdido algum liner e estava basicamente em uma faixa razoável, se não eficiente e fácil. Isto é o que eu adoro neste site: respostas de alta qualidade e relevantes de pessoas que conhecem o seu sht. Ndash Pete855217 30 de agosto 11 às 15:05 Por que você inicializa o runningTotal para null O que é seu tipo Onde é declarado Isso faria bem se você colocar alguns exemplos de código que se assemelham ao código Java real. Continuando, minha crítica seria a seguinte: sua função faz demais. Uma função ou método deve ser coeso. Mais apropriadamente, eles devem fazer uma coisa e uma coisa apenas. Pior ainda, o que acontece no seu loop for quando x 5 Você copia runningTotal6 em runningTotal5. Mas então você tem duas cópias do mesmo valor na posição 5 e 6. No seu projeto, sua função movesshuffles os itens em sua matriz calcula o material total de impressões para o erro padrão retorna o total. Faz demais. Minha primeira sugestão não é mover coisas na matriz. Em vez disso, implemente um buffer circular e use-o em vez da matriz. Isso simplificará seu design. A minha segunda sugestão é dividir as coisas em funções que são coesas: tenha uma estrutura de dados (um buffer circular) que lhe permita adicionar a ela (e isso diminui a entrada mais antiga sempre que ela atinja sua capacidade). Interator tem uma função que calcula o total no iterador (você não se importa se você estiver calculando o total de uma matriz, lista ou bufer circular). Não o chame total. Chame isso de soma, que é o que você está informando. Isso é o que eu faço :) Essa é a ótima informação de luis, no entanto, lembre-se de que esta função é uma pequena parte da funcionalidade da classe, e seria um excesso para adicionar muito código para torná-la perfeita. Você é tecnicamente correto, e eu entendo que meu código faz 39 muito muito39, mas, ao mesmo tempo, às vezes é melhor errar ao lado de um código menor e mais claro do que ir para a perfeição. Dadas as minhas habilidades em Java, mesmo fazer o pseudocódigo que você descreve a compilação me faria soprar meu orçamento neste (), mas obrigado pela descrição clara. Ndash Pete855217 31 de agosto 11 às 2:23 Hmmm, não é sobre a perfeição, mas sobre práticas industriais estabelecidas que conhecemos há 3 décadas. O código limpo é sempre um que é particionado. Temos décadas de evidências que indicam que este é o caminho a seguir no caso geral (em termos de custo-eficiência, redução de defeitos, compreensão, etc.). A menos que seja um código descartável por um tipo de coisa única. Nunca é dispendioso fazer isso quando se inicia qualquer análise de problema dessa maneira. Codificação 101, quebra o problema e o código segue, nem excesso nem dificuldade) ndash luis. espinal 31 de agosto 11 às 15:55 Sua tarefa é muito simples e o enfoque que você adotou é certamente bom para o trabalho. No entanto, se você quiser usar um design melhor, você deve se livrar de todo esse movimento numérico, você usa uma fila FIFO e faz bom uso de métodos push e pop, de modo que o código não reflete qualquer movimento de dados, apenas as duas ações de lógica De novos dados e remova dados com mais de 7 dias. Respondeu 30 de agosto 11 em 14: 49Below você pode ver o meu método C para calcular Bandas Bollinger para cada ponto (média móvel, banda ascendente, banda baixa). 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. Ele costumava conter um loop adicional para calcular a média móvel nos últimos n períodos. Este que eu poderia remover, adicionando o novo valor de ponto a totalaverage no início do loop e removendo o valor do ponto i-n no final do loop. Minha pergunta agora é basicamente: Posso remover o loop interno restante de uma maneira similar que eu consegui com a média móvel perguntada em 31 de janeiro de 13 às 21:45 A resposta é sim, você pode. Em meados dos anos 80, desenvolvi apenas um algoritmo desse tipo (provavelmente não original) no FORTRAN para uma aplicação de monitoramento e controle de processo. Infelizmente, isso aconteceu há mais de 25 anos e não me lembro das fórmulas exatas, mas a técnica foi uma extensão da média móvel, com cálculos de segunda ordem, em vez de apenas em linhas lineares. Depois de olhar para o seu código alguns, penso que posso descobrir como eu fiz isso naquela época. Observe como seu loop interno está fazendo uma Soma de Quadrados: da mesma maneira que sua média deve ter originalmente 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 você marcar. Agora, isso pode parecer inseparável, mas na verdade eles podem ser separados: agora o primeiro termo é apenas uma Soma de Quadrados, você lida com a mesma maneira que você faz a soma de Valores para a média. O último termo (k2n) é apenas a média ao quadrado do período. Como você divide o resultado pelo período de qualquer maneira, você pode simplesmente adicionar o novo quadrado médio sem o loop extra. Finalmente, no segundo termo (SUM (-2vi) k), desde SUM (vi) total kn, você pode alterá-lo para este: ou apenas -2k2n. Que é -2 vezes a média ao quadrado, uma vez que o período (n) é dividido novamente. Então, a fórmula combinada final é: (certifique-se de verificar a validade disso, uma vez que eu estou derrubando o topo da minha cabeça) E incorporar em seu código deve ser algo assim: Obrigado por isso. Eu usei isso como base de uma implementação em C para o CLR. Descobri que, na prática, você pode atualizar de forma que newVar seja um número negativo muito pequeno e o sqrt falhar. Introduzi um if para limitar o valor a zero para este caso. Não é idéia, mas estável. Isso ocorreu quando cada valor na minha janela tinha o mesmo valor (usei um tamanho de janela de 20 e o valor em questão era 0,5, caso alguém pretenda tentar reproduzir isso). Ndash Drew Noakes 26 de julho 13 às 15:25 Ive Usou common-math (e contribuiu para essa biblioteca) para algo muito parecido com isso. Sua fonte aberta, portar para C, deve ser fácil como torta comprada na loja (você tentou fazer uma torta do zero). Confira: commons. apache. orgmathapi-3.1.1index. html. Eles têm uma classe StandardDeviation. Vá para a cidade respondida em 31 de janeiro de 13 às 21:48. Agora, desculpe, eu não tinha a resposta que você estava procurando. Eu definitivamente não queria sugerir portar toda a biblioteca Apenas o código mínimo necessário, que deveria ser algumas centenas de linhas ou assim. Tenho em atenção que não tenho ideia do que as restrições legais de direitos autorais que o apache tem nesse código, então você deve verificar isso. No caso de você persegui-lo, aqui está o link. Então, a versão mais rápida já foi dada acima --- mas talvez isso ainda seja de interesse geral. Uma pequena biblioteca Java para calcular a média móvel e 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 valores foram derivados que podem ser usados ​​para mover valores de janelas. Dados de mobilização removem variações aleatórias e mostram tendências e componentes cíclicos. Inércia na coleta de dados obtidos ao longo do tempo é alguma forma de variação aleatória. Existem métodos para reduzir o cancelamento do efeito devido a variação aleatória. Uma técnica freqüentemente usada na indústria é o alisamento. Esta técnica, quando corretamente aplicada, revela mais claramente a tendência subjacente, os componentes sazonais e cíclicos. Existem dois grupos distintos de métodos de suavização Métodos de média Métodos de suavização exponencial Tomar médias é a maneira mais simples de suavizar os dados Em primeiro lugar, investigaremos alguns métodos de média, como a média simples de todos os dados passados. Um gerente de um armazém quer saber o quanto um fornecedor típico entrega em unidades de 1000 dólares. Heshe toma uma amostra de 12 fornecedores, aleatoriamente, obtendo os seguintes resultados: A média calculada ou a média dos dados 10. O gerente decide usar isso como a estimativa de despesas de um fornecedor típico. Isto é uma estimativa boa ou ruim O erro quadrático médio é uma maneira de julgar o quão bom é um modelo. Calculamos o erro quadrático médio. O erro montante verdadeiro gasto menos o valor estimado. O erro ao quadrado é o erro acima, ao quadrado. O SSE é a soma dos erros quadrados. O MSE é a média dos erros quadrados. Resultados MSE, por exemplo, os resultados são: Erros de Erro e Esquadrão A estimativa 10 A questão surge: podemos usar a média para prever a renda se suspeitarmos de uma tendência. Um olhar no gráfico abaixo mostra claramente que não devemos fazer isso. A média pesa todas as observações passadas igualmente. Em resumo, afirmamos que a média ou média simples de todas as observações passadas é apenas uma estimativa útil para a previsão quando não há tendências. Se houver tendências, use diferentes estimativas que levem em consideração a tendência. A média pesa igualmente todas as observações passadas. Por exemplo, a média dos valores 3, 4, 5 é 4. Sabemos, é claro, que uma média é calculada adicionando todos os valores e dividindo a soma pelo número de valores. Outra maneira de calcular a média é adicionando cada valor dividido pelo número de valores, ou 33 43 53 1 1.3333 1.6667 4. O multiplicador 13 é chamado de peso. Em geral: barra frac suma esquerda (fração direita) x1 esquerda (fração direita) x2,. , Esquerda (fração direita) xn. O (a esquerda (fratura direita)) são os pesos e, claro, somam para 1.

No comments:

Post a Comment