Gaussian Mixture Model:混合高斯模型介绍

最近看一些计算机视觉和图形学类的文章,经常发现一个被称为Gaussian mixture model(GMM)的技术,应用在图像图形处理的算法中。出于好奇,我最近阅读了GMM的文献[1]。基于该文献,我将在这篇博客介绍一下GMM的一些核心思想以及比较成功的应用。

1. 简介

GMM是一个参数概率密度函数,由加权的分块高斯密度累加和表示。GMM通常被用来表示一个概率密度分布的参数模型,以提供建立特征度量。GMM的参数由训练数据获得,通过迭代计算Expectation-Maximization(EM,最大期望)算法或Maximum A Posteriori estimation(MAP,最大后验估计)算法来实现训练。

这里我们给出GMM的数学模型:

x是一个D维的连续向量,在应用中可以被看做度量或者特征;M表示分块的数量,wi表示对应M的权重; 表示分块高斯密度。每一个分块的密度是一个D个变量的高斯函数:

 为平均向量,为协方差矩阵, 混合权重满足:。这里给出参数形式,  对应不同的分块M: 

这里的协方差矩阵可以是满秩的,或者限制在主对角线上。另外,参数能够被共享或者绑定在不同的分块,取决于不同的应用需求。这里以语音识别为例,来说明GMM的拟合能力:

如上图所示,第一行为一段自然的语音输入。这段语音不可避免的会受到一些噪声的影响,但是整体分布是平滑的。使用单峰值峰Gaussian模型,显然,会造成严重的信息损失。vector quantize (VQ) 提供的是离散拟合。GMM相对来说更像是二者结合,结果会更加准确。

2. 实例

这里使用一个比较容易理解的实例来理解GMM的使用场景,即图像分割。我们以文献[2]为例,来说明GMM在图像中是如何实现像素级的聚类以及分割的。

这里用一个模型来说明:

I(x,y)表示一个图像中在像素(x,y)的颜色, P表示为基于像素颜色的概率判定,对于不同的分块,或者不同的,都会对应一个概率结果。相关参数还会根据区域进行重新估计:

这两步就共同组成了EM方法解GMM的E-step和M-step。感觉上就是根据该模型进行迭代计算,就能得到最终面向所有像素的概率分布。那么根据这个概率分布,对应的图像分割结果就能够被同时获得。在文献[2]中为了做后续的应用,做了一些调整,但是整体上还是按照上述思路来做。下图展示一个分割的结果。 

 可以看到,图像中相对应的元素被聚类,实现比较清晰的分割结果。

3. 总结

GMM是一个拟合能力不错的概率预测工具,能够对数据集的分布进行基于度量的统计分析,并得到一个基于概率的计算结果。该工具可以用于识别,分割,聚类等工作,具有很好的扩展性。 

Reference

[1] Reynolds D A. Gaussian mixture models[J]. Encyclopedia of biometrics, 2009, 741(659-663).

[2] Tai Y W, Jia J, Tang C K. Local color transfer via probabilistic segmentation by expectation-maximization[C] CVPR, 2005, 1: 747-754.

### 高斯相关概念及其编程实现 #### 什么是高斯分布? 高斯分布(Gaussian Distribution),也被称为正态分布,是一种连续概率分布,在统计学和数据科学领域具有重要地位。它由均值 \( \mu \) 和标准差 \( \sigma \) 定义,其概率密度函数可以表示为: \[ f(x|\mu,\sigma^2)=\frac{1}{\sqrt{2\pi}\sigma}e^{-\frac{(x-\mu)^2}{2\sigma^2}} \] 其中,\( \mu \) 是分布的中心位置,而 \( \sigma \) 则决定了分布的宽度[^4]。 #### 编程中的高斯随机数生成 在许多编程语言中,可以通过内置库轻松生成服从高斯分布的随机数。以下是 Python 中的一个例子,展示如何利用 `numpy` 库生成一组高斯分布的数据样本。 ```python import numpy as np import matplotlib.pyplot as plt # 设置参数 mu=0, sigma=1 mu, sigma = 0, 1 # 使用 NumPy 的 random.normal 函数生成 1000 个样本 samples = np.random.normal(mu, sigma, 1000) # 绘制直方图 plt.hist(samples, bins=30, density=True, alpha=0.6, color='g') # 添加理论曲线 xmin, xmax = plt.xlim() x = np.linspace(xmin, xmax, 100) p = (1 / (np.sqrt(2 * np.pi) * sigma)) * np.exp(-((x - mu)**2) / (2 * sigma**2)) plt.plot(x, p, 'k', linewidth=2) plt.title('Histogram of Gaussian Samples') plt.show() ``` 此代码片段展示了如何通过指定均值和标准差来生成并可视化高斯分布的样本集合[^5]。 #### 高斯过程回归简介 除了简单的随机变量模拟外,高斯过程(Gaussian Process)也是一种强大的机器学习技术,用于解决回归问题。相比传统的监督学习模型,如深度学习提到的学习数据表征而非特定任务算法的方法[^2],高斯过程提供了一种更加灵活的概率建模方式。给定训练集 \( D=\{(x_i,y_i)\}_{i=1}^{n} \),目标是从输入空间到输出空间映射关系进行推断。具体来说,假设观测值 y 被视为潜在函数 f 加上噪声的结果,则整个推理框架基于联合多维正态分布构建而成[^6]。 #### 实现简单的一维高斯过程回归 下面给出一段简化版的一维高斯过程回归Python代码示例: ```python from sklearn.gaussian_process import GaussianProcessRegressor from sklearn.gaussian_process.kernels import RBF, ConstantKernel as C import numpy as np # 创建核函数对象 kernel = C(1.0, (1e-3, 1e3)) * RBF(10, (1e-2, 1e2)) # 初始化GP实例 gp = GaussianProcessRegressor(kernel=kernel, n_restarts_optimizer=9) # 训练数据 X_train = np.array([[-1], [0], [1]]) y_train = np.sin(X_train).ravel() # 拟合模型 gp.fit(X_train, y_train) # 测试数据网格化 X_test = np.linspace(-2, 2, 100).reshape(-1, 1) # 进行预测 mean_prediction, std_prediction = gp.predict(X_test, return_std=True) # 可视化结果... ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿老甘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值