Friday 26 April 2019

F # moving average


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 uma chance 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: 06Im ainda trabalhando em engolir a coisa F - tentando Saiba como pensar em F em vez de apenas traduzir de outras línguas que 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 seqüências, mas talvez não seja significativa dependendo do tamanho da janela respondida 31 de agosto 12 às 8:06

No comments:

Post a Comment