Gaußer passt zu einem Histogramm Daten in Python: Trust Region v / s Levenberg Marquardt

Mein Histogramm-Diagramm zeigt deutlich zwei Gipfel. Aber während es mit einem doppelten Gaußer eine Kurvenanpassung macht, zeigt es nur einen Gipfel. Befolgte fast jede Antwort im Stackoverflow. Aber das richtige Ergebnis nicht. Es wurde zuvor von meinem Lehrer in Fortran gemacht und er bekam zwei Gipfel. Ich habe leastsq von Python's scipy.optimize in einem Versuch. Soll ich meine Daten auch geben? Hier ist mein Code.

 binss = (max(x) - min(x))/0.05 #0.05 is my bin width n, bins, patches = plt.hist(x, binss, color = 'grey') #gives the histogram x_a = [] for item in range(len(bins)-1): b = (bins[item]+bins[item+1])/2 x_a.append(b) x_avg = np.array(x_a) y_real = n def gauss(x, A, mu, sigma): gaus = [] for item in range(len(x)): gaus.append(A*e**(-(x[item]-mu)**2./(2.*sigma**2))) return np.array(gaus) A1, A2, m1, m2, sd1, sd2 = [25, 30, 0.3, 0.6, -0.9, -0.9] #Initial guesses for leastsq p = [A1, A2, m1, m2, sd1, sd2] y_init = gauss(x_avg, A1, m1, sd1) + gauss(x_avg, A2, m2, sd2) #initially guessed y def residual(p, x, y): A1, A2, m1, m2, sd1, sd2 = p y_fit = gauss(x, A1, m1, sd1) + gauss(x, A2, m2, sd2) err = y - y_fit return err sf = leastsq(residual, p, args = (x_avg , y_real)) y_fitted1 = gauss(x_avg, sf[0][0], sf[0][2], sf[0][4]) y_fitted2 = gauss(x_avg, sf[0][1], sf[0][3], sf[0][5]) y_fitted = y_fitted1 + y_fitted2 plt.plot(x_avg, y_init, 'b', label='Starting Guess') plt.plot(x_avg, y_fitted, color = 'red', label = 'Fitted Data') plt.plot(x_avg, y_fitted1, color= 'black', label = 'Fitted1 Data') plt.plot(x_avg, y_fitted2, color = 'green', label = 'Fitted2 Data') 

Sogar die Figur, die ich bekam, ist nicht glatt. Es ist nur noch 54 Punkte in x_avg Bitte helfen Sie. Kann nicht einmal die Figur hier posten.

Beim Plotten auf MATLAB wurden korrekte Ergebnisse erzielt. Grund: MATLAB nutzt die Trust Region algo statt Levenberg-Marquardt algo, die nicht für gebundene Zwänge geeignet war.

Die korrekten Ergebnisse kommen nur, wenn dies als Summe von 3 einzelnen Gaußern gezeigt wird, nicht 2.

Wie kann ich entscheiden, welche algo zu verwenden und wann?

2 Solutions collect form web for “Gaußer passt zu einem Histogramm Daten in Python: Trust Region v / s Levenberg Marquardt”

Ihr Problem scheint über mixtures of Gaussian auch bekannt als Gaussian mixture model . Es gibt mehrere Implementierungen. sklearn ist eine Überlegung wert.

 import numpy as np from sklearn import mixture import matplotlib.pyplot as plt comp0 = np.random.randn(1000) - 5 # samples of the 1st component comp1 = np.random.randn(1000) + 5 # samples of the 2nd component x = np.hstack((comp0, comp1)) # merge them gmm = mixture.GMM(n_components=2) # gmm for two components gmm.fit(x) # train it! linspace = np.linspace(-10, 10, 1000) fig, ax1 = plt.subplots() ax2 = ax1.twinx() ax1.hist(x, 100) # draw samples ax2.plot(linspace, np.exp(gmm.score_samples(linspace)[0]), 'r') # draw GMM plt.show() 

Der Ausgang ist Bildbeschreibung hier eingeben

Ich habe einen weiteren Gaußschen Begriff hinzugefügt. So p nahm insgesamt 9 Parameter. So

 p = [A1, A2, A3, m1, m2, m3, sd1, sd2, sd3] 

Dann wurde ein anderer Term y_fitted3 definiert und zu y_fitted hinzugefügt. Es gab dann eine korrekte Figur von zwei Gipfeln, die perfekt passen, außer der Tatsache, dass die Kurve überhaupt nicht glatt war! Dann suchte ich in Stackoverflow, um mich mit spline zu benutzen. Dh

 from scipy.interpolate import spline 

Und dann am Ende,

 x_new = np.linspace(x_avg.min(),x_avg.max(),30000) ysmooth = spline(x_avg, y_fitted, x_new) plt.plot(x_new, ysmooth) 

Dann war es da. Checking in wikipedia, heißt es, dass LM in python auch TR . So versuchte es wieder leastsq das Ergebnis. Aber trotzdem bin ich nicht klar über den Unterschied in MATLAB . Zusätzliche Eingaben werden geschätzt! Vielen Dank.

  • Python dynamische Funktionserstellung mit benutzerdefinierten Namen
  • Maximaler Wert aus jeder Spalte der CSV-Datei
  • Selen-Python-Download, aber Datei wird als .part gespeichert
  • Was ist die Alternative von tf.Variable.ref () in Tensorflow Version 0.12?
  • ValueError "Erwartete Versionsangabe" bei der Installation von lokalem Rad über Pip
  • Öffnen Sie IPython Notebook 2.7 und 3.4 in Parallel
  • Warum läuft dieser Python-Code zweimal?
  • Speichern Sie SQLite 3 Daten als Variable in Python
  • Python Tkinter 2.7 Ausgabe mit Bild.
  • Force Python Scrapy nicht zu codieren URL
  • Schwerwiegender Fehler: #include <stdio.h> generiert nach "pip install mysql-python" -Befehl
  • Python ist die beste Programmiersprache der Welt.