J'ai besoin de comparer deux courbes f (x) et g (x). Ils sont dans la même gamme x (disons -30 à 30). f (x) peut avoir des pics nets ou des pics et des vallées lisses. g (x) peut avoir les mêmes pics et vallées. Si c'est le cas, je veux une mesure sur la façon dont ces caractéristiques coïncident sans inspection visuelle. J'ai essayé de résoudre ce problème de la manière suivante.
- Normalisez les deux fonctions en divisant chaque point de données par la surface totale de la fonction. Maintenant, l'aire de la fonction normalisée est de 1,0
- À chaque x, obtenez la valeur minimale de f (x) et g (x). Cela me donnera une nouvelle fonction qui est essentiellement la zone de chevauchement entre f (x) et g (x).
- Lorsque j'intègre la fonction résultante de l'étape 2, j'obtiens la zone de chevauchement totale sur 1,0
Cependant cela ne me dit pas si les pics et les vallées coïncident ou non. Je ne sais pas si cela peut être fait mais si quelqu'un connaît une méthode, j'apprécierais votre aide.
== EDIT == Pour clarification, j'ai inclus une image.
La différence entre les deux courbes (noir et bleu) peut ne pas être la même mais aura des formes complémentaires.
Contexte: Les fonctions sont la densité projetée d'états (PDOS) des orbitales atomiques d'un composé. J'ai donc des états pour les orbitales s, p, d. Je veux déterminer si le matériau a des hybridations sp, pd ou dd (mélange orbital). Les seules données dont je dispose sont les PDOS. Si, par exemple, le PDOS de l'orbitale s (fonction f (x)) a les pics et les vallées aux mêmes énergies (valeurs x) du PDOS de l'orbitale p (fonction g (x)), il y a un mélange de sp dans ce matériau.
Réponses:
Il s'agit d'un problème courant et souvent difficile en chimie analytique, physique, spectroscopie, etc. Les approches utilisées peuvent aller de la simple comparaison RMSD à des méthodes très sophistiquées. Si la tâche n'est pas facile à faire par inspection visuelle (les humains sont extrêmement développés pour la reconnaissance des fonctionnalités), il sera probablement difficile de le faire par calcul.
Une approche consiste à essayer de supprimer les «lignes de base» afin que les fonctions soient à valeur nulle, sauf lorsqu'il existe des caractéristiques de pic ou de vallée. Cela est mieux fait avec l'ajustement de courbe en utilisant un polynôme d'ordre inférieur ou, mieux encore, un modèle de principe plus approprié de ce à quoi la ligne de base peut et devrait ressembler. Si les pics sont très nets, vous pouvez simplement lisser la fonction et soustraire la fonction lissée de la fonction d'origine.
Après avoir supprimé la ligne de base, vous pouvez normaliser et générer des résidus ou effectuer des RMSD (approches simples) ou essayer de détecter les caractéristiques de pic / vallée en adaptant un gaussien (ou tout autre modèle approprié) à chaque caractéristique que vous recherchez. Si vous pouvez ajuster les pics, vous pouvez comparer les emplacements des pics et les demi-largeurs.
Jetez un œil à SciPy si vous connaissez Python. Bonne chance.
la source
C'est juste "au dessus de ma tête", donc je pourrais mal comprendre le problème, mais peut-être pourriez-vous appliquer une distance quadratique moyenne (RMSD) aux fonctions. Si vous êtes juste intéressé par les pics et les vallées, appliquez-le aux zones autour de ces pics et de la vallée (c'est-à-dire, pour certains x +/- certains epsilon où la dérivée de l'une ou l'autre fonction est nulle). Si le RMSD de cette plage est proche de zéro, alors vous avez une bonne correspondance, je pense.
la source
Comme je le comprends, les informations que vous recherchez sont véhiculées par le «tableau des variations» de la fonction - je suis vraiment désolé de ne pas connaître le nom anglais pour cela!
Ce tableau est associé à une fonction dérivable f et vous la construisez en trouvant les racines de f ' et déterminez le signe de f' sur chaque intervalle entre ces zéros.
Ainsi, si les zéros de f ' et g' coïncident plus ou moins et que les signes de ces fonctions s'accordent, ils auront un profil similaire.
La première chose que j'essaierais de programmer serait:
Dessinez au hasard un grand nombre N de points x [i] dans l'intervalle où les fonctions sont définies.
Pour chaque nœud, calculez les différences F [i] = f (x [i] + ε) - f (x [i] - ε) et G [i] = g (x [i] + ε) - g (x [i] - ε) .
Si à chaque nœud, F [i] et G [i] sont tous deux plus petits que ε² OU ont tous les deux le même signe, concluez que les deux fonctions ont presque le même profil.
Est-ce que ça marche?
la source
Force brute: trouver la plus petite valeur flottante non nulle avec cette valeur comme étape, parcourir tout le domaine et vérifier si les valeurs sont égales?
== EDIT ==
Hmmm ... Si par "la même forme" vous voulez dire g (x) = c * f (x), cette solution doit être modifiée - pour chaque élément de domaine vous calculez f (x) / g (x) et vérifiez si le résultat est le même pour chaque point (bien sûr, si g (x) == 0, alors vous vérifiez si f (x) == 0, vous n'essayez pas de diviser).
Si "la même forme" signifie "les optimums locaux et les points de flexion sont les mêmes" ... Eh bien, trouvez les optimums locaux et les points de flexion pour f (x) et g (x) (en tant qu'ensembles d'éléments de domaine) et vérifiez, si ceux-ci les ensembles sont égaux.
Troisième option: f (x) = g (x) + c. Vérifiez simplement si chaque élément du domaine a la même différence f (x) -g (x). C'est presque identique au premier cas, mais au lieu de la division, vous avez une différence.
== ENCORE UNE AUTRE MODIFICATION ==
Eh bien ... La deuxième approche de l'édition ci-dessus peut être utile. En outre, vous pouvez le fusionner en comparant le signe de la première dervative (non symbolique, mais calculé comme df (x) = f (x) - f (x-step)). Si les deux fonctions ont le même signe de dérivée dans tout le domaine, vérifiez les optimas et les points de flexion, juste pour être sûr. Je dirais que ces conditions devraient être suffisantes pour faire ce dont vous avez besoin.
la source
La façon la plus simple est probablement de calculer le coefficient de corrélation de Pearson . Autrement dit, utilisez votre f (x) comme X et g (x) comme Y. Effectivement "tracez g (x) en fonction de f (x) et voyez à quel point il forme une ligne droite".
Le coefficient de corrélation est populaire car il est facile à calculer et est souvent justifié simplement en agitant les mains. Cela peut être une bonne approximation initiale pour certaines utilisations, mais ce n'est certainement pas une panacée.
Pour obtenir de meilleurs résultats dans des applications du monde réel, vous devez comprendre ce qui se passe dans les données, c'est-à-dire le processus qui génère les données. Souvent, il y a une sorte de fond , et les fonctionnalités intéressantes se superposent à ce fond. Si vous jetez toutes les données dans une boîte noire, vous pouvez finir par comparer principalement les arrière-plans: la boîte noire ne sait pas quelle partie des données est la partie intéressante. Donc, pour obtenir de meilleurs résultats, c'est souvent une bonne idée de supprimer les arrière-plans, puis de comparer ce qui vous reste. Ajuster des lignes ou des courbes ou des moyennes et soustraire ou diviser par celles-ci, filtrage passe-bas, bande ou passe-haut, alimenter les données via une fonction non linéaire ... vous l'appelez.
Il n'y a certainement pas de bonne réponse. Vous obtiendrez autant de résultats différents que vous essayez de méthodes. Mais certains résultats sont meilleurs que certains. Le raisonnement théorique peut aider à démarrer dans la bonne direction, mais comment définir des paramètres et affiner votre méthode ne peut finalement être trouvé qu'en les essayant et en comparant les résultats réels.
la source