Ich muss zwei Kurven f (x) und g (x) vergleichen. Sie liegen im gleichen x-Bereich (z. B. -30 bis 30). f (x) kann einige scharfe Spitzen oder glatte Spitzen und Täler aufweisen. g (x) kann die gleichen Spitzen und Täler haben. Wenn ja, möchte ich messen, wie gut diese Merkmale ohne Sichtprüfung übereinstimmen. Ich habe versucht, dieses Problem folgendermaßen zu lösen.
- Normalisieren Sie beide Funktionen, indem Sie jeden Datenpunkt durch die Gesamtfläche der Funktion teilen. Jetzt ist der Bereich der normalisierten Funktion 1.0
- Bei jedem x erhalten Sie den Minimalwert aus f (x) und g (x). Dies gibt mir eine neue Funktion, die im Grunde der Überlappungsbereich zwischen f (x) und g (x) ist.
- Wenn ich die resultierende Funktion von Schritt 2 integriere, erhalte ich die gesamte Überlappungsfläche von 1,0
Dies sagt mir jedoch nicht, ob die Gipfel und Täler zusammenfallen oder nicht. Ich bin nicht sicher, ob dies möglich ist, aber wenn jemand eine Methode kennt, würde ich mich über Ihre Hilfe freuen.
== EDIT == Zur Verdeutlichung habe ich ein Bild beigefügt.
Der Unterschied zwischen den beiden Kurven (schwarz und blau) ist möglicherweise nicht gleich, hat jedoch komplementäre Formen.
Hintergrund: Die Funktionen sind projizierte Zustandsdichte (PDOS) von Atomorbitalen einer Verbindung. Ich habe also Zustände für s-, p- und d-Orbitale. Ich möchte feststellen, ob das Material sp-, pd- oder dd-Hybridisierungen aufweist (Orbitalmischung). Die einzigen Daten, die ich habe, sind die PDOS. Wenn beispielsweise das PDOS des s-Orbitals (Funktion f (x)) die Spitzen und Täler wie bei den gleichen Energien (x-Werten) des PDOS des p-Orbitals (Funktion g (x)) aufweist, wird in diesem Material sp gemischt.
Antworten:
Dies ist ein häufiges und oft schwieriges Problem in der analytischen Chemie, Physik, Spektroskopie usw. Die verwendeten Ansätze können vom einfachen RMSD-Vergleich bis zu sehr ausgefeilten Methoden reichen. Wenn die Aufgabe durch visuelle Inspektion nicht einfach zu erledigen ist (Menschen sind für die Erkennung von Merkmalen exquisit entwickelt), ist es wahrscheinlich schwierig, sie rechnerisch zu erledigen.
Ein Ansatz besteht darin, zu versuchen, die "Basislinien" so zu entfernen, dass die Funktionen nullwertig sind, es sei denn, es gibt Spitzen- oder Talmerkmale. Dies geschieht am besten mit der Kurvenanpassung unter Verwendung eines Polynoms niedriger Ordnung oder, noch besser, eines geeigneteren prinzipiellen Modells, wie die Basislinie aussehen kann und sollte. Wenn die Spitzen sehr scharf sind, können Sie einfach die Funktion glätten und die geglättete Funktion von der ursprünglichen Funktion subtrahieren.
Nach dem Entfernen der Grundlinie können Sie Residuen normalisieren und generieren oder RMSD (einfache Ansätze) durchführen oder versuchen, Peak- / Talmerkmale zu erkennen, indem Sie jedem gewünschten Merkmal einen Gaußschen Wert (oder ein geeignetes Modell) anpassen. Wenn Sie in der Lage sind, die Peaks anzupassen, können Sie die Peakpositionen und Halbwertsbreiten vergleichen.
Schauen Sie sich SciPy an, wenn Sie Python kennen. Viel Glück.
quelle
Dies ist nur "aus dem Kopf", so dass ich das Problem möglicherweise völlig falsch verstehe , aber vielleicht können Sie den Funktionen einen quadratischen Mittelwertabstand (RMSD) zuweisen. Wenn Sie nur an den Gipfeln und Tälern interessiert sind, wenden Sie sie auf Bereiche um diese Gipfel und Täler an (dh für einige x +/- einige Epsilons, bei denen die Ableitung einer der beiden Funktionen Null ist). Wenn der RMSD dieses Bereichs nahe Null ist, haben Sie eine gute Übereinstimmung, denke ich.
quelle
Wie ich es nicht verstehe, werden die Informationen, nach denen Sie suchen, durch das „Tableau des Variationen“ der Funktion vermittelt - es tut mir sehr leid, dass ich den englischen Namen dafür nicht kenne!
Diese Tabelle ist einer differenzierbaren Funktion f zugeordnet, und Sie konstruieren sie, indem Sie die Wurzeln von f 'finden und das Vorzeichen von f' in jedem Intervall zwischen diesen Nullen bestimmen .
Wenn also die Nullen von f ' und g' mehr oder weniger übereinstimmen und die Vorzeichen dieser Funktionen übereinstimmen, haben sie ein ähnliches Profil.
Das erste, was ich zu programmieren versuchen würde, wäre:
Zeichnen Sie zufällig eine große Anzahl N von Punkten x [i] in dem Intervall, in dem die Funktionen definiert sind.
Berechnen Sie für jeden Knoten die Differenzen F [i] = f (x [i] + ε) - f (x [i] - ε) und G [i] = g (x [i] + ε) - g (x [i] - ε) .
Wenn an jedem Knoten F [i] und G [i] beide kleiner als ε² sind ODER beide das gleiche Vorzeichen haben, schließen Sie, dass die beiden Funktionen nahezu das gleiche Profil haben.
Funktioniert es?
quelle
Brute Force: Finden Sie den kleinsten Float-Wert ungleich Null mit diesem Wert als Schritt heraus, gehen Sie die gesamte Domäne durch und prüfen Sie, ob die Werte gleich sind.
== EDIT ==
Hmmm ... Wenn Sie mit "derselben Form" g (x) = c * f (x) meinen, sollte diese Lösung geändert werden - für jedes Element der Domäne berechnen Sie f (x) / g (x) und prüfen, ob Das Ergebnis ist für jeden Punkt das gleiche (natürlich, wenn g (x) == 0 ist, dann überprüfen Sie, ob f (x) == 0 ist, Sie versuchen nicht zu teilen).
Wenn "dieselbe Form" bedeutet, dass "lokale Optima und Biegepunkte gleich sind" ... Suchen Sie lokale Optima und Biegepunkte für f (x) und g (x) (als Sätze von Domänenelementen) und überprüfen Sie, ob diese vorhanden sind Sätze sind gleich.
Dritte Option: f (x) = g (x) + c. Überprüfen Sie einfach, ob jedes Element der Domäne den gleichen Unterschied f (x) -g (x) aufweist. Es ist fast identisch mit dem ersten Fall, aber anstelle der Teilung gibt es Unterschiede.
== NOCH EINE ANDERE BEARBEITUNG ==
Nun ... Der zweite Ansatz aus der obigen Bearbeitung kann nützlich sein. Sie können es auch mit dem Vergleichszeichen des ersten Derivats zusammenführen (nicht symbolisch, sondern berechnet als df (x) = f (x) - f (x-Schritt)). Wenn beide Funktionen in der gesamten Domäne das gleiche Vorzeichen der Ableitung haben, überprüfen Sie die Optima und Biegepunkte, um sicherzugehen. Ich würde sagen, diese Bedingungen sollten ausreichen, um das zu tun, was Sie brauchen.
quelle
Der wahrscheinlich einfachste Weg ist die Berechnung des Pearson-Korrelationskoeffizienten . Verwenden Sie also Ihr f (x) als X und g (x) als Y. Zeichnen Sie effektiv g (x) als Funktion von f (x) und sehen Sie, wie gut es eine gerade Linie bildet.
Der Korrelationskoeffizient ist beliebt, weil er leicht zu berechnen ist und oft nur durch winkende Hände gerechtfertigt wird. Es mag für einige Anwendungen eine gute anfängliche Annäherung sein, ist aber definitiv kein Allheilmittel.
Um in realen Anwendungen bessere Ergebnisse zu erzielen, müssen Sie verstehen, was in den Daten vor sich geht, dh in welchem Prozess die Daten generiert werden. Oft gibt es eine Art Hintergrund , und die interessanten Funktionen spielen auf diesem Hintergrund. Wenn Sie die gesamten Daten in eine Black Box werfen, werden Sie möglicherweise hauptsächlich die Hintergründe vergleichen: Die Black Box weiß nicht, welcher Teil der Daten der interessante Teil ist. Um bessere Ergebnisse zu erzielen, ist es oft eine gute Idee, die Hintergründe irgendwie zu entfernen und dann zu vergleichen, was Sie übrig haben. Anpassen von Linien oder Kurven oder Durchschnittswerten und Subtrahieren oder Dividieren durch diese, Tief-, Band- oder Hochpassfilterung, Zuführen der Daten durch eine nichtlineare Funktion ... Sie nennen es.
Es gibt definitiv keine richtige Antwort. Sie erhalten so viele verschiedene Ergebnisse, wie Sie Methoden ausprobieren. Einige der Ergebnisse sind jedoch besser als einige Angebote. Theoretische Überlegungen können helfen, in die richtige Richtung zu starten, aber wie Sie Parameter einstellen und Ihre Methode optimieren können, können Sie letztendlich nur herausfinden, indem Sie sie ausprobieren und die tatsächlichen Ergebnisse vergleichen.
quelle