You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Scipy在线性背景下进行高斯曲线拟合并提升峰位精度?

Fixing Gaussian Fit Peak Position Accuracy by Including Linear Background

Got it, let's tackle that peak position shift issue you're facing. The core problem here is that your original pure Gaussian model doesn't account for the sloped background noise—when you only use peak-nearby data points, the underlying linear tilt in the background throws off the fit's peak location because the model assumes a flat baseline.

Here's how to fix this properly:

1. Use a Combined Gaussian + Linear Background Model

Instead of fitting just a Gaussian, define a model that includes both the Gaussian peak and a linear background. This way, the fit will separate the peak signal from the sloped noise, leading to a much more accurate peak position.

The model function looks like this:

import numpy as np
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt

def gauss_linear_bg(x, amp, mu, sigma, bg_intercept, bg_slope):
    # Gaussian component
    gauss = amp * np.exp(-((x - mu)**2)/(2 * sigma**2))
    # Linear background component
    linear_bg = bg_intercept + bg_slope * x
    # Combined model
    return gauss + linear_bg

2. Provide Good Initial Guesses

Curve fitting works best when you give it reasonable starting values for each parameter. Bad initial guesses can lead to failed fits or incorrect results. Here's how to estimate them:

  • amp: Rough height of the peak above the background
  • mu: The x-value where the peak is centered (just look at your data plot)
  • sigma: Estimate from the full width at half maximum (FWHM ≈ 2.35*sigma)
  • bg_intercept & bg_slope: Fit a line to the background-only regions of your data (areas far from the peak) to get initial values for these

3. Fit the Full Relevant Dataset (Not Just Peak Points)

Include all data points that cover both the peak and enough background on either side. This lets the model properly learn the background slope, which is key for isolating the true peak position.

Example Workflow with Sample Data

Let's walk through a complete example with simulated data that has a sloped background:

# Generate sample data with sloped background + Gaussian peak
x = np.linspace(0, 100, 200)
true_amp = 50
true_mu = 50
true_sigma = 5
true_bg_intercept = 10
true_bg_slope = 0.2

# Add some noise
y = gauss_linear_bg(x, true_amp, true_mu, true_sigma, true_bg_intercept, true_bg_slope) + np.random.normal(0, 2, len(x))

# Estimate initial parameters
initial_amp = np.max(y) - np.mean(y[:20])  # Peak height above background
initial_mu = x[np.argmax(y)]  # Peak center guess
initial_sigma = 6  # Rough estimate from visual
# Fit background to left side data
bg_x = x[:30]
bg_y = y[:30]
initial_bg_slope, initial_bg_intercept = np.polyfit(bg_x, bg_y, 1)

# Run curve fit
popt, pcov = curve_fit(gauss_linear_bg, x, y, p0=[initial_amp, initial_mu, initial_sigma, initial_bg_intercept, initial_bg_slope])

# Extract fit results
fit_amp, fit_mu, fit_sigma, fit_bg_intercept, fit_bg_slope = popt

# Plot results
plt.figure(figsize=(10,6))
plt.scatter(x, y, label='Raw Data', s=10)
plt.plot(x, gauss_linear_bg(x, *popt), 'r-', label=f'Fit: mu={fit_mu:.2f}, sigma={fit_sigma:.2f}')
plt.xlabel('Channel')
plt.ylabel('Intensity')
plt.legend()
plt.show()

print(f"True peak position: {true_mu}, Fitted peak position: {fit_mu:.2f}")

4. Verify the Fit

After fitting, check the residuals (raw data minus fit) to make sure they're randomly distributed around zero. If there's a pattern in the residuals, it might mean your model still isn't capturing the background correctly (e.g., maybe the background is quadratic instead of linear).

This approach should eliminate the peak position bias caused by the sloped background, since the model explicitly accounts for that tilt while fitting the Gaussian peak.

内容的提问来源于stack exchange,提问作者Tian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:06:27