Come confrontare le caratteristiche di due curve?

11

Ho bisogno di confrontare due curve f (x) e g (x). Sono nello stesso intervallo x (da -30 a 30). f (x) potrebbe presentare picchi taglienti o picchi e valli uniformi. g (x) può avere gli stessi picchi e valli. Se è così voglio una misura su come queste caratteristiche coincidano senza l'ispezione visiva. Ho provato a risolvere questo problema nel modo seguente.

  1. Normalizza entrambe le funzioni dividendo ciascun punto dati per l'area totale della funzione. Ora l'area della funzione normalizzata è 1.0
  2. Ad ogni x ottiene il valore minimo di f (x) eg (x). Questo mi darà una nuova funzione che fondamentalmente è l'area di sovrapposizione tra f (x) e g (x).
  3. Quando integro la funzione risultante del passo 2 ottengo l'area di sovrapposizione totale da 1.0

Tuttavia questo non mi dice se i picchi e le valli coincidono o meno. Non sono sicuro che ciò possa essere fatto, ma se qualcuno conosce un metodo, gradirei il tuo aiuto.

== EDIT == Per chiarimenti ho incluso un'immagine.

La differenza tra le due curve (nero e blu) potrebbe non essere la stessa ma avrà forme complementari.

Sfondo: Le funzioni sono la densità di stati proiettata (PDOS) degli orbitali atomici di un composto. Quindi ho degli stati per gli orbitali s, p, d. Voglio determinare se il materiale ha ibridazioni s-p, p-d o d-d (miscelazione orbitale). L'unico dato che ho è il PDOS. Se si dice che il PDOS di s orbital (funzione f (x)) ha i picchi e le valli come alle stesse energie (valori x) del PDOS di p orbital (funzione g (x)) allora c'è s-p che si mescola in quel materiale.

    
posta laalee 22.11.2013 - 22:16
fonte

5 risposte

4

Questo è un problema comune e spesso difficile in chimica analitica, fisica, spettroscopia, ecc. Gli approcci utilizzati possono andare dal semplice confronto RMSD a metodi molto sofisticati. Se il compito non è facile da eseguire con l'ispezione visiva (gli esseri umani sono squisitamente sviluppati per il riconoscimento delle funzioni), allora sarà probabilmente difficile da fare computazionalmente.

Un approccio è provare a rimuovere le "linee di base" in modo tale che le funzioni siano a valore zero eccetto dove ci sono caratteristiche di picco o di valle. Questo è il modo migliore per adattare la curva usando un polinomio di basso ordine o, meglio ancora, un modello basato su principi più appropriati di ciò che la linea di base può e dovrebbe avere. Se i picchi sono molto nitidi, puoi semplicemente lisciare la funzione e sottrarre la funzione levigata dalla funzione originale.

Dopo aver rimosso la linea di base, è possibile normalizzare e generare residui o fare RMSD (approcci semplici) o provare a rilevare le caratteristiche di picco / valle inserendo un gaussiano (o qualsiasi altro modello appropriato) per ciascuna caratteristica ricercata. Se riesci ad adattare i picchi, puoi confrontare le posizioni dei picchi e le mezze larghe.

Dai un'occhiata a SciPy se conosci Python. Buona fortuna.

    
risposta data 22.11.2013 - 23:10
fonte
3

Questo è solo "in cima alla mia testa", quindi potrei fraintendere completamente il problema, ma forse potresti applicare un root-mean-square distance (RMSD) alle funzioni. Se sei interessato solo ai picchi e alle valli, applicalo alle aree attorno a quelle vette e valli (cioè, per qualche x +/- qualche epsilon dove la derivata di entrambe le funzioni è zero). Se il RMSD di quell'intervallo è vicino allo zero, allora hai una buona corrispondenza, credo.

    
risposta data 22.11.2013 - 22:39
fonte
3

Siccome non lo comprendo, le informazioni che stai cercando sono trasmesse dal "tableau des variations" della funzione: mi dispiace molto che non conosca il nome inglese per questo!

Questa tabella è associata a una funzione differenziabile f e tu la costruisci trovando le radici di f ' e determina il segno di f' su ogni intervallo tra questi zeri.

