Monday 17 July 2017

F # Média Exponencial Móvel


Eu ainda estou trabalhando para explorar a coisa F - tentando descobrir como pensar em F em vez de apenas traduzir de outras línguas que eu conheço. Ive recentemente pensando nos casos em que você não possui um mapa de 1: 1 entre antes e depois. Casos em que List. map cai. Um exemplo disto é as médias móveis, onde, normalmente, você terá resultados len-n1 para uma lista de comprimento len ao calcular a média de n itens. Para os gurus lá fora, esta é uma boa maneira de fazê-lo (usando a fila apertada de Jomo Fisher) (Talvez seja melhor para implementar um MovingAverageQueue ao herdar do Fifo) perguntou 17 de novembro às 11:12 Eu tive que declarar Ele deixa MovingAverage n (s. Seqltfloatgt) para colocar isso em um módulo de utilidade, longe do site de chamadas, para aplacar o sistema de tipos. Tanto quanto posso dizer, isso só funciona com flutuadores, devido a uma limitação da Array. average. MSDN afirma que posso substituir isso com Array. averageBy para usar isso em uma seqüência int, mas isso dá um erro diferente. Brian, você pode reformular essa resposta para trabalhar em contextos genéricos, para que ele funcione com seq-of-any-arithmetic-type, sem tipo de inferência ndash Warren Young 27 de junho às 19:04 Devo ressaltar que minha necessidade de Esta função de média móvel é obter uma janela curta (30ish) sobre uma seqüência de números inteiros que são quase todos em milhões, então eu não preciso de ponto flutuante. Mesmo um único dígito à direita do ponto decimal não é útil na minha aplicação. Convertendo meus inteiros para FP e o resultado de volta para int apenas para aplacar a apelação do doesn39t da biblioteca padrão F. Ndash Warren Young 27 de junho às 19:30 Se você se preocupa com o desempenho, então você pode calcular uma média móvel de forma eficiente usando algo assim (assumindo que estavam calculando uma média móvel em uma janela de 3 dias). A parte mais difícil disso é segurar No seu anterior total em execução e no número N-janela. Eu criei o seguinte código: Esta versão não é tão bonita quanto o código Haskell, mas deve evitar problemas de desempenho associados à recompor sua janela em cada execução. Ele mantém um total em execução e mantém os números usados ​​anteriormente em uma fila, por isso deve ser muito rápido. Apenas por diversão, escrevi um benchmark simples: se você se preocupa com o desempenho e como um código elegante, tente usar FSUnit, podemos testá-lo. O truque do algoritmo é a primeira soma dos primeiros n números e, em seguida, manter um total em execução adicionando a cabeça Da janela e subtraindo a cauda da janela. A janela deslizante é conseguida fazendo um auto zip na seqüência, mas com o segundo argumento para zip avançado pelo tamanho da janela. No final do pipeline, dividimos apenas o total em execução pelo tamanho da janela. A varredura de notas é como dobrar, mas produz cada versão do estado em uma seqüência. Uma solução ainda mais elegante, embora possível, com sucesso no desempenho é fazer a observação de que, se não formos o zero, não precisamos calcular a soma inicial. Poderia haver um sucesso de desempenho devido à segunda indireção relacionada ao envolvimento das duas sequências, mas talvez não seja significativa dependendo do tamanho da janela respondida 31 de agosto 12 às 8: 06Tools Math. NET Numerics Versão 3 Math. NET Numerics Está bem no caminho para a próxima versão principal, v3.0. Uma primeira visualização de alfa já foi empurrada para a galeria NuGet, mesmo que ainda haja muito o que fazer. Se você gostaria de entender um pouco melhor, onde atualmente estamos, para onde estava indo e por que, então, continue lendo. Por que uma nova versão importante aplicamos os princípios do controle de versão semântico. O que significa que não devemos quebrar qualquer parte da superfície pública da biblioteca, que é quase tudo no nosso caso, durante lançamentos menores (com o formato de versão em 3 partes major. minor. patch). Isso garante que você possa atualizar facilmente em lançamentos menores sem pensamentos secundários ou quebrar qualquer código. No entanto, às vezes, realmente há uma boa razão para mudar o design, porque é uma maneira complicada de usar, inconsistente, leva a um mau desempenho ou simplesmente não foi bem pensado. Ou simplesmente aprendemos como fazê-lo de uma maneira muito melhor. Você pode ter notado que alguns membros foram declarados como obsoletos nos últimos últimos lançamentos menores, com sugestões sobre como fazê-lo, mesmo que a antiga implementação tenha sido mantida intacta. Ao longo do tempo, todo esse código antigo tornou-se uma dor para manter, e usar a biblioteca foi muito mais complicado do que o necessário. Então eu decidi que era hora de finalmente consertar a maioria dessas questões e limpar. Nós movemos algum queijo por aí nesta versão. Seu código será interrompido em algumas ocasiões. Mas, em todos os casos, uma solução deve ser fácil, se não trivial. Além disso, uma vez que voltaremos a ser vinculados por versões semânticas para manter a biblioteca estável em todos os futuros lançamentos menores e, portanto, provavelmente nos próximos anos. Além disso, podemos continuar fornecendo maços para o ramo v2 antigo se necessário por um tempo. No entanto, recomendo vivamente que você atualize para o v3 uma vez disponível. Comentários são bem-vindos Uma primeira visualização (v3.0.0-alpha1) já foi publicada para a NuGet e planejo fazer pelo menos mais duas versões de pré-visualização antes de alcançar a primeira versão do v3.0. Por favor dê uma olhada e dê um feedback - agora é uma possibilidade única para quebrar as mudanças. Visão geral sobre o que foi feito até agora, simplificações do espaço de nomes. Mais design funcional, quando apropriado. Certifique-se de que tudo funciona bem e se sente nativo tanto em C como em F. Use nomes curtos comuns se conhecidos em vez de nomes completos muito longos (trigonometria). Álgebra linear: usar os tipos genéricos é a maneira recomendada agora, certifique-se de que ele funciona bem. As classes IO para serialização de vetores de matriz tornam-se pacotes separados. Maior refatoração dos solucionadores iterativos. Repleto de peças faltantes, várias simplificações, muitas outras mudanças. Distribuições: limpeza principal. Exposição direta das funções de distribuição (pdf, cdf, etc.). Estimativa de parâmetros. Novas funções de distância Visão geral sobre o que está planejado para fazer Os solucionadores iterativos precisam de mais trabalho. Também gosto de projetá-los de modo que possam ser iterados manualmente, de forma simples. As transformações integrais (FFT etc) precisam de refatoração importante. Apoiado por provedor nativo, se possível. Considere trazer filtragem de retorno (FIR, IIR, média móvel, etc.) O encaixe atual da curva de decomposição QR é ineficiente para grandes conjuntos de dados, mas corrigi-lo na verdade não é muito complicado. Investigue e conserte uma inconsistência na classe Precision. Diminuir as verificações nulas redundantes Detalhes sobre o que é novo na versão 3 até agora Eliminar. Algorithms Namespaces Você já teve que abrir 10 namespaces diferentes Math. NET Numerics para obter tudo o que precisa. Isso deve ficar um pouco melhor na v3, pois as fachadas estáticas, como Integrate . Interpolar. Fit ou FindRoots para casos simples foram movidos diretamente para o espaço de nomes de raiz MathNet. Numerics e todos os namespaces de algoritmos (para usos avançados) do formulário MathNet. Numerics. X.Algorithms são agora simplesmente MathNet. Numerics. X. Interpolação Além dos espaços de nomes simplificados, a última sobrecarga Diferenciar que retorna todo o valor interpolado e a primeira e a segunda derivada em algum ponto x foi simplificada: em vez de dois parâmetros fora em uma ordem inesperada, ele agora retorna uma tupla com ordenação razoável . Integração O design da transformação dobro-exponencial foi bastante estranho. Foi simplificado para uma classe estática e é muito mais simples de usar explicitamente. Distribuições de probabilidade Embora sempre foi possível atribuir uma fonte aleatória personalizada (RNG) a uma distribuição para amostragem de números aleatórios, foi um pouco complicado e exigiu duas etapas. Agora, todos os construtores de distribuição têm uma sobrecarga que aceita uma fonte aleatória personalizada diretamente na construção, em uma única etapa. Algumas distribuições agora suportam a estimativa de parâmetros de máxima verossimilhança e a maioria das distribuições implementam uma função de distribuição cumulativa inversa. A distribuição funciona como PDF. CDF e InvCDF agora estão expostos diretamente como funções estáticas. A documentação interna e a nomeação de parâmetros foram significativamente melhoradas. ChiSquare tornou-se ChiSquared. E a interface IDistribution tornou-se a Divisão de Divulgação. Simplifique a amostragem aleatória mais compostável em F com o novo módulo de amostra. Novas funções de distância Rutinas padrão para avaliar as distâncias euclidianas, Manhattan e Chebychev entre arrays ou vetores, também para a Suma comum de diferença absoluta (SAD), erro médio-absoluto (MAE), Soma de diferença quadrada (SSD) e Mean-Squared Métricas de erro (MSE). Hamming distância. Alavancando provedores onde apropriado. Menos verificações nulas e ArgumentNullExceptions Provavelmente como um efeito colateral da minha exposição à programação funcional ao longo do último ano, eu não segui os argumentos porque em C cada rotina deve verificar explicitamente todos os argumentos por nulo. Já deixei algumas dessas verificações, mas ainda há mais de 2000 lugares onde Math. NET Numerics lança ArgumentNullException. A maioria destes provavelmente desaparecerá. Há um caso em que é sensato mantê-los embora: quando uma rotina aceita um argumento, mas não o usa imediatamente (e, portanto, não causa uma NullReferenceException imediata), uma referência nula se esgueirando pode ser difícil de depurar, tão bem Mantenha o cheque. Mas esses casos são bastante raros, dada a natureza da biblioteca. Biblioteca IO A biblioteca IO que costumava ser distribuída como parte da pacote central é agora um conjunto de pacotes NuGet separados, e. MathNet. Numerics. Data. Text. E vive em um repositório separado. Favorecendo os tipos genéricos de álgebra linear Uma vez que o espaço de nome genérico foi necessário todo o tempo de qualquer maneira e o caminho feliz recomendado agora é sempre usar os tipos genéricos, tudo do espaço de nome. Generic foi movido para um espaço de nomes. De agora em diante, você geralmente só precisa abrir dois namespaces quando trabalha com álgebra linear, mesmo que as factorizações sejam necessárias. Por exemplo, ao usar o tipo duplo, você abriu MathNet. Numerics. LinearAlgebra e MathNet. Numerics. LinearAlgebra. Double. Uma vez que a digitação é mais forte em F, todas as funções initcreate no módulo F agora retornam diretamente tipos genéricos para que você não tenha que atualizar manualmente o tempo todo. A maioria das rotinas foi generalizada para trabalhar em tipos genéricos. Nos casos em que você deseja implementar algoritmos genéricos, mas também precisa criar novas matrizes ou vetores densos ou dispersos, um novo generador foi adicionado. Isso nunca deve ser necessário no código do usuário. Roteias de matriz escalar faltantes Algumas rotinas de matriz escalar faltantes como adicionar ou subtrair um escalar a uma matriz ou dividir um escalar por uma matriz foram adicionadas, apoiadas pelos provedores sempre que possível. Há agora também uma rotina de módulo. Operadores de infixos em ponto onde suportado (F) Weve adicionado em ponto de referência ... e. Operadores para matrizes e vetores na biblioteca central. Isso não é suportado em todos os idiomas. Net ainda, mas funciona bem em F, embora sem suporte de curry. É claro que, nas outras línguas, você pode continuar usando os métodos normais como antes. Factorização e Solversos iterativos Anteriormente, a fatoração da matriz só foi acessada por métodos de extensão ou criação explícita, o que não funcionou muito bem quando se utilizam tipos genéricos. O tipo de matriz genérica agora fornece métodos para criá-los diretamente. Como tal, as implementações reais foram internalizadas, já que não há mais necessidade de acesso direto. A factorização QR é agora fina por padrão, e as factorizações já não clonam seus resultados sem nenhum motivo prático. O design do solucionador iterativo foi significativamente simplificado e agora é genérico e compartilhado sempre que possível e aceita tipos genéricos em todos os lugares. Os namespaces são agora muito mais planos, pois a estrutura muito detalhada não adicionou nenhum valor, mas significou que você precisava abrir uma dúzia de espaços para nome. Melhorias em álgebra linear variada Os vetores agora possuem uma rotina ConjugateDotProduct, além de DotProduct. Os vetores agora fornecem explicitamente as normas L1, L2 e infinitas adequadas. MatricesVectors agora tem enumeradores consistentes, com uma variante que ignora zeros (útil se esparso). As rotinas de criação MatrixVector foram simplificadas e geralmente não requerem dimensões explícitas. Novas variantes para criar matrizes diagonais, ou em que todos os campos tenham o mesmo valor. MatricesVectors expõe se o armazenamento é denso com uma nova propriedade IsDense. Os provedores foram movidos para um namespace de Provedores e são totalmente genéricos novamente. AsinAcos complexas mais robustas para grandes números reais. Funções Trig: nomes curtos comuns em vez de nomes muito longos. Complexo: nomes curtos comuns para Exp, Ln, Log10, Log. Estatísticas: novo método MeanVariance de uma passagem única (como usado frequentemente em conjunto). Compartilhe esta postagem

No comments:

Post a Comment