高斯混合模型(GMM)三大核心内容
高斯混合模型(GMM)包含三大核心组成部分,并非三种独立的聚类算法,而是 GMM 数学实现的三个模块:
- 混合模型概率密度函数:描述整体数据分布,表达为多个高斯分布的加权和。
- 多元高斯分布概率密度函数:计算每个点在每个簇下的概率。
- 期望最大化(EM)算法:用于参数估计的优化算法,分为 E 步和 M 步。
GMM 聚类的简化实际流程:
- 用混合模型概率密度函数描述整体分布
- 用多元高斯分布概率密度函数计算每个点的概率
- 用 EM 算法迭代优化参数
- 最终得到聚类结果
一、混合模型概率密度函数
GMM 假设数据分布为多个高斯分布的加权和:
$$p(x) = \sum_{k=1}^{K} \pi_k \mathcal{N}(x | \mu_k, \Sigma_k)$$
其中 $\mathcal{N}(x | \mu_k, \Sigma_k)$ 是第 $k$ 个高斯分布的概率密度,$\pi_k$ 是第 $k$ 个分量的权重(满足 $\sum_{k=1}^K \pi_k = 1$),$K$ 为簇数。
案例解释 假设有 2 个簇($K=2$),每个簇的均值、协方差和权重分别为 $\mu_2 = (10,2)$, $\Sigma_2 = [1,1]$, $\pi_2=0.5$ 以及 $\mu_1 = (1,2)$, $\Sigma_1 = [1,1]$, $\pi_1=0.5$,则任意点 $x$ 的概率密度就是两个高斯分布的加权和。
二、多元高斯分布概率密度函数
单个高斯分布的概率密度为:
$$\mathcal{N}(x | \mu, \Sigma) = \frac{1}{(2\pi)^{D/2} |\Sigma|^{1/2}} \exp\left(-\frac{1}{2}(x - \mu)^\top \Sigma^{-1} (x - \mu)\right)$$
其中 $|\Sigma|$ 为协方差矩阵的行列式,$D$ 为数据维度。
案例解释 对于二维点 $x=(x_1, x_2)$,可直接代入公式计算。
三、期望最大化(EM)算法
GMM 的参数用 EM 算法迭代估计:
1. 初始化
随机设定 $\mu_k$、$\Sigma_k$、$\pi_k$。
2. E 步(Expectation)
计算每个点属于每个簇的后验概率(责任度):
$$\gamma_{ik} = \frac{\pi_k \mathcal{N}(x_i | \mu_k, \Sigma_k)}{\sum_{j=1}^K \pi_j \mathcal{N}(x_i | \mu_j, \Sigma_j)}$$
其中 $\gamma_{ik}$ 表示第 $i$ 个样本属于第 $k$ 个簇的概率。
3. M 步(Maximization)
根据 $\gamma_{ik}$ 更新参数:
$$N_k = \sum_{i=1}^N \gamma_{ik}$$ $$\mu_k = \frac{1}{N_k} \sum_{i=1}^N \gamma_{ik} x_i$$ $$\Sigma_k = \frac{1}{N_k} \sum_{i=1}^N \gamma_{ik} (x_i - \mu_k)(x_i - \mu_k)^\top$$ $$\pi_k = \frac{N_k}{N}$$
4. 重复 E 步和 M 步,直到参数收敛
四、完整案例流程
数据
| 点 | x | y |
|---|---|---|
| A | 1 | 2 |
| B | 2 | 1 |
| C | 1 | 4 |
| D | 10 | 2 |
| E | 12 | 3 |
| F | 11 | 4 |
步骤
- 初始化:设 $K=2$,初始均值 $\mu_1=(1,2)$(A),$\mu_2=(10,2)$(D),协方差为单位阵,$\pi_1=\pi_2=0.5$。
- E 步:对每个点,分别计算其在两个高斯分布下的概率密度,再按公式求 $\gamma_{ik}$。
- M 步:用 $\gamma_{ik}$ 加权更新每个簇的均值、协方差和权重。
- 迭代:重复 E 步和 M 步,直到参数收敛。
最终结果:每个点属于每个簇的概率 $\gamma_{ik}$,可用最大概率分配标签,也可用概率做软聚类。
五、Python 代码实现
需先安装依赖库:pip install scikit-learn
import numpy as np
import matplotlib.pyplot as plt
from sklearn.mixture import GaussianMixture
from matplotlib.patches import Ellipse
def plot_gmm_clusters(X, gmm, std_multiplier=4):
labels = gmm.predict(X)
plt.figure(figsize=(8,6))
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis', s=100, label='Data points')
plt.scatter(gmm.means_[:, 0], gmm.means_[:, 1], c='red', marker='x', s=200, label='Cluster centers')
ax = plt.gca()
for i in range(gmm.n_components):
mean = gmm.means_[i]
covar = gmm.covariances_[i]
v, w = np.linalg.eigh(covar)
order = v.argsort()[::-1]
v = v[order]
w = w[:, order]
angle = np.degrees(np.arctan2(w[1, 0], w[0, 0]))
width, height = std_multiplier * np.sqrt(v)
ell = Ellipse(mean, width, height, angle=angle, edgecolor='red', facecolor='none', linestyle='--', linewidth=2)
ax.add_patch(ell)
plt.title(f'Gaussian Mixture Model Clustering with {std_multiplier} Std Ellipses')
plt.xlabel('X')
plt.ylabel('Y')
plt.legend()
plt.grid(True)
plt.show()
# 示例数据
X = np.array([[1,2],[2,1],[1,4],[10,2],[12,3],[11,4]])
# 建立 GMM 模型,设定簇数为 2
gmm = GaussianMixture(n_components=2, covariance_type='full', random_state=0)
gmm.fit(X)
# 调用绘图函数
plot_gmm_clusters(X, gmm, std_multiplier=4)
# 输出每个点属于各簇的概率
probs = gmm.predict_proba(X)
for i, p in enumerate(probs):
print(f"Point {i} probabilities: {p}")
六、模型选择指标(BIC、AIC)确定簇数
在实际应用中,GMM 需要用户指定簇数(n_components),但真实数据的最佳簇数往往未知。为此,统计学上常用 AIC(Akaike Information Criterion)和 BIC(Bayesian Information Criterion)来辅助选择最优模型。
1. AIC(Akaike 信息准则)
$$\mathrm{AIC} = 2k - 2\log(L)$$
其中 $k$ 是模型参数数量,$L$ 是最大似然估计下的似然值。AIC 越小,模型越优。
2. BIC(贝叶斯信息准则)
$$\mathrm{BIC} = k \log(n) - 2\log(L)$$
其中 $n$ 是样本数。BIC 同样越小越好,但对模型复杂度惩罚更强。
3. 实际用法
- 训练不同簇数的 GMM 模型,分别计算 AIC 和 BIC。
- 选择 AIC/BIC 最小的模型作为最优簇数。
七、GMM 的优缺点
优点
- 软聚类,给出每个点属于各簇的概率
- 能拟合复杂的椭球形簇,适合多样分布
- 适合高维数据,参数灵活
缺点
- 对初始参数敏感,可能陷入局部最优
- 计算复杂度较高,尤其是协方差矩阵估计
- 需预先指定簇数
八、总结
高斯混合模型是一种强大的概率聚类方法,适合复杂数据的软分配和多样簇形建模。通过 EM 算法迭代估计参数,GMM 能为每个样本点提供属于各簇的概率,提升聚类的灵活性和解释力。实际应用中,需结合模型选择指标(如 BIC、AIC)确定簇数,并关注初始化和参数调优。

