Подгонка гаусса к набору данных x, y

Во-первых, это задание, которое я поставил, поэтому мне нужны только указатели, и я ограничен использованием следующих библиотек: NumPy, SciPy и MatPlotLib.

Нам дали файл txt, который включает данные x и y для резонансного эксперимента и должен соответствовать как гауссовой, так и лоренцевской аппроксимации. В данный момент я работаю над гауссовской подгонкой и пытался следовать коду, изложенному в предыдущем вопросе, в качестве основы для моего собственного кода. (Гаусс подходит для Python)

from numpy import *
from matplotlib import *
import matplotlib.pyplot as plt  ##Import Libraries
import pylab
from scipy.optimize import curve_fit

####################################

energy,intensity=numpy.loadtxt('resonance_data.txt',unpack=True)
print energy
print intensity  ##Load in text file and print the arrays




#####################################

n = size(energy)
mean = 30.7
sigma = 10
intensity0 = 45

def gaus(energy,intensity0,energy0,sigma):
       return intensity0*exp(-(energy-energy0)**2/(sigma**2))

popt,pcov = curve_fit(gaus,energy,intensity,p0=[45,mean,sigma])



plt.plot(energy,intensity,'o')
plt.xlabel('Energy/eV')
plt.ylabel('Intensity')
plt.title('Plot of Intensity against Energy')  ##Plot raw data along with axis labels         and title
plt.plot(energy,gaus(energy,*popt))
plt.show()

Что возвращает следующий график

введите здесь описание изображения

Если я сохраняю выражения для среднего и сигмы, как в опубликованном URL-адресе, кривая соответствует горизонтальной линии, поэтому я предполагаю, что проблема заключается в том, что кривая не сходится или что-то в этом роде.

Я немного новичок, поэтому любые указатели полезны :)

Спасибо

ОБНОВЛЕНИЕ: мне удалось улучшить гауссовскую подгонку и заставить работать лоренцев, и даже (я думаю) удалось вычислить сумму остатков в каждом случае.

Здоровья, ребята!

Еще раз спасибо ребята


person user3507401    schedule 07.04.2014    source источник
comment
Каким-то образом картинка, на которую вы ссылаетесь, выглядит как достойная подгонка....   -  person CT Zhu    schedule 07.04.2014
comment
Общая форма близка к тому, что я ожидал, но высота пика довольно далека. Я знаю, что он довольно перекошенный, поэтому он не будет идеально подходить, и в этом смысл задания, но я все равно ожидал бы лучшего?   -  person user3507401    schedule 07.04.2014
comment
Вы должны соответствовать одномерному или двумерному распределению Гаусса?   -  person Paul    schedule 07.04.2014
comment
Я бы использовал лоренцев для этих данных. Думайте, что ваша подгонка сходится. Увеличение амплитуды, вероятно, уменьшит посадку крыльев.   -  person tillsten    schedule 08.04.2014


Ответы (1)


Похоже, ваши данные сильно смещены влево, почему по Гауссу? Не Больцмана, логнормального или чего-то еще?

Многие из них уже реализованы в scipy.stats. См. scipy.stats.cauchy для лоренцевских и scipy.stats.normal гауссовых. Пример:

import scipy.stats as ss
A=ss.norm.rvs(0, 5, size=(100)) #Generate a random variable of 100 elements, with expected mean=0, std=5
ss.norm.fit_loc_scale(A) #fit both the mean and std
(-0.13053732553697531, 5.163322485150271) #your number will vary.

И я думаю, что вам не нужен параметр intensity0, он просто будет 1/sigma/srqt(2*pi), потому что функция плотности должна суммироваться до 1.

person CT Zhu    schedule 07.04.2014
comment
Спасибо за ответ, нам сказали построить как гауссовую, так и лоренцевскую, а затем провести статистические тесты, чтобы показать, что лучше, так что это причина выбора. Я посмотрю на функции scipy Cheers. - person user3507401; 07.04.2014
comment
@ user3507401, вы можете посмотреть этот пример здесь, чтобы увидеть, как тестировать различные дистрибутивы с помощью SciPy. - person Saullo G. P. Castro; 08.04.2014