高斯混合模型是一种概率模型,它假设所有数据点都是由一组具有未知参数的多个高斯(正态)分布混合生成的。与 K-Means 这类基于质心距离将每个点硬分配给单个簇的硬聚类方法不同,GMM 通过计算每个点属于多个簇的概率,来实现“软聚类”。
!GMM
上图展示了三个不同的一维高斯分布。每条曲线都代表正态分布的理论概率密度函数,清晰地展示了它们在位置(均值)和离散程度(方差)上的差异。
GMM 的工作原理
!<a href="https://media.geeksforgeeks.org/wp-content/uploads/20251118143927764248/gaussianmixturemodelprocess.webp">gaussianmixturemodelprocess
高斯混合模型的核心假设是:数据是由 $K$ 个高斯分布混合生成的,每一个分布代表一个簇。每一个高斯分布都有其自己独特的均值 $\muk$、协方差矩阵 $\Sigmak$ 以及混合权重 $\pi_k$。
1. 后验概率(簇的归属责任)
对于给定的数据点 $x_n$,GMM 会计算它属于第 $k$ 个簇的概率:
> $P(zn = k \mid xn) = \frac{\pik \cdot \mathcal{N}(xn \mid \muk, \Sigmak)}{\sum{k=1}^{K} \pik \cdot \mathcal{N}(xn \mid \muk, \Sigma_k)}$
其中:
- $z_n$ 是一个隐变量,指示该数据点究竟属于哪一个高斯分布。
- $\pi_k$ 是第 $k$ 个高斯分布的混合概率。
- $\mathcal{N}(xn \mid \muk, \Sigmak)$ 是均值为 $\muk$、协方差为 $\Sigma_k$ 的高斯分布。
2. 数据点的似然度
一个数据点 $x_n$ 在所有高斯分布下的总似然度为:
> $P(xn) = \sum{k=1}^{K} \pik \mathcal{N}(xn \mid \muk, \Sigmak)$
这个公式代表了整个混合模型解释该数据点的优劣程度。
3. 期望最大化算法
我们通常使用 EM 算法来训练 GMM,这是一个迭代的过程,旨在估计出最佳的模型参数:
E步:利用当前的参数值,计算每个簇对每个数据点的“责任”(即归属概率)。
M步:利用 E 步计算出的责任值,来更新:
- 均值 $\mu_k$
- 协方差 $\Sigma_k$
- 混合系数 $\pi_k$
这个过程会不断循环,直到模型的对数似然值趋于稳定为止。
4. 混合模型的对数似然
EM 算法优化的目标函数如下:
> $L(\muk, \Sigmak, \pik) = \prod{n=1}^{N} \sum{k=1}^{K} \pik \mathcal{N}(xn \mid \muk, \Sigma_k)$
EM 算法在每一次迭代中都会增加这个似然值。
GMM 中的簇形状
在 GMM 中,每个簇都由一个高斯分布定义,其特征包括:
- 均值 ($\mu$):决定了簇的中心位置。
- 协方差 ($\Sigma$):决定了簇的形状、方向和离散程度。
由于协方差矩阵允许呈现椭圆形,因此 GMM 能够很好地建模:
- 被拉长的簇
- 倾斜旋转的簇
- 相互重叠的簇
这使得 GMM 比 K-Means 这类通常假设簇为球形的算法更加灵活。
可视化 GMM 通常包括:
- 显示原始数据的散点图
- 显示每个高斯分量形状的椭圆轮廓(或 KDE 曲线)
这些可视化手段生动地展示了 GMM 如何适应复杂的现实世界数据分布。
实现高斯混合模型 (GMM)
首先,我们需要导入必要的库。这里我们使用 make_blobs 来创建一个简单的合成数据集用于演示。
import numpy as np
import matplotlib.pyplot as plt
from sklearn.mixture import GaussianMixture
from sklearn.datasets import make_blobs
第一步:生成合成数据
让我们在二维空间中生成 500 个点,它们围绕 3 个中心聚集。INLINECODEde2bf3e4 参数控制了每个簇的紧密度或离散度。这里的 INLINECODE11217566 是真实的标签(仅供参考)。
X, y = make_blobs(
n_samples=500,
centers=3,
random_state=42,
cluster_std=[1.0, 1.5, 0.8] # 每个簇的离散度
)
第二步:拟合高斯混合模型
在这一步,我们将执行以下操作:
fit(X)运行 EM 算法,学习数据的均值、协方差和混合权重。labels给出每个点的簇索引(即具有最高后验概率的分量)。
gmm = GaussianMixture(
n_components=3, # 高斯分量的数量
covariance_type=‘full‘,
random_state=42
)
gmm.fit(X)
labels = gmm.predict(X)
第三步:绘制簇和分量中心
最后,我们根据分配的簇对点进行着色,并用红色的 "X" 标记显示学习到的高斯分布中心。
(注:此处原文描述了可视化结果,具体绘图代码可依需求补充)