Thursday 14 November 2019

Fsharp moving average


Ainda estou trabalhando em groking a coisa F - tentando descobrir como pensar em F ao invés de apenas traduzir de outras línguas que eu conheço. Ive recentemente foi pensando sobre os casos em que você não tem um mapa 1: 1 entre antes e depois. Casos em que o List. map cai. Um exemplo disto é as médias móveis, onde normalmente você terá len-n1 resultados para uma lista de comprimento len quando a média sobre n itens. Para os gurus lá fora, é esta uma boa maneira de fazê-lo (usando a fila presa de Jomo Fisher) (Talvez uma maneira melhor seria implementar um MovingAverageQueue por herdar de Fifo) perguntou Nov 17 08 às 11:12 Eu tinha que declarar Ele como deixar MovingAverage n (seqltfloatgt s), a fim de colocar isso em um módulo de utilitário, longe do site de chamada, para aplacar o sistema de tipo. Tanto quanto eu posso dizer, isso só funciona com flutuadores, devido a uma limitação de Array. average. MSDN alega que posso substituir isso por Array. averageBy para usar isso em uma sequência int, mas isso dá um erro diferente. Brian, você pode reformular essa resposta para trabalhar em contextos genéricos, de modo que ele irá trabalhar com tipo seq-of-any-arithmetic, sem inferência de tipo ndash Warren Young Jun 27 13 às 19:04 Eu devo salientar que a minha necessidade de Esta função de média móvel é obter uma janela curta (30ish) sobre uma seqüência de inteiros que são quase todos em milhões, então eu don39t necessidade de ponto flutuante. Mesmo um único dígito à direita do ponto decimal não tem utilidade prática na minha aplicação. Convertendo meus inteiros para FP eo resultado de volta para int apenas para aplacar a biblioteca padrão F doesn39t apelo. Se você se preocupa com o desempenho, então você pode calcular uma média móvel de forma eficiente usando algo como isto (supondo foram calcular uma média móvel em uma janela de 3 dias) A parte difícil sobre isso é segurando Em seu total de execução anterior e número N-janela. Eu vim com o seguinte código: Esta versão isnt tão agradável como o código Haskell, mas deve evitar problemas de desempenho associados com recomputing sua janela em cada executar. Ele mantém um total de execução e mantém números utilizados anteriormente em uma fila, por isso deve ser muito rápido. Apenas por diversão, eu escrevi um ponto de referência simples: Se você se importa com o desempenho e como código elegante, em seguida, tente Usando FSUnit podemos testá-lo O truque do algoritmo é a primeira soma os primeiros n números e, em seguida, manter um total rodando 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, basta dividir o total de execução pelo tamanho da janela. Nota varredura é apenas como dobrar, mas rendimento cada versão do estado em uma seqüência. Uma solução ainda mais elegante, embora possivelmente com desempenho hit é fazer a observação de que se nós zero pad a seqüência não precisamos calcular a soma inicial. Poderia haver uma batida do desempenho devido ao segundo indirection relacionado ao envoltório das duas seqüências mas talvez não é significativo dependendo do tamanho da janela respondida agosto 31 12 em 8: 06 eu estou usando uma janela movente dinâmica ao cálculo stats simples Em uma série ordenada na chave de data. Eu quero ser capaz de definir o limite no final da janela. Por exemplo um timeseries com a média móvel mensal, o mensal é decidido por um porém a função da série do deedle usa sempre o começo como o limite. Portanto, ele sempre cria produzir uma série de pontos de dados n da primeira instância de dados para os próximos n pontos de dados (n é decidido pela diversão acima). Eu gostaria de ter uma série datapoints n dos dados nth e olhar para trás para o passado. Eu também tentei usar Series. Rev primeiro para reverter a série, mas deedle acho que a série, embora em uma ordem invertida não é mais ordenada. É o que eu estou procurando possível Se você olhar para a lista de funções de agregação nos documentos. Youll encontrar um agregado de função que é uma generalização de todas as funções de chunking amplificador de janelas e também leva um seletor de chave. Isso significa que você pode fazer algo como isto: A função leva 3 parâmetros, incluindo o seletor de teclas e uma função que obtém o segmento de dados (que tem a janela junto com um sinalizador se ele está completo ou incompleto - por exemplo, no final da janela). Infelizmente, isso não funciona bem aqui, porque ele criará uma série com chaves duplicadas (e essas não são suportadas pelo Deedle). As janelas no final do pedaço terminará com a mesma data e assim você obterá chaves duplicadas (ele realmente é executado, mas você não pode fazer muito com a série). Uma solução horrível é lembrar os últimos pedaços e retornar valores em falta uma vez que o final começa a repetir: Towards Math. NET Numerics Versão 3 Math. NET Numerics está bem no seu caminho para a próxima versão importante, v3.0. Uma primeira pré-visualização alpha já foi empurrada para a galeria NuGet, embora ainda haja muito a fazer. Se você gostaria de entender um pouco melhor onde estamos atualmente, onde estavam indo, e por que, então continue a ler. Por que um novo grande lançamento Nós aplicamos os princípios de versão semântica. O que significa que não devemos quebrar qualquer parte da superfície pública da biblioteca, que é quase tudo em nosso caso, durante lançamentos menores (com o formato de versão de 3 partes major. minor. patch). Isso garante que você pode facilmente atualizar em pequenas versões sem pensar duas vezes ou quebrar qualquer um do seu código. No entanto, às vezes há realmente uma boa razão para mudar o design, porque é maneira complicada de usar, inconsistente, leva a mau desempenho ou não foi muito bem pensado. Ou simplesmente aprendemos a fazê-lo de uma maneira muito melhor. Você pode ter notado que alguns membros foram declarados como obsoletos sobre os últimos lançamentos secundários, com sugestões de como fazê-lo em vez disso, mesmo que a implementação antiga foi mantida intacta. Ao longo do tempo todo esse código antigo tornou-se uma dor de manter, e usar a biblioteca foi muito mais complicado do que o necessário. Então eu decidi que é hora de finalmente corrigir a maioria desses problemas e limpar. Nós movemos um pouco de queijo nesta versão. Seu código irá quebrar em algumas ocasiões. Mas em todos os casos uma correção deve ser fácil, se não trivial. Além disso, uma vez lá, estaremos novamente ligados a versões semânticas para manter a biblioteca estável em relação a todos os lançamentos menores futuros e, portanto, provavelmente nos próximos anos. Além disso, podemos continuar fornecendo patches para o ramo v2 antigo, se necessário por um tempo. No entanto, eu recomendo fortemente para atualizar para v3 uma vez disponível. O feedback é bem-vindo Uma primeira pré-visualização (v3.0.0-alpha1) já foi publicada para o NuGet e eu planejo fazer pelo menos mais duas versões antes de chegar à primeira versão v3.0. Por favor, dê uma olhada e dar feedback - agora é uma possibilidade única para quebrar as alterações. Visão geral sobre o que foi feito até agora simplificações Namespace. Design mais funcional onde apropriado. Certifique-se de que tudo funcione bem e se sinta nativo em C e F. Use nomes curtos comuns se forem conhecidos em vez de nomes longos (trigonometria). Álgebra Linear: Usando os tipos genéricos é a maneira recomendada agora certifique-se que funciona bem. As classes de IO para serialização de matriz / vetor se tornam pacotes separados. Maior refatoração dos solucionadores iterativos. Preenchia algumas peças em falta, várias simplificações, muitas outras mudanças. Distribuições: Major cleanup. Exposição direta das funções de distribuição (pdf, cdf, etc). Estimação de parâmetros. Novas funções de distância Visão geral sobre o que se planeja fazer Os solucionadores iterativos precisam de mais trabalho. Eu também gostaria de projetá-los de tal forma que eles podem ser iterados manualmente, de uma maneira simples. As transformações integrais (FFT etc) necessitam de grande refatoração. Suportado pelo provedor nativo se possível. Considere trazer de volta a filtragem (FIR, IIR, média móvel, etc.) O ajuste de curva atual baseado em QR-decomposição é ineficiente para grandes conjuntos de dados, mas fixá-lo não é realmente muito complicado. Investigue e corrija uma inconsistência na classe Precision. Drop redundante null-checks Detalhes sobre o que é novo na versão 3 até agora Soltando. Algorithms Namespaces Você já teve que abrir 10 diferentes namespaces Math. NET Numerics para obter tudo o que você precisa Isso deve ficar um pouco melhor na v3, como as fachadas estáticas como Integrar . Interpolar. Fit ou FindRoots para casos simples foram movidos diretamente para o namespace raiz MathNet. Numerics e todos os namespaces algoritmos (para usos avançados) do formulário MathNet. Numerics. X.Algorithms são agora simplesmente MathNet. Numerics. X. Interpolação Além dos namespaces simplificados, a última sobrecarga Diferenciada que retorna todo o valor interpolado e a derivada primeira e segunda em algum ponto x foi simplificada: em vez de dois out-parameters em uma ordem inesperada ela agora retorna uma tupla com ordenação razoável . Integração O desenho da transformação de dupla exponencial foi bastante estranho. Ele 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 aceitar uma fonte aleatória personalizada diretamente na construção, em uma única etapa. Algumas distribuições agora suportam estimativa de parâmetro de máxima verossimilhança e a maioria das distribuições implementa uma função de distribuição cumulativa inversa. Funções de distribuição como PDF. CDF e InvCDF agora são expostos diretamente como funções estáticas. A nomeação de documentação e parâmetros em linha foi melhorada significativamente. ChiSquare tornou-se ChiSquared. Ea interface IDistribution tornou-se IUnivariateDistribution. Simples mais amostragem aleatória composeable em F com novo módulo de Amostragem. Novas funções de distância Rotinas padrão para avaliação das distâncias Euclideana, Manhattan e Chebychev entre matrizes ou vetores, também para a Soma comum de Diferença Absoluta (SAD), Erro Média Absoluta (MAE), Soma de Diferença Quadrada (SSD) e Média de Quadrado Métricas de erro (MSE). Hamming distância. Aproveitando os provedores quando apropriado. Menos verificações nulas e ArgumentNullExceptions Provavelmente como um efeito colateral da minha exposição à programação funcional durante o último ano, eu não segui os argumentos porque em C cada rotina deve verificar explicitamente todos os argumentos para null. Ive já caiu algumas dessas verificações, mas ainda há mais de 2000 lugares onde Math. NET Numerics lança um ArgumentNullException. A maioria destes provavelmente será ido. Há um caso em que faz sentido mantê-los embora: quando uma rotina aceita um argumento, mas não usá-lo imediatamente (e, portanto, não causa uma imediata NullReferenceException), uma referência null furtivamente 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 de E / S A biblioteca de E / S que costumava ser distribuída como parte do pacote principal é agora um conjunto de pacotes NuGet separados, p. MathNet. Numerics. Data. Text. E vive em um repositório separado. Favorecendo os tipos de álgebra linear genérica Uma vez que o namespace genérico foi exigido o tempo todo de qualquer maneira eo caminho recomendado feliz agora é sempre usar os tipos genéricos, tudo a partir do namespace. Generic foi movido um namespace para cima. De agora em diante, você normalmente só precisará abrir dois namespaces ao trabalhar com álgebra linear, mesmo se forem necessárias fatorizações. Por exemplo, ao usar o tipo duplo, você deve abrir MathNet. Numerics. LinearAlgebra e MathNet. Numerics. LinearAlgebra. Double. Uma vez que a digitação é mais forte em F, todas as funções init / create no módulo F agora retornam diretamente tipos genéricos para que você não precise atualizar manualmente o tempo todo. A maioria das rotinas foram generalizadas para trabalhar em tipos genéricos. Para os casos em que você deseja implementar algoritmos genéricos, mas também precisa criar novas matriciais ou vetores densos ou esparsos, um novo construtor genérico foi adicionado. Isso raramente será necessário no código do usuário. Falta de rotinas de matrizes escalares Algumas rotinas de matrizes escalares em falta, como adicionar ou subtrair um escalar a uma matriz ou dividir um escalar por uma matriz, foram adicionadas, apoiadas por provedores sempre que possível. Theres agora também uma rotina do módulo. Point-wise infix operadores onde suportado (F) Weve acrescentou point-wise .. / e. Operadores a matrizes e vetores na biblioteca central. Isso não é suportado em todos os idiomas. Net ainda, mas funciona bem em F mesmo sem currying suporte. Claro que nos outros idiomas você pode continuar a usar os métodos normais como antes. Factorização e Solvers Iterativos Anteriormente, a factorização da matriz só era acessível por métodos de extensão ou criação explícita, o que não funcionou muito bem ao usar tipos genéricos. O tipo de matriz genérico 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 fatoração QR é agora fina por padrão, e as fatorações não clonam mais seus resultados sem razão prática. O projeto de solver iterativo foi significativamente simplificado e agora é genérico e compartilhado onde possível e aceita tipos genéricos em todos os lugares. Os namespaces são agora muito mais lisos porque a estrutura muito detalhada não adicionou nenhum valor mas significou que você teve que abrir uma dúzia namespaces. Diversas melhorias de algebra linear Vectors agora têm uma rotina ConjugateDotProduct além de DotProduct. Os vetores agora explicitamente fornecem as normas L1, L2 e infinidade adequadas Matrizes / Vetores agora têm enumeradores consistentes, com uma variante que ignora zeros (útil se escasso). As rotinas de criação de matrizes / vetores foram simplificadas e normalmente não requerem dimensões explícitas. Novas variantes para criar matrizes diagonais, ou tal onde todos os campos têm o mesmo valor. Matrizes / vetores expor se o armazenamento é denso com uma nova propriedade IsDense. Os provedores foram movidos para um namespace Providers e são totalmente genéricos novamente. Complexo mais robusto Asin / Acos 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 single-pass MeanVariance (como usado muitas vezes juntos). Compartilhar esta postagem

No comments:

Post a Comment