【高斯函数拟合】高斯-牛顿法与梯度下降法的 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=1n(yif(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_term
    J[:, 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, 

你可能感兴趣的:(python,开发语言)