Quindi, se gli zeri di f ' e g' coincidono più o meno e i segni di queste funzioni sono d'accordo, avranno un profilo simile.

La prima cosa che proverei a programmare sarebbe:

  1. Seleziona un piccolo ε
  2. Disegna a caso un numero elevato N di punti x [i] nell'intervallo in cui sono definite le funzioni.

  3. Per ogni nodo, calcola le differenze F [i] = f (x [i] + ε) - f (x [i] - ε) e G [ i] = g (x [i] + ε) - g (x [i] - ε) .

  4. Se in ogni nodo, F [i] e G [i] sono entrambi più piccoli di ε² OPPURE hanno entrambi stesso segno, concludi che le due funzioni hanno quasi lo stesso profilo.

Funziona?

    
risposta data 23.11.2013 - 12:24
fonte
1

Forza bruta: scopri il valore float non zero più piccolo con questo valore come passo, passa attraverso l'intero dominio e verifica se i valori sono uguali?

== EDIT ==

Hmmm ... Se per "la stessa forma" intendi g (x) = c * f (x), questa soluzione dovrebbe essere modificata - per ogni elemento del dominio si calcola f (x) / g (x) e controlla se il risultato è lo stesso per ogni punto (ovviamente, se g (x) == 0, allora controlli se f (x) == 0, non stai cercando di dividere).

Se "la stessa forma" significa "ottimums locali e punti di piegatura sono gli stessi" ... Bene, trova gli ottimums locali e i punti di piegatura per f (x) eg (x) (come set di elementi del dominio) e controlla , se questi set sono uguali.

Terza opzione: f (x) = g (x) + c. Basta controllare se ogni elemento del dominio ha la stessa differenza f (x) -g (x). È quasi identico al primo caso, ma invece della divisione hai differenza.

== ANCORA UN ALTRO MODIFICA ==

Bene ... Il secondo approccio della modifica sopra può essere utile. Inoltre, puoi unirlo con il segno di confronto del primo dervativo (non simbolico, ma calcolato come df (x) = f (x) - f (x-step)). Se entrambe le funzioni hanno lo stesso segno di derivata nell'intero dominio, controlla le ottimhe e i punti di piegatura, solo per essere sicuro. Direi che queste condizioni dovrebbero essere sufficienti per fare ciò di cui hai bisogno.

    
risposta data 22.11.2013 - 22:18
fonte
1

how well these features coincide without visual inspection.

Probabilmente il modo più semplice è quello di calcolare il coefficiente di correlazione di Pearson . Vale a dire, usa f (x) come X e g (x) come Y. Effettivamente "trama g (x) come funzione di f (x) e vedi come forma una linea retta".

Il coefficiente di correlazione è popolare perché è facile da calcolare ed è spesso giustificato semplicemente agitando le mani. Potrebbe essere una buona approssimazione iniziale per alcuni usi, ma sicuramente non è una panacea.

Per ottenere risultati migliori nelle applicazioni del mondo reale, è necessario capire cosa sta succedendo nei dati, cioè il processo che genera i dati. Spesso c'è una sorta di sfondo e le caratteristiche interessanti passano in secondo piano. Se si buttano tutti i dati in una scatola nera, si può finire per confrontare principalmente gli sfondi: la scatola nera non sa quale parte dei dati è la parte interessante. Quindi, per ottenere risultati migliori, è spesso una buona idea rimuovere gli sfondi in qualche modo e quindi confrontare ciò che hai lasciato. Raccordando linee o curve o medie e sottraendoli o dividendoli, filtro basso, banda o passa-alto, alimentando i dati attraverso alcune funzioni non lineari ... tu dai il nome.

Non c'è sicuramente una sola risposta giusta. Avrai tanti risultati diversi mentre provi i metodi. Ma alcuni risultati sono migliori di alcuni di loro. Il ragionamento teorico può aiutare a iniziare nella giusta direzione, ma come impostare i parametri e perfezionare il tuo metodo, in definitiva può essere trovato solo provandoli e confrontando i risultati del mondo reale.

    
risposta data 27.11.2013 - 11:00
fonte

Leggi altre domande sui tag