Un altro approccio (più parole, meno codice) che può aiutare:
Le posizioni dei massimi e dei minimi locali sono anche le posizioni degli incroci per lo zero della derivata prima. In genere è molto più facile trovare incroci per lo zero che trovare direttamente massimi e minimi locali.
Sfortunatamente, la derivata prima tende ad "amplificare" il rumore, quindi quando è presente un rumore significativo nei dati originali, la derivata prima è utilizzata al meglio solo dopo che ai dati originali è stato applicato un certo grado di attenuazione.
Poiché lo smoothing è, nel senso più semplice, un filtro passa-basso, lo smoothing è spesso il migliore (beh, più facilmente) fatto usando un kernel di convoluzione, e "modellando" quel kernel può fornire una quantità sorprendente di capacità di preservare / migliorare le funzionalità . Il processo per trovare un kernel ottimale può essere automatizzato utilizzando una varietà di mezzi, ma il migliore potrebbe essere la semplice forza bruta (molto veloce per trovare piccoli kernel). Un buon kernel distorcerà (come previsto) in maniera massiccia i dati originali, ma NON influenzerà la posizione dei picchi / avvallamenti di interesse.
Fortunatamente, molto spesso un kernel adatto può essere creato tramite un semplice SWAG ("ipotesi istruita"). La larghezza del kernel levigante dovrebbe essere un po 'più ampia del picco "interessante" atteso più ampio nei dati originali, e la sua forma assomiglierà a quel picco (un wavelet a scala singola). Per i kernel che conservano la media (quello che dovrebbe essere un buon filtro smoothing) la somma degli elementi del kernel dovrebbe essere esattamente uguale a 1.00, e il kernel dovrebbe essere simmetrico rispetto al suo centro (il che significa che avrà un numero dispari di elementi.
Dato un kernel smoothing ottimale (o un piccolo numero di kernel ottimizzati per diversi contenuti di dati), il grado di smoothing diventa un fattore di scala per (il "guadagno" del) kernel di convoluzione.
La determinazione del grado "corretto" (ottimale) di livellamento (guadagno del kernel di convoluzione) può anche essere automatizzata: confrontare la deviazione standard dei dati della prima derivata con la deviazione standard dei dati livellati. Il modo in cui il rapporto tra le due deviazioni standard cambia con i cambiamenti nel grado di camma di livellamento può essere utilizzato per prevedere i valori di livellamento effettivi. Alcune esecuzioni manuali di dati (che sono veramente rappresentative) dovrebbero essere tutto ciò che serve.
Tutte le soluzioni precedenti pubblicate sopra calcolano la derivata prima, ma non la trattano come una misura statistica, né le soluzioni di cui sopra tentano di eseguire il livellamento di conservazione / miglioramento delle caratteristiche (per aiutare i picchi sottili a "saltare sopra" il rumore).
Infine, la cattiva notizia: trovare picchi "reali" diventa un vero dolore quando il rumore ha anche caratteristiche che sembrano picchi reali (larghezza di banda sovrapposta). La prossima soluzione più complessa è generalmente quella di utilizzare un kernel di convoluzione più lungo (una "apertura del kernel più ampia") che tenga conto della relazione tra picchi "reali" adiacenti (come velocità minime o massime per l'occorrenza dei picchi), o di utilizzare più la convoluzione passa utilizzando kernel di larghezza diversa (ma solo se è più veloce: è una verità matematica fondamentale che le convoluzioni lineari eseguite in sequenza possono sempre essere convolte insieme in una singola convoluzione). Ma spesso è molto più facile trovare prima una sequenza di kernel utili (di larghezza variabile) e convolgerli insieme piuttosto che trovare direttamente il kernel finale in un unico passaggio.
Si spera che questo fornisca informazioni sufficienti per consentire a Google (e forse un buon testo delle statistiche) di colmare le lacune. Vorrei davvero avere il tempo di fornire un esempio funzionante o un collegamento a uno. Se qualcuno ne trova uno online, pubblicalo qui!