【高斯函数拟合】高斯-牛顿法与梯度下降法的 Python 实现
高斯函数广泛应用于数据分析、信号处理等领域,其形式为 f ( x ) = A exp ( − ( x − μ ) 2 2 σ 2 ) f(x) = A \exp\left(-\frac{(x - \mu)^2}{2\sigma^2}\right) f(x)=Aexp(−2σ2(x−μ)2),其中 A A A 是幅度, μ \mu μ 是均值, σ \sigma σ 是标准差。本文通过 Python 实现高斯-牛顿法和梯度下降法来拟合高斯函数,并比较两种方法的性能。
背景
给定一组带噪声的数据,我们的目标是通过优化参数 A , μ , σ A, \mu, \sigma A,μ,σ 使高斯函数尽可能拟合数据。优化目标是最小化残差平方和:
S = ∑ i = 1 n ( y i − f ( x i , θ ) ) 2 , θ = [ A , μ , σ ] S = \sum_{i=1}^n (y_i - f(x_i, \theta))^2, \quad \theta = [A, \mu, \sigma] S=i=1∑n(yi−f(xi,θ))2,θ=[A,μ,σ]
我们将使用:
- 高斯-牛顿法:利用雅可比矩阵,快速收敛,适合非线性最小二乘问题。
- 梯度下降法:基于梯度更新,简单但收敛较慢。
代码实现
以下是完整的 Python 代码,使用 numpy
进行数值计算, `
matplotlib` 进行可视化。
核心代码
import numpy as np
import matplotlib.pyplot as plt# 高斯函数
def gaussian(x, A, mu, sigma):return A * np.exp(-(x - mu)**2 / (2 * sigma**2))# 雅可比矩阵
def jacobian(x, A, mu, sigma):n = len(x)J = np.zeros((n, 3))exp_term = np.exp(-(x - mu)**2 / (2 * sigma**2))J[:, 0] = exp_termJ[:, 1] = A * exp_term * (x - mu) / (sigma**2)J[:, 2] = A * exp_term * (x - mu)**2 / (sigma**3)return J# 高斯-牛顿法
def gauss_newton(x, y, params_init, max_iter=100, tol=1e-6):params = np.array(params_init, dtype=float)for i in range(max_iter):y_pred = gaussian(x,