Python中如何拟合多峰高斯分布
在Python中,可以使用scipy库进行多峰高斯分布的拟合。scipy库中的optimize模块提供了curve_fit函数,可以拟合任意的函数形式。下面我们将使用一个例子来演示如何拟合一个包含两个峰的高斯分布。
首先,我们需要导入所需的库:
import numpy as np import matplotlib.pyplot as plt from scipy.optimize import curve_fit
接下来,我们定义一个函数来表示一个包含两个峰的高斯分布:
def gauss(x, a1, mu1, sigma1, a2, mu2, sigma2):
return a1*np.exp(-(x - mu1)**2/(2*sigma1**2)) + a2*np.exp(-(x - mu2)**2/(2*sigma2**2))
这个函数接受输入参数x,以及6个高斯分布的参数:a1,mu1,sigma1表示 个峰的幅度、均值和标准差,a2,mu2,sigma2表示第二个峰的幅度、均值和标准差。这个函数的返回值则为两个峰的叠加。
现在,我们生成一组带有噪声的数据作为拟合的输入:
x = np.linspace(-10, 10, 1000) y_true = gauss(x, 1, -2, 1, 0.5, 2, 2) y_noise = 0.1 * np.random.normal(size=len(x)) y = y_true + y_noise
在这里,我们使用linspace函数生成一个包含1000个等间距点的数组作为x的取值范围。然后,我们使用上述定义的gauss函数生成一个理想的高斯分布,同时加入一些服从正态分布的随机噪声。最后,y即为带有噪声的高斯分布。
接下来,我们使用curve_fit函数来拟合这个多峰高斯分布:
p0 = [1, -1, 1, 0.5, 1, 1] # 初始猜测参数 params, params_covariance = curve_fit(gauss, x, y, p0)
在拟合之前,我们需要提供猜测参数作为初始值。这里我们假设 个峰的幅度为1,均值为-1,标准差为1,第二个峰的幅度为0.5,均值为1,标准差为2。p0为这些猜测参数的列表。params为拟合后得到的参数,params_covariance为参数的协方差矩阵。
最后,我们可以使用拟合后的参数来生成一个拟合的曲线,并将结果可视化:
plt.scatter(x, y, label='data') plt.plot(x, gauss(x, *params), 'r', label='fit') plt.legend() plt.show()
在这里,我们使用scatter函数绘制带有噪声的数据点,使用plot函数绘制拟合的曲线。参数*params表示将params列表中的元素作为参数传递给gauss函数。
将上述代码整理到一个完整的示例代码中,我们可以获得以下结果:
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
def gauss(x, a1, mu1, sigma1, a2, mu2, sigma2):
return a1*np.exp(-(x - mu1)**2/(2*sigma1**2)) + a2*np.exp(-(x - mu2)**2/(2*sigma2**2))
x = np.linspace(-10, 10, 1000)
y_true = gauss(x, 1, -2, 1, 0.5, 2, 2)
y_noise = 0.1 * np.random.normal(size=len(x))
y = y_true + y_noise
p0 = [1, -1, 1, 0.5, 1, 1]
params, params_covariance = curve_fit(gauss, x, y, p0)
plt.scatter(x, y, label='data')
plt.plot(x, gauss(x, *params), 'r', label='fit')
plt.legend()
plt.show()
通过运行以上代码,我们可以得到一个包含两个峰的高斯分布的拟合曲线。你也可以根据需要调整初始猜测参数与数据点的数量来获得更准确的拟合结果。
