Monday, 11 September 2017

Moving Media Scala


Questo fine settimana ho deciso di provare la mia mano a un certo Scala e Clojure I m abile con programmazione orientata agli oggetti, e così Scala è stato facile da prendere come lingua, ma ha voluto provare la programmazione funzionale Questo è dove ha ottenuto hard. I appena possibile t sembrano avere la mia testa in una modalità di scrittura di funzioni come un programmatore esperto funzionale, come ci si avvicina a un problem. Given un elenco di valori e di un determinato periodo di sommatoria, come si potrebbe generare una nuova lista della media mobile semplice di nell'esempio list. For Data la lista valori 2 0, 4 0, 7 0, 6 0, 3 0, 8 0, 12 0, 9 0, 4 0, 1 0, e il periodo 4, la funzione dovrebbe restituire 0 0 , 0 0, 0 0, 4 75, 5 0, 6 0, 7 25, 8 0, 8 25, 6 5. Dopo aver trascorso una giornata rimuginando sopra, il meglio che ho potuto venire con a Scala era this. I Know questo è terribilmente inefficiente, io d molto meglio fare qualcosa che sarebbe like. Now essere facilmente effettuata in uno stile imperativo, ma posso t per la vita di me capire come esprimere questo problema functionally. Interesting posso pensare a molte soluzioni, con vari gradi di efficienza dover aggiungere roba più volte isn t davvero un problema di prestazioni, ma lasciare che s assumere è anche, gli zeri all'inizio può essere anteposta più tardi, quindi cerchiamo s non preoccuparti per i medesimi, qualora l'algoritmo fornisce loro, naturalmente, bene se non, correggiamo è later. Starting con Scala 2 8, il seguente darebbe il risultato per n periodo utilizzando scorrevole per ottenere una finestra scorrevole del List. Nevertheless, anche se questo è piuttosto elegante, doesn t hanno il migliore prestazioni possibili, perché doesn t approfittare di aggiunte già calcolati Quindi, parlando di loro, come possiamo ottenere them. Let s dire che scrivere this. We avere una lista di la somma di ogni due coppie Sia s tenta di utilizzare questo risultato per calcolare la media mobile di 4 elementi la formula di cui sopra ha fatto la seguente computation. So se prendiamo ogni elemento e aggiungerlo al secondo elemento successivo, si ottiene la media mobile a 4 elements. We può farlo come this. We potrebbe quindi calcolare la media mobile per 8 elementi, e così via Well, vi è un algoritmo ben noto per calcolare cose che seguono tale modello e s più noto per il suo uso su calcolare la potenza di un numero va come this. So, let s diffusa esso here. So, qui s il periodo di 0 logico non è valido, periodo 1 è uguale all'ingresso, periodo 2 è la finestra di dimensioni 2 scivolando Se maggiore di quella, può essere pari o dispari odd. If, aggiungiamo ogni elemento di la movingSum del prossimo strano - 1 elementi per esempio, se 3, aggiungiamo ogni elemento al movingSum del prossimo 2 elements. If anche, calcoliamo la movingSum per n 2 quindi aggiungere ogni elemento a quello n 2 passi dopo. con questa definizione, possiamo poi tornare al problema e fare this. There sa leggera inefficienza per quanto riguarda l'uso di ma è periodo di O, non si può essere resa più efficiente, con una funzione ricorsiva di coda e, naturalmente, la definizione di scorrimento ho fornito è orrendo spettacolo-saggio, ma ci sarà una migliore definizione di esso su Scala 2 8 Nota che possiamo t fare un metodo di scorrimento efficace su una lista, ma siamo in grado di farlo su un Iterable. Having detto tutto che, mi D vai con la prima definizione, e ottimizzare solo se l'analisi del percorso critico individuato questo come un grande deal. To concludere, diamo s consideriamo come sono andato circa il problema Abbiamo un problema media mobile una media mobile è la somma di una finestra mobile in un elenco, diviso per la dimensione di quella finestra quindi, in primo luogo, cerco di ottenere una finestra scorrevole, riassumere tutto su di esso, e poi dividere per il size. The problema successivo è stato quello di evitare la ripetizione delle aggiunte già calcolate in questo caso, sono andato al più piccolo aggiunta possibile, e cercato di capire come calcolare le somme più grandi riutilizzo come results. Finally, lasciate s cercare di risolvere il problema del modo in cui si è capito, aggiungendo e sottraendo dal risultato precedente Ottenere la prima media è easy. Now facciamo due liste Innanzitutto, l'elenco degli elementi da sottrarre successivo, l'elenco degli elementi da added. We può aggiungere questi due elenchi utilizzando zip Questo metodo produce solo tanti elementi come il più piccolo lista ha, che evita il problema della sottrazione di essere più grande di finitura necessary. We componendo il risultato con un fold. which è la risposta deve essere restituito l'intera funzione sembra this. I conoscere Clojure meglio di Scala, ecco va come ho scrivere questa l'altra voce Clojure qui è imperativo che non s davvero quello che si ri dopo e isn t idiomatica Clojure il primo algoritmo che mi viene in mente è più volte prendendo il numero minimo di elementi dalla sequenza, lasciando cadere il primo elemento, e ricorrente. le seguenti opere su qualsiasi tipo di sequenza di vettore o di un elenco, pigri o meno e dà una sequenza pigro delle medie --- che potrebbe essere utile se si è lavorando su un elenco di dimensione indefinita nota che si prende cura del caso base implicitamente il ritorno a zero se non ci sono più abbastanza t elementi nella lista di consume. Running questo sui vostri dati di test yields. It doesn t give 0 per i primi elementi nella sequenza, anche se questo potrebbe facilmente essere gestito un po 'artificially. The cosa più semplice di tutti è quello di vedere il modello e in grado di portare alla mente una funzione disponibile che si inserisce la partizione disegno di legge dà una visione pigra di porzioni di una sequenza, che siamo in grado di mappare over. Someone chiesto una coda ricorsiva ricorsione versione coda contro la pigrizia è un po 'di un compromesso Quando un lavoro è la costruzione di un elenco quindi rendere il vostro ricorsiva funzione di coda è di solito abbastanza semplice, e questo non fa eccezione --- solo costruire la lista come argomento per una sottofunzione Noi ll accumulare ad un vettore al posto di un elenco perché altrimenti l'elenco sarà costruito indietro e dovrà essere invertita al end. loop è un modo per rendere una funzione interna anonima come sorta di schema s nome consentono ripresentarsi deve essere utilizzato in Clojure per eliminare la coda le chiamate conj è un cons generalizzate apposto la nel modo naturale per la raccolta --- l'inizio delle liste e la fine del vectors. answered 24 agosto 09 alle 2 58.I ve deciso di aggiungere a questa vecchia Q, perché l'argomento è venuto di nuovo e io trovare preferibile per puntare a questa bella collezione di possibili soluzioni, mentre l'aggiunta mio introito che è diverso rispetto alle versioni precedenti in Clojure, come spiegato nella Un Forse possiamo costruire il Web s repository più completa delle implementazioni funzionali MOV-media - Micha Marczyk 2 marzo 10 a 0 20.Here sa parzialmente point gratuito una linea Haskell solution. First si applica coda alla lista per ottenere gli elenchi di code, so. Reverses e scende le prime voci p prendendo p come 2 caso here. In voi aren t familiarità con il simbolo del punto capezzolo, è l'operatore per la composizione funzionale, cioè passa l'output di una funzione come input di un altro, li compongono in una singola funzione gf mezzi eseguire f su un valore quindi passare l'output g , in modo da FGX è lo stesso di GFX in generale il suo utilizzo porta ad una più chiara style. It programmazione quindi mappa la funzione fromIntegral p somma prendere p sulla lista quindi per ogni lista nella lista ci vogliono i primi elementi p, li riassume, poi si divide loro da p Poi abbiamo appena capovolgere la lista di nuovo con reverse. This tutto sembra molto più inefficiente di quello che è invertire doesn t fisicamente invertire l'ordine di una lista fino a quando la lista viene valutata, semplicemente pone fuori nello stack buon ol code pigro Haskell doesn t anche creare tutte quelle liste separate, semplicemente riferimento a diverse sezioni della lista originale non ancora un grande soluzione, ma una linea long. Here sa soluzione leggermente migliore, ma più che utilizza mapAccum di fare una sottrazione di scorrimento e addition. First abbiamo diviso la lista in due parti ad p, so. Sum il primo bit. Zip il secondo bit con l'elenco originale questo a soli coppie off in ordine da due elenchi l'elenco originale è ovviamente più a lungo, ma si perde questo bit. Now supplementare si definisce una funzione per il nostro mapAccum ulator mapAccumL è la stessa mappa, ma con una corsa parametro accumulatore stato aggiunto, che è passato dalla mappatura precedente a quello successivo come mappa attraversa l'elenco usiamo l'accumulatore come la nostra media mobile, e come la nostra lista è formata l'elemento che ha appena lasciato la finestra scorrevole e l'elemento che appena entrato nella lista che abbiamo appena zip, la nostra funzione di scorrimento prende il primo numero x di distanza dalla media e aggiunge la seconda numero y Abbiamo poi passare i nuovi s lungo e il ritorno divisa per p snd seconda solo prende il secondo membro di una coppia tuple, che viene utilizzato per prendere la seconda valore di ritorno di mapAccumL, come mapAccumL tornerà l'accumulatore, nonché la mappatura list. For quelli di voi che non hanno familiarità con il simbolo è l'operatore di applicazione 'doesn t davvero fare nulla ma ha un basso ha la precedenza vincolante destra-associativo, in modo che significa che è possibile lasciare fuori le staffe prendono LISPers nota, iefx è la stessa f x. Running ma 4 2 0, 4 0, 7 0, 6 0, 3 0, 8 0, 12 0, 9 0, 4 0, 1 0 rendimenti 4 75, 5 0, 6 0, 7 25 , 8 0, 8 25, 6 5 sia per solution. Oh e che sarà necessario importare l'elenco del modulo per compilare entrambe le soluzioni. Daniel Grazie codice di scrittura è molto più facile che spiegarlo - si ve descritto l'essenza di esso Due liste flussi sono mantenuti in entrambe le funzioni e ottenere le loro teste tolti durante ogni iterazione Una lista flusso serve come la raccolta principale per scorrere attraverso, mentre l'altro lista stream, che è la stessa collezione, tranne dispone periodo inferiore Doppio prese fuori di esso, viene utilizzato nel calcolo del nuovo media mobile Walter Chang 24 9 agosto alle ore 17 19. il J linguaggio di programmazione facilita programmi come media mobile, infatti, ci sono un minor numero di caratteri in quanto in loro etichetta, spostando average. For i valori indicati in questa domanda compresi i valori del nome Ecco un modo semplice per codificare this. We può descrivere questa utilizzando etichette per gli esempi components. Both utilizzano esattamente lo stesso programma l'unica differenza è l'utilizzo di più nomi nella seconda forma Tali nomi possono aiutare i lettori che Non so J primaries. Let s sguardo un po 'più in quello che sta succedendo nel sottoprogramma, media denota sommatoria e denota la divisione come il segno classica Calcolo un conteggio conteggio degli articoli è fatto dal programma generale, poi, è la somma dei valori divisa per il conteggio del risultato valori. le del calcolo a media mobile scritto qui non include gli zeri iniziali ci si attende in domanda originale Quei zeri sono probabilmente non fa parte della tecnica calculation. The destinato usata qui si chiama programmazione tacita E 'praticamente la stessa come lo stile senza punto di funzionale programming. answered 26 10 agosto al 16 15.Here è Clojure finge di essere un linguaggio più funzionale Questo è completamente tail-ricorsiva, btw, e comprende leader zeroes. Usually ho messo il parametro di raccolta o di un elenco scorso per rendere la funzione più facile da curry Ma in Clojure. is così ingombrante, di solito finisce per fare this. in qual caso, si doesn t importa quale ordine i parametri go. answered 24 agosto 09 alle 4 56.Hi Jonathan, i m abbastanza nuovo a questa programmazione funzionale, la prego di spiegarmi come questo è tail-ricorsiva Grazie James P 24 agosto 09 al 14 38.The ricorsione accade sul if, in cui entrambe le opzioni si basa su RECUR consente di calcolare tutti i parametri prima, e solo allora ricorsivamente la risposta sarà il risultato di ripresentarsi come il risultato è lo stesso risultato restituito dal ricorsione, senza altri calcoli, questo è coda ricorsiva Daniel C Sobral 24 agosto 09 al 15 20.Questa esempio si avvale di stato, dal momento che per me sa soluzione pragmatica in questo caso, e una chiusura per creare la media function. It a finestre è ancora funzionale il senso di fare uso di funzioni di prima classe, anche se non è effetto collaterale liberare i due lingue che hai citato sia corsa in cima alla JVM e quindi sia permettono per lo stato di gestione quando necessary. answered 24 agosto 09 a 1 55.This soluzione è in Haskell, che è più familiare a me. answered 24 agosto 09 al 10 23.I come l'uso della dichiarazione partita ho provato a fare qualcosa di simile, ma potevo abbastanza rendono tutto il tragitto James P 24 agosto 09 al 14 39.A breve versione Clojure che ha il vantaggio di essere lunghezza lista O indipendentemente dalle period. This sfrutta il fatto che è possibile calcolare la somma di una serie di numeri con la creazione di una somma cumulativa della sequenza ad esempio 1 2 3 4 5 - 0 1 3 6 10 15 e poi sottraendo i due numeri con una uguale offset per la vostra period. Being ritardo sul partito, e nuovo di programmazione funzionale troppo, sono venuto a questa soluzione con un function. I interno adottato l'idea, per dividere l'intera lista per il periodo len in anticipo Poi ho generare la somma di iniziare con le len-primo-elementi e genero, i primi elementi validi 0 0, 0 0.Then ho ricorsivamente sottrarre il primo e aggiungere l'ultimo valore alla fine ho listify tutta thing. answered 29 apr 10 alla 19 28.In Haskell pseudocodice. Ora si dovrebbe davvero estratto il 4 out. answered 23 luglio 13 al 13 chiave 45.The è la funzione code, che associa un elenco a un elenco di copie della lista originale, con la proprietà che l'elemento n-esimo del risultato manca il primo n-1 elements. We applicare FMAP prendere avg n al risultato, il che significa che prendiamo il prefisso n-lunghezza dal sottolista, e calcolare la sua media Se la lunghezza della lista siamo avg ING non è n, allora non calcoliamo la media in quanto non è definito in questo caso, torniamo Niente Se lo è, che facciamo, e avvolgerlo in Proprio Infine, si corre catMaybes sul risultato di FMAP avg prendere n, per sbarazzarsi del Forse type. answered 21 ottobre 13 ad 1 29.I fu sorpreso e deluso dalle prestazioni di quello che mi sembrava la soluzione più idiomatiche Clojure, JamesCunningham s solutions. So qui combinazione sa pigro-ss della soluzione di James con s idea di adattare in rapido elevamento a spostare sums. Edit questo uno a base di soluzione su mikera s - è anche faster. answered 22 luglio 13 al 19 21.Your Answer.2017 Stack Exchange, Inc. Introduced in Spark 1 4, funzioni finestra Spark ha migliorato l'espressività di Spark DataFrames e Spark SQL con funzioni finestra, si può facilmente calcolare una somma media o cumulativa in movimento, o fare riferimento a un valore in una precedente riga di una finestra del tavolo funzioni ti permettono di fare molti calcoli comuni con DataFrames, senza dover ricorrere alla manipolazione RDD. aggregati, UDF vs finestra funzioni functions. Window sono complementari alle operazioni di aggregati dataframe esistenti, come somma e la media e UDF per rivedere, inerti calcolare un risultato, una somma o media, per ogni gruppo di righe, mentre UDF calcolare un risultato per ogni riga sulla base dei soli dati che fila al contrario, funzioni finestra calcola un risultato per ogni riga basata su una finestra di righe per esempio, in una media mobile, si calcolano per ogni riga della media delle righe circonda la riga corrente questo può essere fatto con finestra functions. Moving media Example. Let ci tuffiamo a destra in movimento esempio medio In questo esempio set di dati, ci sono due clienti che hanno speso diverse quantità di denaro ogni giorno. Costruire il dataframe cliente Tutti gli esempi sono scritti in Scala con Spark 1 6 1, ma lo stesso può essere fatto in Python o SQL. val clienti 2016-05-01, 50 00. Alice, 2016/05/03, 45 00. Alice , 2016/05/04, 55 00. Bob, 2016/05/01, 25 funzione 00.Window e definition. As finestra Spec mostrato nell'esempio di cui sopra, ci sono due parti per l'applicazione di una funzione di finestra 1 che specifica la funzione finestra, come ad esempio media nell'esempio, e 2, che specificano le specifiche della finestra, o wSpec1 nell'esempio Per 1, è possibile trovare un elenco completo delle funzioni della finestra qui, è possibile utilizzare le funzioni di cui alle funzioni di aggregazione e finestra Functions. For 2 specificando una finestra spec, ci sono tre componenti partizione, ordine da, e frame. Partition dal definisce come i dati vengono raggruppati nell'esempio di cui sopra, è stato da parte del cliente è necessario specificare un raggruppamento ragionevole, perché tutti i dati all'interno di un gruppo saranno raccolti al stessa macchina Idealmente, il dataframe è già stato diviso dal grouping. Order desiderata definisce come righe sono ordinate all'interno di un gruppo nell'esempio precedente, era di date. Frame definisce i limiti della finestra rispetto alla riga corrente nel sopra esempio, la finestra era compreso tra la riga precedente e quella successiva row. Cumulative Sum. Next, cerchiamo di calcolare la somma cumulativa della somma spesa per cliente. Finestra spec il telaio va dal principio alla riga corrente 0.val wSpec2 0. creare una nuova colonna che calcola la somma nel corso degli frame. Averages finestra definita semplici average. Averages media mobile semplice movimento si sono incoraggiati a risolvere questo compito in base alle la descrizione dell'attività, utilizzando qualsiasi linguaggio che si può knowputing la media mobile semplice di una serie di numbers. Create un'istanza di classe funzione di stateful che prende un periodo e restituisce una routine che prende un numero come argomento e restituisce una media mobile semplice dei suoi argomenti così far. A media mobile semplice è un metodo per calcolare una media di un flusso di numeri soltanto la media degli ultimi numeri P dal flusso, dove P è conosciuto come il period. It può essere implementata usando una routine sigla P come argomento, IP, che dovrebbe poi tornare una routine che quando ha chiamato con i singoli, i membri successivi di un flusso di numeri, calcola la media di fino a, l'ultimo P di loro, permette di chiamare questa parola stateful SMA. The nella descrizione compito si riferisce alla necessità di SMA a ricordare determinate informazioni tra le chiamate al it. The periodo, P. An ordinato contenitore di almeno gli ultimi numeri P da ciascuno dei suoi singoli calls. Stateful significa anche che le chiamate successive a i, l'inizializzatore, dovrebbero tornare routine separate che non condividono stato salvato in modo che potessero essere utilizzati su due flussi indipendenti di data. Pseudo-codice per un'implementazione di versione SMA is. This utilizza una coda permanente per contenere i valori p più recenti Ogni funzione tornato da init-moving - average ha il suo stato in un atomo tiene una implementazione value. This coda usa una lista circolare per memorizzare i numeri all'interno della finestra all'inizio di ogni iterazione puntatore si riferisce alla cella lista che contiene il valore semplicemente spostando fuori dalla finestra e essere sostituito con value. Using l'appena aggiunto una chiusura edit. Currently questa tecnica SMA può t essere nogc perché assegna una chiusura sul mucchio Alcune analisi di fuga potrebbe rimuovere il mucchio allocation. Using una versione Struct edit. This evita l'assegnazione mucchio di la chiusura mantenere i dati in stack frame della funzione principale stessa output. To evitare la virgola mobile approssimazioni tenere accumulando e crescente, il codice può eseguire una somma periodica sulla intera implementazione circolare array. This code produce due oggetti funzione condivisione stato è idiomatica in E separare ingresso dall'uscita leggere dalla scrittura invece di combinare in un'unica struttura object. The è lo stesso come l'attuazione di deviazione standard programma elisir E. The seguito genera una funzione anonima con un periodo p incorporato, che è usato come il periodo della media mobile semplice la funzione corsa legge l'input numerico e lo passa alla funzione anonima appena creato e poi ispeziona il risultato di STDOUT. The uscita di seguito è mostrata, con la media, quindi l'ingresso raggruppati, formando la base di ogni movimento average. Erlang ha chiusure, ma le variabili immutabili una soluzione quindi è quella di utilizzare i processi e un semplice messaggio di passaggio lingue API. Matrix basati hanno routine per calcolare la avarages scivolando per una data sequenza di items. It è meno efficiente ciclo come nel seguente commands. Continuously richiede un ingresso I che viene aggiunto alla fine di un elenco L1 L1 può essere trovato premendo 2ND 1, e media può essere trovato in list OPS. Press ON per terminare l'program. Function che restituisce una lista contenente i dati medi del argument. Program dotazione che restituisce un valore semplice ad ogni invocation. list l'elenco di essere media P è il periodo di 5 restituisce il list. Example media 2 Utilizzando il programma movinav2 i, 5 - Inizializzazione in movimento calcolo della media, e definire periodo di 5 movinav2 3, xx - i nuovi dati nel valore lista 3, e il risultato sarà memorizzato in x variabile, e visualizzato movinav2 4, xx - nuovi dati il ​​valore 4, e il nuovo risultato sarà memorizzato su variabile x, e visualizzati 4 3 2.Description della funzione movinavg variabile r - è il risultato della lista media che verrà restituito variabile i - è la variabile indice, e che punti alla fine del sub-lista l'elenco in fase media variabile z - una funzione di supporto variable. The utilizza variabile i per determinare quali valori della lista saranno considerati nel prossimo calcolo della media ad ogni iterazione, variabile I punti per l'ultimo valore nell'elenco che verrà utilizzato nel calcolo medio Così abbiamo solo bisogno di capire quale sarà il primo valore nella lista di solito abbiamo ll considerare elementi p, in modo che il primo elemento sarà quello indicizzato da ip 1 Tuttavia sulle prime iterazioni che il calcolo in genere è negativo, in modo che il seguente equazione eviterà indici negativi max ip 1,1 o organizzare l'equazione, ip max, 0 1 ma il numero di elementi sulle prime iterazioni sarà anche più piccola, il valore corretto sarà index end - iniziare indice 1 o, disponendo l'equazione, i - ip max, 0 1 1, e poi ip, i-max, 0 Z variabile detiene il mAX IP valore comune, 0 in modo che il beginIndex sarà z 1 e le NumberOfElements saranno iz. mid lista, z 1 , Iz restituirà l'elenco dei valori che saranno in media somma sarà riassumere li riassumono iz ri loro sarà media e memorizzare il risultato nel posto appropriato nel list. fp1 risultato crea una parziale applicazione fissa i in questo caso il secondo e il terzo parametro .

No comments:

Post a Comment