Python能不能实现像Origin中的那样分峰和多峰高斯拟合?

在 Python 中,可以使用一些科学计算和数据分析的库来实现像 Origin 中的分峰和多峰高斯拟合。以下是几种常用的方法和库:

1. 使用 SciPy 进行高斯拟合

SciPy 是一个强大的科学计算库,其中的 curve_fit 函数可以用来拟合任意类型的函数,包括高斯函数。

  • 单个高斯拟合

    python
    import numpy as np from scipy.optimize import curve_fit # 定义高斯函数 def gaussian(x, amplitude, mean, stddev): return amplitude * np.exp(-((x - mean) / stddev)**2 / 2) # 模拟数据 x_data = np.linspace(-5, 5, 100) y_data = gaussian(x_data, 1.0, 0.0, 1.0) + np.random.normal(0, 0.1, x_data.size) # 拟合数据 popt, pcov = curve_fit(gaussian, x_data, y_data, p0=[1.0, 0.0, 1.0]) # 绘制拟合曲线 import matplotlib.pyplot as plt plt.scatter(x_data, y_data, label='Data') plt.plot(x_data, gaussian(x_data, *popt), 'r-', label='Fit: A=%5.3f, μ=%5.3f, σ=%5.3f' % tuple(popt)) plt.legend() plt.show()
  • 多峰高斯拟合

    python
    # 多个高斯函数之和 def multi_gaussian(x, *params): result = np.zeros_like(x) for i in range(0, len(params), 3): amplitude = params[i] mean = params[i + 1] stddev = params[i + 2] result += gaussian(x, amplitude, mean, stddev) return result # 模拟数据 x_data = np.linspace(-5, 5, 100) y_data = (gaussian(x_data, 1.0, -1.0, 1.0) + gaussian(x_data, 0.5, 1.0, 0.5) + np.random.normal(0, 0.1, x_data.size)) # 初始参数猜测 initial_guess = [1.0, -1.0, 1.0, 0.5, 1.0, 0.5] # 拟合数据 popt, pcov = curve_fit(multi_gaussian, x_data, y_data, p0=initial_guess) # 绘制拟合曲线 plt.scatter(x_data, y_data, label='Data') plt.plot(x_data, multi_gaussian(x_data, *popt), 'r-', label='Fit') plt.legend() plt.show()

2. 使用 lmfit 进行更高级的拟合

lmfit 是基于 SciPy 的一个更高级的拟合库,支持更复杂的拟合模型和拟合优化方法,适用于复杂的数据分析和拟合需求。

  • 安装 lmfit

    bash
    pip install lmfit
  • 示例

    python
    from lmfit.models import GaussianModel, VoigtModel # 模拟数据 x_data = np.linspace(-5, 5, 100) y_data = (GaussianModel(prefix='g1_').eval(x=x_data, g1_amplitude=1.0, g1_center=-1.0, g1_sigma=1.0) + GaussianModel(prefix='g2_').eval(x=x_data, g2_amplitude=0.5, g2_center=1.0, g2_sigma=0.5) + np.random.normal(0, 0.1, x_data.size)) # 创建模型 model = GaussianModel(prefix='g1_') + GaussianModel(prefix='g2_') # 初始参数猜测 params = model.make_params(g1_amplitude=1.0, g1_center=-1.0, g1_sigma=1.0, g2_amplitude=0.5, g2_center=1.0, g2_sigma=0.5) # 拟合数据 result = model.fit(y_data, params, x=x_data) # 绘制拟合曲线 result.plot_fit() plt.show()

通过这些方法,可以在 Python 中实现像 Origin 中的单峰和多峰高斯拟合,用于分析复杂的数据集并提取出各个峰的特征和参数。