Python: zwei-Kurve Gauß-fitting mit nicht-linearen least-squares
Mein wissen aus der Mathematik ist begrenzt, deshalb bin ich wahrscheinlich steckte. Ich habe eine spectra, die ich bin versucht zu passen zwei Gauß-peaks. Ich kann halt auf den größten peak, aber ich passt nicht zu den kleinsten peak. Ich verstehe, dass ich brauchen, um die Summe der Gauß-Funktion für den zwei Spitzen, aber ich weiß nicht, wo ich schief gegangen. Ein Bild von meiner aktuellen Ausgabe angezeigt wird:
Die Blaue Linie ist meine Daten und die grüne Linie ist mein Aktuelles fit. Es gibt eine Schulter, an der linken Seite des hauptpeaks in meinen Daten, die ich bin versucht derzeit, um zu passen, mit dem folgenden code:
import matplotlib.pyplot as pt
import numpy as np
from scipy.optimize import leastsq
from pylab import *
time = []
counts = []
for i in open('/some/folder/to/file.txt', 'r'):
segs = i.split()
time.append(float(segs[0]))
counts.append(segs[1])
time_array = arange(len(time), dtype=float)
counts_array = arange(len(counts))
time_array[0:] = time
counts_array[0:] = counts
def model(time_array0, coeffs0):
a = coeffs0[0] + coeffs0[1] * np.exp( - ((time_array0-coeffs0[2])/coeffs0[3])**2 )
b = coeffs0[4] + coeffs0[5] * np.exp( - ((time_array0-coeffs0[6])/coeffs0[7])**2 )
c = a+b
return c
def residuals(coeffs, counts_array, time_array):
return counts_array - model(time_array, coeffs)
# 0 = baseline, 1 = amplitude, 2 = centre, 3 = width
peak1 = np.array([0,6337,16.2,4.47,0,2300,13.5,2], dtype=float)
#peak2 = np.array([0,2300,13.5,2], dtype=float)
x, flag = leastsq(residuals, peak1, args=(counts_array, time_array))
#z, flag = leastsq(residuals, peak2, args=(counts_array, time_array))
plt.plot(time_array, counts_array)
plt.plot(time_array, model(time_array, x), color = 'g')
#plt.plot(time_array, model(time_array, z), color = 'r')
plt.show()
InformationsquelleAutor der Frage Harpal | 2012-04-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dieser code war für mich, vorausgesetzt, Sie sind passend, eine Funktion, die eine Kombination von zwei Gauß-Verteilungen.
Ich habe gerade eine Residuen-Funktion fügt hinzu, dass zwei Gauß-Funktionen und dann subtrahiert Sie von den realen Daten.
Parameter (p), die ich übergeben, um Numpy - least-squares-Funktion gehören: die Mittel der ersten Gauß-Funktion (m), der Unterschied in dem Mittelwert aus der ersten und zweiten GAUSS-Funktionen (dm, d.h. die horizontale Verschiebung), die Standardabweichung der erste (sd1), und die Standardabweichung der zweiten (sd2).
InformationsquelleAutor der Antwort Usagi
Können Sie verwenden, Gaussian mixture models aus scikit-learn:
Können Sie die Funktion auch verwenden, die unten zu passen, die Anzahl der Gauß-Sie wollen mit ncomp parameter:
InformationsquelleAutor der Antwort bougui
coeffs 0 und 4 sind verkommen - es gibt absolut nichts in den Daten, die entscheiden können, zwischen Ihnen. sollten Sie ein single-zero-level-parameter anstelle von zwei (dh entfernen Sie einer von Ihnen aus dem code). dies ist wahrscheinlich was hält Ihr passen (ignorieren Sie die Kommentare hier, die sagen das ist nicht möglich - es gibt offensichtlich mindestens zwei Spitzen, die in die Daten und sollten Sie sicherlich in der Lage sein, um fit zu werden).
(es kann nicht klar sein, warum ich Vorschlage, aber was passiert ist, dass coeffs 0 und 4 heben sich gegenseitig auf. Sie können beide null sein, oder könnte man 100 und der andere -100 - so oder so, die passen genau so gut. das "verwirrt" den fitting routine, die verbringt Ihre Zeit versuchen zu arbeiten, was Sie sein sollten, wenn es keine einzige richtige Antwort, denn was auch immer Wert ist, kann der andere nur das negative, und die Passform ist das gleiche).
in der Tat, von der Handlung, wie es aussieht, gibt es möglicherweise keine Notwendigkeit für eine null-level überhaupt. ich würde versuchen, fallen diese beiden und sehen, wie der Sitz aussieht.
auch, es gibt keine Notwendigkeit zu passen coeffs 1 und 5 (oder den Nullpunkt), in der der kleinsten Quadrate. statt, da das Modell linear ist in diesen könnten Sie berechnen Ihre Werte an jeder Schleife. das macht die Sache schneller, aber Sie ist nicht kritisch. ich habe gerade bemerkt du sagen, dass du Mathe nicht so gut, so wohl ignorieren.
InformationsquelleAutor der Antwort andrew cooke