ajustement de multiples gaussiennes pour les données en python
Je me demandais simplement si il est un moyen facile à mettre en œuvre gaussien/lorentz s'adapte à 10 pics et de l'extrait de fwhm et aussi pour déterminer la position de la fwhm sur les valeurs de x. La manière compliquée est de séparer les pics et les adapter aux données et de l'extrait de fwhm.
De données est [https://drive.google.com/file/d/0B6sUnnbyNGuOT2RZb2UwYXU4dlE/view?usp=sharing].
Tout conseiller grandement apprécié. Merci.
from scipy.optimize import curve_fit
import numpy as np
import matplotlib.pyplot as plt
data = np.loadtxt('data.txt', delimiter=',')
x, y = data
plt.plot(x,y)
plt.show()
def func(x, *params):
y = np.zeros_like(x)
print len(params)
for i in range(0, len(params), 3):
ctr = params[i]
amp = params[i+1]
wid = params[i+2]
y = y + amp * np.exp( -((x - ctr)/wid)**2)
guess = [0, 60000, 80, 1000, 60000, 80]
for i in range(12):
guess += [60+80*i, 46000, 25]
popt, pcov = curve_fit(func, x, y, p0=guess)
print popt
fit = func(x, *popt)
plt.plot(x, y)
plt.plot(x, fit , 'r-')
plt.show()
Traceback (most recent call last):
File "C:\Users\test.py", line 33, in <module>
popt, pcov = curve_fit(func, x, y, p0=guess)
File "C:\Python27\lib\site-packages\scipy\optimize\minpack.py", line 533, in curve_fit
res = leastsq(func, p0, args=args, full_output=1, **kw)
File "C:\Python27\lib\site-packages\scipy\optimize\minpack.py", line 368, in leastsq
shape, dtype = _check_func('leastsq', 'func', func, x0, args, n)
File "C:\Python27\lib\site-packages\scipy\optimize\minpack.py", line 19, in _check_func
res = atleast_1d(thefunc(*((x0[:numinputs],) + args)))
File "C:\Python27\lib\site-packages\scipy\optimize\minpack.py", line 444, in _ general_function
return function(xdata, *params) - ydata
TypeError: unsupported operand type(s) for -: 'NoneType' and 'float'
Le sens habituel de la fwhm est "Pleine Largeur à mi-hauteur." C'est une bonne mesure de la largeur d'un pic spectral.
OriginalL'auteur Rocky | 2014-11-13
Vous devez vous connecter pour publier un commentaire.
Cela requiert un non-ajustement linéaire. Un bon outil pour cela est scipy est
curve_fit
fonction.À utiliser
curve_fit
, nous avons besoin d'un modèle de fonction, de l'appelerfunc
, qui prendx
et notre (deviné) paramètres comme arguments et retourne les valeurs correspondantes poury
. Comme notre modèle, nous utilisons une somme de gaussiennes:Maintenant, nous allons créer une première estimation pour nos paramètres. Cette supposition commence avec des pics à
x=0
etx=1,000
avec une amplitude de 60 000 et e-pliage largeurs de 80. Ensuite, nous ajoutons candidat pics àx=60, 140, 220, ...
avec l'amplitude et la largeur de 46 000 à 25:Maintenant, nous sommes prêts à effectuer l'ajustement:
De voir comment nous avons fait, nous allons tracer le réel
y
valeurs (solide courbe noire) et lafit
(courbe rouge en pointillés) contrex
:Comme vous pouvez le voir, l'ajustement est assez bonne.
Complète code de travail
Reçois cette erreur : le Fichier "C:\Python27\lib\site-packages\scipy\optimize\minpack.py" de ligne, 444, dans _general_function de retour de la fonction(xdata, *params) - ydata TypeError: unsupported operand type(s) -: 'NoneType' et 'float'
Qui serait susceptible d'indiquer que
ydata
estNone
. Veuillez vérifier quex
ety
ont été correctement lu.veuillez avoir regarder le code ci-dessus et il ne valide les valeurs x et y. Svp laissez-moi savoir où le truc est ..
De ma faute: je n'ai pas réussi à copier et coller la dernière ligne de
func
dans la réponse. La réponse est maintenant mis à jour avec le code de travail.OriginalL'auteur John1024