Tuesday 18 July 2017

F # Média 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 quando a média sobre 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 permite que 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 código elegante, tente usar FSUnit, podemos testá-lo. O truque do algoritmo é a primeira soma dos primeiros números e, em seguida, mantenha 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 sequê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 golpe 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: 06O tipo de Estatísticas contém funções para o cálculo rápido das estatísticas sobre Séries e quadros, bem como sobre uma janela em movimento e uma expansão em uma série. A série resultante tem as mesmas chaves que as séries de entrada. Quando não há valores, ou valores ausentes, diferentes funções se comportam de maneiras diferentes. As estatísticas (por exemplo, a média) retornam o valor faltante quando algum valor está faltando, enquanto as funções minmax retornam o elemento mínimomaximal (ignorando os valores faltantes). As funções de janelas no tipo de Estatísticas suportam cálculos em uma janela de tamanho fixo especificada pelo tamanho da janela. Se você precisar de um comportamento de janelas mais complexo (como a janela com base na distância entre as teclas), o tratamento diferente do limite ou o corte (cálculo sobre os pedaços adjacentes), você pode usar as funções de fragmentação e janelas do módulo da série, como Series. windowSizeInto ou Series. chunkSizeInto. Índice de janelas expandindo do windows160 Expansão significa que a janela é iniciada como uma janela de tamanho único e se expande à medida que se desloca sobre a série. Neste caso, as estatísticas são calculadas para todos os valores até a chave atual. Isso significa que o resultado é anexado à chave no final da janela. Os nomes das funções são prefixados com expansão. Membros estáticos Assinatura: tamanho: série int-série: Serieslt39K, floatgt - gt Serieslt39K, floatgt Parâmetros do tipo: K Retorna uma série que contém contagens sobre uma janela em movimento do tamanho especificado. Os primeiros elementos de tamanho 1 da série retornada estão sempre faltando se a janela inteira contiver valores faltantes, o resultado é 0. Assinatura: tamanho: série int - gt: Serieslt39K, floatgt - gt Serieslt39K, floatgt Parâmetros do tipo: K Retorna uma série Que contém kurtosis em uma janela em movimento do tamanho especificado. Os primeiros elementos de tamanho-1 das séries retornadas estão sempre faltando se a janela inteira contiver valores faltantes, o resultado também está faltando. Assinatura: tamanho: int - gt series: Serieslt39K, floatgt - gt Serieslt39K, floatgt Parâmetros de tipo: K Retorna uma série que contém o máximo em uma janela em movimento do tamanho especificado. Os primeiros elementos do tamanho 1 são calculados usando janelas menores que abrangem mais de 1. valores de tamanho 1. Se a janela inteira contiver valores faltantes, o resultado está faltando. Assinatura: tamanho: série int - gt: Serieslt39K, floatgt - gt Serieslt39K, floatgt Parâmetros de tipo: K Retorna uma série que contém meios em uma janela em movimento do tamanho especificado. Os primeiros elementos de tamanho-1 das séries retornadas estão sempre faltando se a janela inteira contiver valores faltantes, o resultado também está faltando. Assinatura: tamanho: int - gt series: Serieslt39K, floatgt - gt Serieslt39K, floatgt Parâmetros de tipo: K Retorna uma série que contém o mínimo em uma janela em movimento do tamanho especificado. Os primeiros elementos do tamanho 1 são calculados usando janelas menores que abrangem mais de 1. valores de tamanho 1. Se a janela inteira contiver valores faltantes, o resultado está faltando. Assinatura: tamanho: série int - gt: Serieslt39K, floatgt - gt Serieslt39K, floatgt Parâmetros do tipo: K Retorna uma série que contém skewness em uma janela em movimento do tamanho especificado. Os primeiros elementos de tamanho-1 das séries retornadas estão sempre faltando se a janela inteira contiver valores faltantes, o resultado também está faltando. Assinatura: tamanho: int - gt series: Serieslt39K, floatgt - gt Serieslt39K, floatgt Parâmetros de tipo: K Retorna uma série que contém desvios padrão sobre uma janela em movimento do tamanho especificado. Os primeiros elementos de tamanho-1 das séries retornadas estão sempre faltando se a janela inteira contiver valores faltantes, o resultado também está faltando. Assinatura: tamanho: série int - gt: Serieslt39K, floatgt - gt Serieslt39K, floatgt Parâmetros do tipo: K Retorna uma série que contém somas em uma janela em movimento do tamanho especificado. Os primeiros elementos de tamanho 1 da série retornada estão sempre faltando se a janela inteira contiver valores faltantes, o resultado é 0. Assinatura: tamanho: série int - gt: Serieslt39K, floatgt - gt Serieslt39K, floatgt Parâmetros do tipo: K Retorna uma série Que contém variância em uma janela em movimento do tamanho especificado. Os primeiros elementos de tamanho-1 das séries retornadas estão sempre faltando se a janela inteira contiver valores faltantes, o resultado também está faltando. Estatísticas de vários níveis160 Para uma série com índice de nível múltiplo (hierarquizado), as funções prefixadas com nível fornecem uma maneira de aplicar a operação estatística em um único nível do índice. (Por exemplo, você pode somar valores ao longo das teclas K1 em uma série SeriesltK1 K2, floatgt e obter SeriesltK1, floatgt como resultado.) Membros estáticos Assinatura: (nível: (39K - gt 39L)) - gt series: Serieslt39K, 39Vgt - Gt Serieslt39L, intgt Parâmetros de tipo: K, L, V Para cada grupo com teclas iguais ao nível especificado por nível. Retorna o número de valores no grupo. Isso exclui os valores e valores perdidos criados a partir de Double. NaN etc. Assinatura: (nível: (39K - gt 39L)) - gt série: Serieslt39K, floatgt - gt Serieslt39L, floatgt Parâmetros do tipo: K, L Para cada grupo com teclas iguais em O nível especificado por nível. Retorna a curtose dos valores em uma série. A função ignora valores faltantes e valores de NaN. Quando há menos de 4 valores, o resultado é NaN. Assinatura: (nível: (39K - gt 39L)) - gt series: Serieslt39K, floatgt - gt Serieslt39L, floatgt Parâmetros de tipo: K, L Para cada grupo com teclas iguais ao nível especificado por nível. Retorna a média dos valores no grupo. A função ignora valores faltantes e valores de NaN. Quando não há valores disponíveis, o resultado é NaN. Assinatura: (nível: (39K - gt 39L)) - gt series: Serieslt39K, floatgt - gt Serieslt39L, floatgt Parâmetros de tipo: K, L Para cada grupo com teclas iguais ao nível especificado por nível. Retorna a mediana dos valores no grupo. Assinatura: (nível: (39K - gt 39L)) - gt series: Serieslt39K, floatgt - gt Serieslt39L, floatgt Parâmetros de tipo: K, L Para cada grupo com teclas iguais ao nível especificado por nível. Retorna a aspereza dos valores em uma série. A função ignora valores faltantes e valores de NaN. Quando há menos de 3 valores, o resultado é NaN. Assinatura: (nível: (39K - gt 39L)) - gt series: Serieslt39K, floatgt - gt Serieslt39L, floatgt Parâmetros de tipo: K, L Para cada grupo com teclas iguais ao nível especificado por nível. Retorna o desvio padrão dos valores no grupo. A função ignora valores faltantes e valores de NaN. Quando há menos de 2 valores, o resultado é NaN. Assinatura: (nível: (39K - gt 39L)) - gt series: Serieslt39K, floatgt - gt Serieslt39L, floatgt Parâmetros de tipo: K, L Para cada grupo com teclas iguais ao nível especificado por nível. Retorna a soma dos valores no grupo. A função ignora valores faltantes e valores de NaN. Quando não há valores disponíveis, o resultado é 0. Assinatura: (nível: (39K - gt 39L)) - gt série: Serieslt39K, floatgt - gt Serieslt39L, floatgt Parâmetros do tipo: K, L Para cada grupo com as mesmas teclas no Nível especificado por nível. Retorna a variância dos valores no grupo. A função ignora valores faltantes e valores de NaN. Quando há menos de 2 valores, o resultado é NaN. Interposição de séries160 Membros estáticos interpolam (chaves série f) Assinatura: chaves: seqlt39Kgt - gt (f: opção 39K - gt (39K 39T) opção - gt (39K 39T) - gt 39T)) - gt series: Serieslt39K, 39Tgt - gt Serieslt39K, 39Tgt Parâmetros do tipo: K, T Interpõe uma série ordenada dada uma nova seqüência de teclas. A função itera através de cada nova chave e invoca uma função na chave atual, as observações válidas mais pequenas e maiores do argumento da série. A função deve retornar um novo flutuador válido. Teclas de parâmetros - Sequência de novas teclas que formam o índice de resultados interpolados f - Função para interpolar interpolarLineira (chave chave da série Diff) Assinatura: teclas: seqlt39Kgt - gt (keyDiff: (39K - gt 39K - gt float)) - gt series : Serieslt39K, floatgt - gt Serieslt39K, floatgt Parâmetros do tipo: K interpola linearmente uma série ordenada, dada uma nova seqüência de teclas. Teclas de parâmetros - Seqüência de novas chaves que formam o índice de resultados interpolados keyDiff - Uma função que representa a subtração entre duas chaves Estatísticas da série160 Funções como contagem. significar. Kurt etc. devolver as estatísticas calculadas sobre todos os valores de uma série. O cálculo ignora valores em falta (ou valores de nan), portanto, por exemplo, significa retornar a média de todos os valores presentes. Membros estáticosTowards 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, o que é quase tudo no nosso caso, durante pequenos lançamentos (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 correção deve ser fácil, se não trivial. Além disso, uma vez lá, estaremos novamente 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 parches 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. O feedback é bem-vinda Uma primeira visualização (v3.0.0-alpha1) já foi publicada no 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 bem 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 de volta a filtragem (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 corrija uma inconsistência na classe Precision. Diminuir as verificações nulas redundantes Detalhes sobre o que é novo na versão 3 até o momento Cair. Algorithms Namespaces Você já teve que abrir 10 namespaces diferentes Math. NET Numerics para obter tudo o que você 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 namespace 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 diferencial 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 tenha sido 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. Funções de distribuição 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, quando apropriado. Menos verificações nulas e ArgumentNullExceptions Provavelmente como efeito colateral da minha exposição à programação funcional ao longo do ano passado, 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 irá 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 poderia 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 era 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ê abrirá 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. Para casos em que você deseja implementar algoritmos genéricos, mas também precisa criar novas matrizes ou vetores densos ou dispersos, um novo generador genérico 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 suportados (F) Weve adicionado em ponto ... 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 de á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 Os MatricesVectors agora têm enumeradores consistentes, com uma variante que ignora os zeros (útil se esparso). As rotinas de criação do 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 expor 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 de MeanVariance de uma passagem única (como usado frequentemente em conjunto). Compartilhe esta postagem

No comments:

Post a Comment