当前位置: 首页 > news >正文

【高斯拟合】不用库手写高斯拟合算法:从最小二乘到拟合参数推导

高斯分布(正态分布)是科学计算和机器学习中最常见的函数之一,拟合一组数据为高斯曲线在信号处理、统计建模、图像处理中都有广泛应用。

市面上很多工具包(如 NumPy、SciPy)都可以快速进行高斯拟合。但你有没有想过,如果不使用任何库函数,只使用原始数学知识和基础 Python 语法,我们也可以完成一次完整的高斯拟合?

本文将一步步讲解如何手写一个 高斯拟合算法,核心思路是:

  • 将高斯函数取对数后,转化为一个二次函数
  • 使用最小二乘法拟合该二次函数
  • 反推出高斯分布的参数:振幅 a,中心 mu,标准差 sigma

一、高斯函数公式

高斯函数的表达式如下:

f ( x ) = a ⋅ exp ⁡ ( − ( x − μ ) 2 2 σ 2 ) f(x) = a \cdot \exp\left(-\frac{(x - \mu)^2}{2\sigma^2}\right) f(x)=aexp(2σ2(xμ)2)

其中:

  • a a a:峰值(振幅)
  • μ \mu μ:均值(峰值位置)
  • σ \sigma σ:标准差(控制曲线宽度)

二、对高斯函数取对数

我们不能直接拟合指数函数,所以我们先对其取自然对数:

ln ⁡ ( f ( x ) ) = ln ⁡ ( a ) − ( x − μ ) 2 2 σ 2 \ln(f(x)) = \ln(a) - \frac{(x - \mu)^2}{2\sigma^2} ln(f(x))=ln(a)2σ2(xμ)2

整理为一个关于 x x x 的二次函数:

ln ⁡ ( f ( x ) ) = A x 2 + B x + C \ln(f(x)) = A x^2 + B x + C ln(f(x))=Ax2+Bx+C

其中:

  • A = − 1 2 σ 2 A = -\frac{1}{2\sigma^2} A=2σ21
  • B = μ σ 2 B = \frac{\mu}{\sigma^2} B=σ2μ
  • C = ln ⁡ ( a ) − μ 2 2 σ 2 C = \ln(a) - \frac{\mu^2}{2\sigma^2} C=ln(a)2σ2μ2

所以我们可以将目标转为一个二次曲线拟合问题,只要拟合出 A , B , C A, B, C A,B,C,就可以反推高斯参数 a , μ , σ a, \mu, \sigma a,μ,σ


三、最小二乘法拟合二次函数

我们要拟合下列形式的曲线:

z = A x 2 + B x + C z = A x^2 + B x + C z=Ax2+Bx+C

其中 z = ln ⁡ ( y ) z = \ln(y) z=ln(y)

构造三个正则方程来求解 A , B , C A, B, C A,B,C

在这里插入图片描述

这是一个 3 × 3 3 \times 3 3×3 的线性方程组,可以使用克拉默法则(Cramer’s Rule)高斯消元来求解。


四、从拟合结果还原高斯参数

根据上文推导公式反解:

  • σ = − 1 2 A \sigma = \sqrt{-\frac{1}{2A}} σ=2A1
  • μ = − B 2 A \mu = -\frac{B}{2A} μ=2AB
  • a = exp ⁡ ( C − B 2 4 A ) a = \exp\left(C - \frac{B^2}{4A}\right) a=exp(C4AB2)

这就完成了高斯参数的恢复。


五、完整 Python 实现(不依赖库)

import mathdef gaussian_fit_log_least_squares(x_vals, y_vals):assert len(x_vals) == len(y_vals)n = len(x_vals)S_x4 = S_x3 = S_x2 = S_x1 = S_1 = 0.0S_zx2 = S_zx1 = S_z = 0.0valid_points = 0for i in range(n):x = x_vals[i]y = y_vals[i]if y <= 0:continuez = math.log(y)x2 = x * xx3 = x2 * xx4 = x2 * x2S_x4 += x4S_x3 += x3S_x2 += x2S_x1 += xS_1 += 1S_zx2 += x2 * zS_zx1 += x * zS_z += zvalid_points += 1if valid_points < 3:raise ValueError("有效点太少,无法拟合")A = [[S_x4, S_x3, S_x2],[S_x3, S_x2, S_x1],[S_x2, S_x1, S_1]]b = [S_zx2, S_zx1, S_z]def solve_linear_3x3(A, b):def det3(m):return (m[0][0] * (m[1][1]*m[2][2] - m[1][2]*m[2][1]) -m[0][1] * (m[1][0]*m[2][2] - m[1][2]*m[2][0]) +m[0][2] * (m[1][0]*m[2][1] - m[1][1]*m[2][0]))D = det3(A)if abs(D) < 1e-12:raise ValueError("矩阵不可逆")def replace_col(m, col_idx, new_col):new_m = [row[:] for row in m]for i in range(3):new_m[i][col_idx] = new_col[i]return new_mDx = det3(replace_col(A, 0, b))Dy = det3(replace_col(A, 1, b))Dz = det3(replace_col(A, 2, b))return Dx / D, Dy / D, Dz / DA_, B_, C_ = solve_linear_3x3(A, b)if A_ >= 0:raise ValueError("拟合失败:A 应该为负")sigma = math.sqrt(-1 / (2 * A_))mu = -B_ / (2 * A_)a = math.exp(C_ - (B_ * B_) / (4 * A_))return a, mu, sigma

