我相信我成功實現了使用來自scipy的曲線擬合的高斯擬合。但是我遇到的問題是...適合性不是很好,因爲優化的參數正在改變質心。使用*** curve_fit ***從scipy和python 3.x改進高斯擬合
data =np.loadtxt('mock.txt')
my_x=data[:,0]
my_y=data[:,1]
def gauss(x,mu,sigma,A):
return A*np.exp(-(x-mu)**2/2/sigma**2)
def trimodal_gauss(x,mu1,sigma1,A1,mu2,sigma2,A2,mu3,sigma3,A3):
return gauss(x,mu1,sigma1,A1)+gauss(x,mu2,sigma2,A2)+gauss(x,mu3,sigma3,A3)
"""""
Gaussian fitting parameters recognized in each file
"""""
first_centroid=(10180.4*2+9)/9
second_centroid=(10180.4*2+(58.6934*1)+7)/9
third_centroid=(10180.4*2+(58.6934*2)+5)/9
centroid=[]
centroid+=(first_centroid,second_centroid,third_centroid)
apparent_resolving_power=1200
sigma=[]
for i in range(len(centroid)):
sigma.append(centroid[i]/((apparent_resolving_power)*2.355))
height=[1,1,1]
p=[]
p = np.array([list(t) for t in zip(centroid, sigma, height)]).flatten()
popt, pcov = curve_fit(trimodal_gauss,my_x,my_y,p0=p)
據我所知,在這裏有很多山峯,但我真的需要它,以適應只有三個高斯,但在正確的質心(在我最初的猜測給出)。換句話說,我真的不希望我給出的質心不變。有沒有人遇到過這樣的挑戰?並且可以請我幫助我做些什麼來實現目標?
一般情況下,似乎你最好配合正確的號碼(至少5個,也許6個),並且只採用你實際關心的三個結果。你目前的方法會做不好的工作,因爲你不適合的高峯會影響你關心的三個高峯的結果。它會「認爲」額外的東西是三個峯值的一部分。 – NichtJens