Thursday 28 September 2017

Numpy Mobile Media Convolve


Im scrivere una funzione media mobile che utilizza la funzione convolve in NumPy, che dovrebbe essere equivalente a un (media mobile ponderata). Quando i miei pesi sono tutti uguali (come in una semplice media arithmatic), funziona benissimo: Tuttavia, quando si tenta di utilizzare una media ponderata al posto del (per gli stessi dati) 3.667,4.667,5.667,6.667. Mi aspetto, ottengo Se rimuovo la bandiera valido, io non vedo anche i valori corretti. Mi piacerebbe davvero usare convolve per il WMA e MA in quanto rende il codice più pulito (stesso codice, pesi differenti) ed al contrario penso che il Ill deve scorrere tutti i dati e prendere le fette. Tutte le idee su questo behaviorWe precedentemente introdotte come creare medie mobili utilizzando Python. Questo tutorial sarà una continuazione di questo argomento. Una media mobile nel contesto delle statistiche, chiamata anche media rollingrunning, è un tipo di risposta all'impulso finita. Nel nostro precedente tutorial abbiamo tracciato i valori degli array X e Y: trama Let8217s x contro la media mobile di y che chiameremo Yma: In primo luogo, let8217s pareggiare la lunghezza di entrambi gli array: E per mostrare in questo contesto: La risultante grafico: Per aiutare a capire questo, let8217s trama due diversi rapporti: x vs Y e x vs maggio: la media mobile ecco la trama verde che inizia alle 3: Condividi questo: in questo modo: Messaggio di navigazione Lascia un commento Cancella risposta Molto utile I vorrebbe leggere l'ultima parte su grandi insiemi di dati auguriamo che possa venire soon8230 blogger D ti piace questa: so che questa è una vecchia questione, ma qui è una soluzione che pretende molto utilizzare strutture dati aggiuntivi o librerie. E 'lineare nel numero di elementi della lista di input e non riesco a pensare a nessun altro modo per renderlo più efficiente (in realtà se qualcuno sa di un modo migliore per allocare il risultato, per favore fatemelo sapere). NOTA: questo sarebbe molto più veloce utilizzando una matrice NumPy invece di una lista, ma ho voluto eliminare tutte le dipendenze. Sarebbe anche possibile migliorare le prestazioni di esecuzione multi-threaded La funzione presuppone che la lista di input è una dimensione, quindi fate attenzione. UPD: soluzioni più efficienti sono state proposte da Alleo e jasaarim. È possibile utilizzare np. convolve per questo: L'argomento modalità specifica come gestire i bordi. Ho scelto la modalità valida qui perché credo che sia così come la maggior parte delle persone si aspettano che eseguono media al lavoro, ma si possono avere altre priorità. Ecco un grafico che illustra la differenza tra le modalità: una risposta 24 marzo 14 a 22:01 Mi piace questa soluzione perché è pulito (una riga) e relativamente efficiente (il lavoro svolto all'interno NumPy). Ma Alleo39s quotEfficient solutionquot utilizzando numpy. cumsum ha una migliore complessità. ndash Ulrich Stern 25 settembre 15 a 00:31 È possibile calcolare significa una corsa con: Per fortuna, NumPy include una funzione convolve che possiamo utilizzare per accelerare le cose. La media mobile è equivalente a convoluzione x con un vettore che è N lungo, con tutti i membri pari a 1N. L'attuazione del NumPy convolve comprende il transitorio di avviamento, quindi bisogna rimuovere i primi N-1 punti: Sulla mia macchina, la versione veloce è 20-30 volte più veloce, a seconda della lunghezza del vettore di ingresso e la dimensione della finestra media . Si noti che convolve non includere una stessa modalità che sembra che dovrebbe affrontare la questione partendo transitorio, ma divide tra l'inizio e la fine. Rimuove il transitorio tra la fine e l'inizio doesn39t hanno uno. Beh, credo che it39s una questione di priorità, ho bisogno di don39t lo stesso numero di risultati sul scapito di ottenere una pendenza a zero che non ci isn39t nei dati. A proposito, ecco un comando per mostrare la differenza tra le modalità: modalità (39full39, 39same39, 39valid39) trama (convolve (quelli ((200,)), quelli ((50,)) 4750, modem)) per m in modalità asse (-10, 251, -.1, 1.1) leggenda (modalità, loc39lower center39) (con pyplot e NumPy importate). lapis ndash Mar 24 14 in 13:56 panda è più adatto per questo che NumPy o SciPy. La sua funzione rollingmean fa il lavoro comodamente. Inoltre restituisce una matrice NumPy quando l'ingresso è un array. E 'difficile da battere rollingmean in termini di prestazioni con qualsiasi implementazione pura personalizzato Python. Ecco un esempio prestazioni contro due delle soluzioni proposte: Ci sono anche belle opzioni di come trattare con i valori bordo. I39m sempre infastidito dalla funzione di elaborazione del segnale di ritorno, segnali di uscita di forma diversa rispetto ai segnali di ingresso quando entrambi gli ingressi e le uscite sono della stessa natura (ad esempio due segnali temporali). Si rompe la corrispondenza con la variabile relativa indipendente (ad esempio il tempo, frequenza) rendendo stampa o confronto non una questione diretta. in ogni caso, se si condivide la sensazione, si potrebbe desiderare di cambiare le ultime righe della funzione proposta come ynp. convolve (ww. sum (), s, mode39same39) ritorno ywindowlen-1 :-( windowlen-1) ndash Christian O39Reilly agosto 25 15 alle 19:56 Un po 'in ritardo alla festa, ma Ive ha reso la mia piccola funzione che non avvolgono le estremità o tamponi con zeri che vengono poi utilizzati per trovare la media pure. Come ulteriore trattamento è, che anche ri-campioni del segnale in punti distanziati in modo lineare. Personalizzare il codice a piacimento per ottenere altre caratteristiche. Il metodo è una semplice moltiplicazione della matrice con un kernel gaussiano normalizzato. Un utilizzo semplice su un segnale sinusoidale con il rumore distribuito normale aggiunto: Questa domanda è ora ancora più vecchio di quando NeXuS ha scritto su di esso il mese scorso, ma mi piace come il suo codice si occupa di casi limite. Tuttavia, perché è una media mobile semplice, i risultati in ritardo i dati che si riferiscono. Ho pensato che si occupano di casi limite in modo più soddisfacente rispetto alle modalità NumPys validi. stesso. e pieno potrebbe essere realizzato applicando un approccio simile a un metodo basato convoluzione (). Il mio contributo usa una media centrale di esecuzione di allineare i propri risultati con i loro dati. Quando ci sono due alcuni punti disponibili per la finestra ingrandita da utilizzare, medie correnti sono calcolati dalle finestre sempre più piccoli ai bordi della matrice. In realtà, dalle finestre successivamente più grandi, ma questo è un dettaglio di implementazione. La sua relativamente lento perché utilizza convolve (). e potrebbe probabilmente essere ripulito un bel po 'da un vero Pythonista, però, credo che l'idea sta. ha risposto 2 gennaio a 0:28 np. convolve è bello ma lento quando la larghezza della finestra cresce di grandi dimensioni. Alcune risposte forniscono algoritmi più efficiente con np. cumsum ma sembrano incapaci di gestire i valori bordo. Io stesso ho implementato un algoritmo che può gestire questo problema e, se questo problema è dichiarata come: mergenum parametro di ingresso può essere pensato come 2 WindowWidth 1. So che questo codice è un po 'illeggibile se u trovare utile e vogliono alcuni expanations, per favore fatemelo sapere e aggiornamento Ill questa risposta. (Dopo aver scritto una spiegazione può costare me un sacco di tempo, spero lo faccio solo quando qualcuno ha bisogno prego di perdonarmi per la mia pigrizia :).) Se solo la u è interessata nella sua versione originale: la sua ancora più illeggibile: la prima soluzione si libera di problema bordo da zeri imbottitura intorno la matrice, ma la seconda soluzione postato qui gestisce in modo duro e diretto :) lapis sì, ma permette di dire si utilizza il metodo cumSum al primo segno di spunta e salvare l'array media mobile per la successivo tick. ogni tick da allora in poi non resta che aggiungere il valore medio più recente di trasferirsi a l'array di laminazione in deposito. Utilizzando questo metodo you39re non ricalcolare le cose you39ve già calcolati: Al primo segno di spunta si cumSum da allora in poi si basta aggiungere il quotmean dell'ultimo elementsquot periodo che è 2x più veloce per tutte le zecche successive. ndash litepresence 10 Giugno 16 a 00:29 Se si sceglie di rotolare il proprio, piuttosto che utilizzare una libreria esistente, si prega di essere consapevoli di galleggiare errore del punto e cercare di ridurre al minimo i suoi effetti: Se tutti i valori sono più o meno dello stesso ordine di grandezza , allora questo aiuterà a preservare la precisione con l'aggiunta di sempre valori di grandezze più o meno simili. Nel mio ultimo periodo stavo cercando di spiegare perché aiuta errore in virgola mobile. Se due valori sono approssimativamente dello stesso ordine di grandezza, aggiungendo poi li perde meno precisione rispetto se si aggiunge un numero molto grande di una molto piccola. Il codice combina valori quotadjacentquot in modo che anche le somme intermedie dovrebbero sempre essere ragionevolmente vicino in grandezza, per ridurre al minimo l'errore in virgola mobile. Nulla è infallibile ma questo metodo ha salvato un paio di progetti molto male implementati in produzione. ndash Mayur Patel 15 dicembre 14 a 17:22 Alleo: Invece di fare una somma per ogni valore, you39ll essere facendo due. La prova è lo stesso come il problema bit-flipping. Tuttavia, il punto di questa risposta non è necessariamente prestazioni, ma precisione. L'utilizzo della memoria per una media di valori a 64 bit non superi 64 elementi nella cache, in modo gentile it39s dell'utilizzo della memoria pure. ndash Mayur Patel 29 dicembre 14 a 17:04

No comments:

Post a Comment