Ajuste gaussiano a los datos de un histograma en python: Trust Region v / s Levenberg Marquardt
Mi diagrama de histograma muestra claramente dos picos. Pero mientras se ajusta a la curva con un doble gaussiano, muestra solo un pico. Seguí casi todas las respuestas que se muestran en stackoverflow. Pero no pudo obtener el resultado correcto. Anteriormente lo hizo mi maestro en Fortran y obtuvo dos picos. solíaleastsq
de pitónscipy.optimize
en un juicio ¿Debo dar mis datos también? Aquí está mi código.
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')
Incluso la cifra que obtuve no es suave. Tiene solo 54 puntos enx_avg
Por favor ayuda. Ni siquiera puedo publicar la figura aquí.
Al trazar en MATLAB, se obtuvieron resultados correctos. Motivo: MATLAB utiliza algo de la región de confianza en lugar de algo de Levenberg-Marquardt que no era adecuado para las restricciones vinculadas.
Los resultados correctos se obtienen solo cuando se muestra como una suma de 3 gaussianos individuales, no 2.
¿Cómo puedo decidir qué algo usar y cuándo?