【发布时间】:2018-12-10 14:36:37
【问题描述】:
我正在尝试使用 scipy 和曲线拟合对我的数据进行高斯拟合,这是我的代码:
import csv
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
A=[]
T=[]
seuil=1000
range_gauss=4
a=0
pos_peaks=[]
amp_peaks=[]
A_gauss=[]
T_gauss=[]
new_A=[]
new_T=[]
def gauss(x,a,x0,sigma):
return a*np.exp(-(x-x0)**2/(2*sigma**2))
with open("classeur_test.csv",'r') as csvfile:
reader=csv.reader(csvfile, delimiter=',')
for row in reader :
A.append(float(row[0]))
T.append(float(row[1]))
npA=np.array(A)
npT=np.array(T)
for i in range(1,len(T)):
#PEAK DETECTION
if (A[i]>A[i-1] and A[i]>A[i+1]) and A[i]>seuil:
pos_peaks.append(i)
amp_peaks.append(A[i])
#GAUSSIAN RANGE
for j in range(-range_gauss,range_gauss):
#ATTENTION AUX LIMITES
if(i+j>0 and i+j<len(T)-1):
A_gauss.append(A[i+j])
T_gauss.append(T[i+j])
npA_gauss = np.array(A_gauss)
npT_gauss = np.array(T_gauss)
for i in range (0,7):
new_A.append(npA_gauss[i])
new_T.append(npT_gauss[i])
new_npA=np.array(new_A)
new_npT=np.array(new_T)
n = 2*range_gauss
mean = sum(new_npT*new_npA)/n
sigma = sum(new_npA*(new_npT-mean)**2)/n
popt,pcov = curve_fit(gauss,new_npT,new_npA,p0=[1,mean,sigma])
plt.plot(T,A,'b+:',label='data')
plt.plot(new_npT,gauss(new_npT,*popt),'ro:',label='Fit')
print ("new_npA : ",new_npA)
print ("new_npT : ",new_npT)
plt.legend()
plt.title('Fit')
plt.xlabel('X')
plt.ylabel('Y')
plt.show()
我的数组 new_npT 和 new_npA 是这样的 numpy 数组:
new_npA : [ 264. 478. 733. 1402. 1337. 698. 320.]
new_npT : [229.609344 231.619385 233.62944 235.639496 237.649536 239.659592
241.669647]
这是结果
我不明白为什么我不能成功绘制高斯曲线...
有什么解释吗?
【问题讨论】:
-
欢迎来到 SO!请提供一段可复制粘贴的代码,包括导入。我不知道
range_gauss、A和T是什么…… -
确实,抱歉我刚刚改了这个
-
你最初的猜测(即 p0)离你很远。最佳拟合值是 popt = [1385.69624869, 236.42154954, 3.01765803] 可以从您的图像中大致猜到。你最初的猜测是 [1, 154413, 15545866284717] 所以特别是 sigma 偏离了近 13 个数量级。你的错误是当你计算平均值和西格玛时,你假设 new_npA 是一个概率分布,这不是因为它没有被标准化。
-
非常感谢您的回答!似乎高斯拟合......你是如何计算这些值的?我不明白你的数字。
-
@KarlMontalban 我刚刚将您代码中的初始猜测更改为合理的值,例如 popt,pcov = curve_fit(gauss,new_npT,new_npA,p0=[1400,240,10])
标签: python numpy scipy curve-fitting gaussian