六、示例数据生成 + 拟合验证

import randomdef generate_data(a, mu, sigma, num_points=100):x_vals = []y_vals = []for i in range(num_points):x = -1 + i * 0.05y = a * math.exp(-((x - mu) ** 2) / (2 * sigma ** 2)) + random.uniform(-0.05, 0.05)y = max(y, 0.01)x_vals.append(x)y_vals.append(y)return x_vals, y_valsx_vals, y_vals = generate_data(a=5.0, mu=2.0, sigma=1.5)a_fit, mu_fit, sigma_fit = gaussian_fit_log_least_squares(x_vals, y_vals)
print(f"拟合结果: a={a_fit:.4f}, mu={mu_fit:.4f}, sigma={sigma_fit:.4f}")

输出示例:

拟合结果: a=5.0123, mu=2.0009, sigma=1.4988

七、小结

本文手把手地实现了一个不用任何库的高斯拟合算法,从数学推导、线性方程组求解到最终还原高斯参数。该方法适用于单峰数据的拟合,能帮我们更深入理解最小二乘法与高斯分布之间的数学联系。

如果你希望进一步了解多峰高斯拟合(比如双高斯拟合)、使用更鲁棒的拟合算法(如最大似然、非线性最小二乘法),可以尝试引入 NumPy / SciPy 进行下一步扩展。


📌 附:该方法的优缺点

优点缺点
无需第三方库,适合教学或底层环境对数据噪声敏感
执行速度快,实现简单只能拟合单峰高斯
能帮助理解数学原理不支持负值或零值数据(需预处理)

如果你觉得本文对你有帮助,欢迎点赞、收藏或转发给有需要的小伙伴!

http://www.xdnf.cn/news/459973.html

相关文章:

  • window 显示驱动开发-报告图形内存(四)
  • 国内MCP服务平台推荐 AIbase推出MCP服务器客户端商店
  • PromptIDE提示词开发工具支持定向优化啦
  • Dify与n8n全面对比指南:AI应用开发与工作流自动化平台选择【2025最新】
  • Makefile 在 Go 项目中的实践
  • django中用 InforSuite RDS 替代memcache
  • 【Hadoop】伪分布式安装
  • Pycharm IDEA加载大文件时报错:The file size exceeds configured limit
  • 鸿蒙OSUniApp 实现的表单验证与提交功能#三方框架 #Uniapp
  • NuGet程序包还原失败
  • 【论文阅读】BEVFormer
  • 使用 163 邮箱实现 Spring Boot 邮箱验证码登录
  • 【问题记录】08 MAC电脑,安装HP打印机驱动,提示:此更新需要macOS版本15.0或更低版本
  • 如何使用WordPress SEO检查器进行实时内容分析
  • 数据结构 -- 顺序查找和折半查找
  • Vue 3 中 watch 的使用与深入理解
  • SpringBoot集成Redis:实现分布式锁(redistemplate,lua,redisson)
  • 《深入理解AXI4协议:从入门到实践》-- 第十篇:AXI5与CHI协议前瞻
  • 人工神经网络(ANN)模型
  • 【微服务】SpringBoot + Docker 实现微服务容器多节点负载均衡详解
  • GPUGeek云平台实战:DeepSeek-R1-70B大语言模型一站式部署
  • 计算机网络:蜂窝网络和WiFi网络使用的射频信号有什么区别?
  • 【视频】解决FFmpeg将RTSP转RTMP流时,出现的卡死、出错等问题
  • 安全巡检清单
  • Linux云计算训练营笔记day08(MySQL数据库)
  • 硅基计划2.0 学习总结 贰
  • SQL:MySQL函数:空值处理函数(NULL Handling Functions)
  • 阿克曼-幻宇机器人系列教程3- 机器人交互实践(Message)
  • React和Vue在前端开发中, 通常选择哪一个
  • 机器学习 day03