scipy 如何拟合数据的高斯最佳拟合

9w11ddsr  于 2023-02-08  发布在  其他
关注(0)|答案(2)|浏览(222)

我有一个数据集,我正在为它绘制一个特定频率下的时间与强度的曲线图。
在x轴上是时间数据集,其在numpy阵列中,并且在y轴上是强度阵列。

time = [ 0.3  1.3  2.3  3.3  4.3  5.3  6.3  7.3  8.3  9.3 10.3 11.3 12.3 13.3
 14.3 15.3 16.3 17.3 18.3 19.3 20.3 21.3 22.3 23.3 24.3 25.3 26.3 27.3
 28.3 29.3 30.3 31.3 32.3 33.3 34.3 35.3 36.3 37.3 38.3 39.3 40.3 41.3
 42.3 43.3 44.3 45.3 46.3 47.3 48.3 49.3 50.3 51.3 52.3 53.3 54.3 55.3
 56.3 57.3 58.3 59.3] 

intensity = [1.03587, 1.03187, 1.03561, 1.02893, 1.04659, 1.03633, 1.0481 ,
       1.04156, 1.02164, 1.02741, 1.02675, 1.03651, 1.03713, 1.0252 ,
       1.02853, 1.0378 , 1.04374, 1.01427, 1.0387 , 1.03389, 1.03148,
       1.04334, 1.042  , 1.04154, 1.0161 , 1.0469 , 1.03152, 1.22406,
       5.4362 , 7.92132, 6.50259, 4.7227 , 3.32571, 2.46484, 1.74615,
       1.51446, 1.2711 , 1.15098, 1.09623, 1.0697 , 1.06085, 1.05837,
       1.04151, 1.0358 , 1.03574, 1.05095, 1.03382, 1.04629, 1.03636,
       1.03219, 1.03555, 1.02886, 1.04652, 1.02617, 1.04363, 1.03591,
       1.04199, 1.03726, 1.03246, 1.0408 ]

当我用matplotlib绘制这个的时候,使用;

plt.figure(figsize=(15,6))
plt.title('Single frequency graph at 636 kHz', fontsize=18)
plt.plot(time,intensity)
plt.xticks(time[::3], fontsize=12)
plt.yticks(fontsize=12)
plt.xlabel('Elapsed time (minutes:seconds)', fontsize=18)
plt.ylabel('Intensity at 1020 kHz', fontsize=18)
plt.savefig('WIND_Single_frequency_graph_1020_kHz')
plt.show()

图表看起来像-

我想用高斯曲线拟合这些数据,这是我用的代码,

def Gauss(x, A, B):
    y = A*np.exp(-1*B*x**2)
    return y
parameters, covariance = curve_fit(Gauss, time, intensity_636)

fit_A = parameters[0]
fit_B = parameters[1]

fit_y = Gauss(time, fit_A, fit_B)

plt.figure(figsize=(15,6))
plt.plot(time, intensity, 'o', label = 'data')
plt.plot(time, fit_y, '-', label ='fit')
plt.legend()

我得到的最佳匹配是这样的-

哪里出错了?如何使最佳拟合曲线更好地拟合数据?

qzlgjiam

qzlgjiam1#

您需要定义更灵活的模型(更多参数)并为其定义合理的初始值:

def f(x, a, b, mu, sigma):
    return a + b * np.exp(-(x - mu) ** 2 / (2 * sigma ** 2))

popt, pcov = curve_fit(f, time, intensity, p0=[1, 1, 30.3, 2])

plt.plot(time, intensity)
plt.plot(time, f(time, *popt))
plt.show()

rur96b6h

rur96b6h2#

通过观察,我们发现曲线是不对称的,在接近峰值的范围内放大的对数y轴上,这一点更加明显。

这就引出了高斯模型(对称的)不能被正确拟合的问题.
还可以观察到,峰周围的曲线部分离线性不远:

因此,更好的模型可以由两个指数函数的组合构成,例如:

我想你可以在你的非线性回归软件中编写这个函数。上面的参数的粗略值可以作为迭代计算的起始值。

相关问题