Estou usando uma janela dinâmica de movimento para calcular estatísticas simples de 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 média móvel mensal, o mensal é decidido por um porém a função de série de delele sempre usa o começo como o limite. Portanto, sempre cria uma série de n pontos de dados 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 n série de dados de dados de enésimo e olhar para trás no 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 inversa 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. você encontrará um agregado de função que é uma generalização de todas as funções de agrupamento de amplificador de janelas e também usa um seletor de chave. Isso significa que você pode fazer algo assim: A função usa três parâmetros, incluindo o seletor de chave e uma função que obtém o segmento de dados (que tem a janela junto com um sinalizador completo ou incompleto - por exemplo, no final do janelamento). Infelizmente, isso não funciona bem aqui, porque criará uma série com chaves duplicadas (e elas não são suportadas pelo Deedle). As janelas no final do trecho terminarão 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 feia é lembrar os últimos pedaços finais e retornar os valores perdidos quando o final começar a se repetir: Eu ainda estou trabalhando em groking the F thing - tentando descobrir como pensar em F ao invés de traduzir de outras linguagens que eu conheço. Recentemente estive pensando sobre os casos em que você não tem um mapa 1: 1 entre antes e depois. Casos em que List. map cai. Um exemplo disso são as médias móveis, em que 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, isso é uma boa maneira de fazê-lo (usando fila pinched de Jomo Fisher) (Talvez uma maneira melhor seria implementar um MovingAverageQueue por herdar de Fifo) perguntou 17 novembro 08 at 11:12 Eu tive que declarar ele permite que o MovingAverage n (s. seqltfloatgt) a fim de colocar isso em um módulo de utilitário, longe do local de chamada, para aplacar o sistema de tipos. Tanto quanto eu posso dizer, isso só funciona com carros alegóricos, devido a uma limitação de Array. average. O MSDN afirma que eu 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 ela funcione com qualquer tipo de aritmética, sem inferência de tipo. Eu deveria ressaltar que minha necessidade esta função de média móvel é obter uma janela curta (30ish) sobre uma sequê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 é de uso prático em meu aplicativo. Convertendo meus inteiros para FP e o resultado de volta para int apenas para apaziguar a biblioteca padrão F não apela. Se você se preocupa com o desempenho, então você pode calcular uma média móvel de forma eficiente usando algo como isto (assumindo que estavam calculando uma média móvel ao longo de uma janela de 3 dias) A parte difícil sobre isso está segurando no seu total anterior em execução e na janela N do número. Eu criei o seguinte código: Essa versão não é tão bonita quanto o código Haskell, mas deve evitar problemas de desempenho associados à recomputação de 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, eu escrevi um benchmark simples: Se você se preocupa com desempenho e como código elegante, tente Usar o FSUnit, podemos testá-lo O truque do algoritmo é a primeira soma dos primeiros n números e depois 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, apenas dividimos o total em execução pelo tamanho da janela. A varredura de notas é igual a fold, mas gera cada versão do estado em uma sequência. Uma solução ainda mais elegante, embora possível com o acerto de desempenho, é fazer a observação de que, se zerarmos a sequência, não precisaremos calcular a soma inicial. Poderia haver um impacto no desempenho devido à segunda indirecção relacionada com o envolvimento das duas sequências, mas talvez não seja significativo, dependendo do tamanho da janela respondida em 31 de agosto de 2012 às 8: 06 em Math. NET Numerics Version 3 Math. NET Numerics está a caminho do próximo grande lançamento, v3.0. Um primeiro preview alpha já foi enviado para a galeria NuGet, embora ainda haja muito a fazer. Se você gostaria de entender um pouco melhor onde estamos atualmente, para onde estamos indo, e por que, então continue a ler. Por que uma nova versão importante Nós aplicamos os princípios da versão semântica. o que significa que não devemos quebrar nenhuma parte da superfície pública da biblioteca, o que é quase tudo no nosso caso, durante lançamentos menores (com o formato de versão de 3 partes major. minor. patch). Isso garante que você possa atualizar facilmente em versões menores sem dúvidas ou quebrando qualquer código. No entanto, às vezes há realmente uma boa razão para mudar o design, porque é complicado de usar, inconsistente, leva a um mau desempenho ou simplesmente não foi muito bem pensado. Ou simplesmente aprendemos a fazer isso de uma maneira muito melhor. Você deve ter notado que alguns membros foram declarados como obsoletos nos últimos lançamentos menores, com sugestões de como fazê-lo, embora a implementação antiga tenha sido mantida intacta. Com o passar do tempo, todo esse código antigo se tornou uma tarefa difícil de 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 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á, nós estaremos novamente limitados pelo versionamento semântico para manter a biblioteca estável em todos os lançamentos menores futuros e, portanto, provavelmente nos próximos anos. Além disso, podemos continuar fornecendo correções para o antigo branch v2 se necessário por algum tempo. No entanto, recomendo vivamente a atualização para a versão 3, uma vez disponível. Comentários são bem-vindos Uma primeira prévia (v3.0.0-alpha1) já foi publicada no NuGet e eu pretendo fazer pelo menos mais duas versões de pré-visualização antes de chegarmos à primeira versão v3.0. Por favor, dê uma olhada e dê feedback - agora é uma possibilidade única para quebrar as mudanças. Visão geral sobre o que foi feito até agora Simplificações do namespace. Design mais funcional, quando apropriado. Certifique-se de que tudo funcione bem e pareça nativo em C e F. Use nomes curtos comuns, se forem bem conhecidos, em vez de nomes completos muito 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 tornam-se pacotes separados. Maior refatoração dos solucionadores iterativos. Preencheu algumas peças que faltavam, várias simplificações, muitas outras alterações. Distribuições: limpeza geral. Exposição direta de funções de distribuição (pdf, cdf, etc). Estimação de Parâmetros. Novas funções de distância Visão geral do que é planejado para fazer Solucionadores Iterativos precisam de mais trabalho. Id também gostaria de projetá-los de tal forma que eles possam ser iterados manualmente, de uma maneira simples. Transformações integrais (FFT, etc) precisam de grande refatoração. Apoiado pelo provedor nativo, se possível. Considere trazer de volta a filtragem (FIR, IIR, média móvel, etc.) O ajuste de curva baseado em decomposição QR atual é ineficiente para grandes conjuntos de dados, mas a correção não é realmente muito complicada. Investigue e corrija uma inconsistência na classe Precision. Drop redundante de verificação nula Detalhes sobre o que há de novo na versão 3 até o momento Dropping namespace. Algorithms Você já teve que abrir 10 diferentes namespaces Math. NET Numerics para obter tudo que você precisa Isso deve ficar um pouco melhor na versão 3, como fachadas estáticas . Interpolar. Fit ou FindRoots para casos simples foram movidos diretamente para o namespace 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 namespaces simplificados, a última sobrecarga de Differentiate que retorna todo o valor interpolado e a primeira e segunda derivada em algum ponto x foi simplificada: em vez de dois out-parameters em uma ordem inesperada, agora retorna uma tupla com ordenação razoável . Integração O design da transformação 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 fosse possível atribuir uma fonte aleatória personalizada (RNG) a uma distribuição para amostragem de números aleatórios, ela era um pouco complicada e exigia duas etapas. Agora, todos os construtores de distribuição têm uma sobrecarga aceitando uma fonte aleatória personalizada diretamente na construção, em uma única etapa. Algumas distribuições agora suportam estimativas 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. O CDF e o InvCDF agora são expostos diretamente como funções estáticas. A documentação inline e a nomeação de parâmetros foram melhoradas significativamente. O ChiSquare se tornou o ChiSquared. e a interface de IDistribuição tornou-se IUnivariateDistribution. Amostragem aleatória mais simples e mais composível em F com o novo módulo Sample. Novas funções de Distância Rotinas padrão para avaliar as distâncias Euclidiana, Manhattan e Chebychev entre matrizes ou vetores, também para a soma comum de diferença absoluta (SAD), erro médio-absoluto (MAE), soma da diferença quadrada (SSD) e média quadrada Métricas de erro (MSE). Distância de Hamming. Aproveitando provedores quando apropriado. Menos verificações nulas e ArgumentNullExceptions Provavelmente como um efeito colateral da minha exposição à programação funcional no último ano, eu não sigo mais os argumentos porque em C toda rotina deve verificar explicitamente todos os argumentos para null. Já deixei cair algumas dessas verificações, mas ainda há mais de 2000 lugares onde o Math. NET Numerics lança um ArgumentNullException. A maioria deles provavelmente desaparecerá. Há um caso em que faz sentido mantê-los: quando uma rotina aceita um argumento, mas não o utiliza imediatamente (e, portanto, não causa um NullReferenceException imediato), é difícil depurar uma referência nula em sneaking, mantenha o cheque. Mas esses casos são bastante raros, dada a natureza da biblioteca. IO Library A biblioteca de E / S que costumava ser distribuída como parte do pacote principal agora é um conjunto de pacotes separados do NuGet, por exemplo, MathNet. Numerics. Data. Text. e vive em um repositório separado. Favorecendo os tipos de álgebra linear genérica Como o namespace genérico era necessário todo o tempo de qualquer maneira e o caminho feliz recomendado agora é sempre usar os tipos genéricos, tudo a partir do namespace. Generic foi movido para cima um namespace. De agora em diante, você normalmente só precisará abrir dois namespaces ao trabalhar com álgebra linear, mesmo que as fatorações sejam necessárias. Por exemplo, ao usar o tipo double, você abrirá MathNet. Numerics. LinearAlgebra e MathNet. Numerics. LinearAlgebra. Double. Como 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 fazer o upcast manualmente o tempo todo. A maioria das rotinas foi generalizada para funcionar em tipos genéricos. Para casos em que você deseja implementar algoritmos genéricos, mas também precisa criar novas matrizes densas ou esparsas ou vetores, um novo construtor genérico foi adicionado. Isso raramente deve ser necessário no código do usuário. Rotinas em matriz escalar ausentes Algumas rotinas em matriz escalar ausentes, como adicionar ou subtrair um escalar a uma matriz ou dividir um escalar por uma matriz, foram adicionadas, respaldadas por provedores sempre que possível. Há agora também uma rotina de módulo. Operadores de infixação point-wise onde suportados (F) Incluímos point-wise .. / e. operadores para matrizes e vetores na biblioteca central. Isso não é suportado em todas as linguagens. Net ainda, mas funciona bem em F, mesmo sem precisar de suporte. Claro que nos outros idiomas você pode continuar usando os métodos normais como antes. Factorization and Iterative Solvers Anteriormente, a fatoração de matriz só era acessível por métodos de extensão ou criação explícita, que não funcionavam muito bem quando se usavam 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 magra por padrão, e as fatorações não mais clonam seus resultados sem nenhuma razão prática. 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 agora são muito mais planos, já que a estrutura muito detalhada não adicionava nenhum valor, mas significava que você tinha que abrir uma dúzia de namespaces. Melhorias na Álgebra Linear Misc Os vetores agora têm uma rotina ConjugateDotProduct além do DotProduct. Os vetores agora fornecem explicitamente as normas L1, L2 e infinitas adequadas Matrizes / Vetores agora têm enumeradores consistentes, com uma variante que pula zeros (útil se esparsa). As rotinas de criação de matrizes / vetores foram simplificadas e geralmente não exigem mais dimensões explícitas. Novas variantes para criar matrizes diagonais, ou algo em que todos os campos tenham o mesmo valor. Matrizes / Vetores expõem se o armazenamento é denso com uma nova propriedade IsDense. Os provedores foram movidos para um namespace de Providers e são totalmente genéricos novamente. Asin / Acos complexo mais robusto para grandes números reais. Funções trigonométricas: 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 passagem única (usado frequentemente em conjunto). Compartilhe esta postagem
Комментарии
Отправить комментарий