大数跨境
0
0

超全面讲透一个算法模型,GMM !!

超全面讲透一个算法模型,GMM !! 机器学习和人工智能AI
2025-12-07
1

哈喽,大家好~

今天和大家聊的是一个概率模型,高斯混合模型GMM

高斯混合模型就像是一个复杂的模糊分组器,它认为一个数据集实际上是由多个“小团体”组成的,每个“小团体”内的东西大概都是按照钟形曲线(高斯分布)分布的。你可以把它想象成几个重叠的钟形曲线,它们共同构成了你看到的数据的整体。

高斯混合模型是一个概率模型,用于表示一个由多个高斯分布(正态分布)组成的数据集合。GMM 假设数据集中的每个数据点是由多个潜在的高斯分布之一生成的。这些高斯分布的参数(如均值和方差)以及它们的权重(每个分布的贡献程度)是需要估计的。

数学上,GMM 的形式可以表示为:

其中:

  •  是数据点。
  •  是高斯分布的数量(也称为组件)。
  •  是第   个高斯分布的混合权重,满足 
  •  是第   个高斯分布,具有均值   和协方差矩阵 

想到一个非常直观的例子,大家可以想象一下~

假设你在城市的不同咖啡店测量了人们的身高。由于不同地区的人群有不同的身高分布,你会发现你测到的数据有几个明显的“高峰”,每个高峰代表了一个区域的身高分布。如果把这些高峰看作是单个的高斯分布(钟形曲线),那么 GMM 就会告诉你,每个数据点(每个人的身高)是由哪个钟形曲线生成的,或者说属于哪个“群体”。

理论基础

高斯混合模型 (GMM) 是基于统计学的概率模型,用于表示由多个高斯分布组成的数据集合。

核心思想是,假设数据是由多个不同的高斯分布混合生成的。

  1. 高斯分布 (Gaussian Distribution)

高斯分布,也称正态分布,是一种具有钟形曲线的连续概率分布。对于一个   维数据点  ,其概率密度函数 (pdf) 定义为:

其中,  是均值向量,  是协方差矩阵,  是协方差矩阵的行列式。

  1. 高斯混合模型 (Gaussian Mixture Model)

GMM 假设数据点   是由   个高斯分布的加权组合生成的,其概率密度函数是这些高斯分布的线性组合:

其中,  是第   个高斯分布的混合权重,满足   和   分别是第   个高斯分布的均值和协方差矩阵。

  1. 期望最大化 (Expectation-Maximization, EM) 算法

EM 算法用于估计 GMM 的参数,包括均值向量  、协方差矩阵   和混合权重  。它通过交替执行两个步骤来逐步优化这些参数:期望步骤 (E-step) 和最大化步骤 (M-step)。

算法流程

高斯混合模型的学习过程通常通过 EM 算法来实现。

  1. 初始化

选择初始参数 

  • 均值向量 
  • 协方差矩阵 
  • 混合权重 

初始化的方法可以是随机初始化,或基于其他方法(例如 K-means 结果)。

  1. 期望步骤 (E-step)

计算每个数据点属于每个高斯分布的后验概率,即责任 (responsibility)  ,表示第   个数据点由第   个高斯分布生成的概率。其公式为:

其中,  是第   个数据点,  表示数据点   属于第   个高斯分布的概率。

  1. 最大化步骤 (M-step)

使用 E-step 计算得到的后验概率来更新参数。新的参数通过最大化对数似然估计得到:

  • 更新混合权重:

其中,  表示所有数据点对第   个高斯分布的总责任,  是数据点的总数。

  • 更新均值向量:
  • 更新协方差矩阵:
  1. 检查收敛

检查参数的变化或对数似然的变化是否达到预设的收敛条件(例如,小于某个阈值)。如果达到收敛条件,则停止迭代;否则,返回 E-step。

  1. 输出结果

当达到收敛条件时,输出估计得到的参数 

一个例子

假设我们有一个二维数据集,并且认为它是由两个高斯分布生成的:

  1. 初始化
  • 随机选择两个初始均值,例如   和 
  • 初始化协方差矩阵,例如  (单位矩阵)。
  • 初始化混合权重为相等,例如 
  1. 期望步骤 (E-step):
  • 计算每个数据点属于每个高斯分布的责任(后验概率)。
  1. 最大化步骤 (M-step):
  • 使用责任来更新均值、协方差矩阵和混合权重。
  1. 检查收敛
  • 检查参数是否收敛,如果没有,重复 E-step 和 M-step。

最终,得到两个高斯分布的参数,它们共同描述了数据的分布情况。通过这些参数,可以理解数据如何由这两个分布混合生成。

应用场景

高斯混合模型 (GMM) 适用于以下类型的问题:

  1. 聚类 (Clustering)

    GMM 用于将数据集分成多个簇(群体),每个簇由一个高斯分布描述。相比于 K-means 聚类,GMM 允许簇具有不同的形状、大小和方向。

  2. 密度估计 (Density Estimation)

    GMM 可以用来估计数据的概率密度函数,适合于需要估计复杂分布的场景。例如,用于生成新的数据点或进行概率预测。

  3. 异常检测 (Anomaly Detection)

    通过估计数据的概率密度,可以识别概率低的数据点,适合于检测异常或异常行为。例如,在网络安全中识别异常流量。

  4. 数据生成 (Data Generation)

    使用 GMM 生成与原始数据类似的新数据点,适用于合成数据生成和数据增强等任务。

优缺点

优点:

  1. 灵活性:GMM 可以处理复杂的多峰数据分布,每个高斯组件允许不同的均值和协方差矩阵。
  2. 软分配:与 K-means 不同,GMM 为每个数据点分配概率,而不是硬分配,这种软分配适合处理有重叠的簇。
  3. 概率解释:GMM 提供了概率上的解释,适用于需要概率输出的应用。
  4. 密度估计:能够用于估计数据的概率密度,适合于未知分布的数据。

缺点:

  1. 对初始值敏感:GMM 对初始参数敏感,不同的初始化可能导致不同的结果。
  2. 可能陷入局部最优:EM 算法可能收敛到局部最优,需要多次运行以避免。
  3. 计算复杂:特别是对于高维数据或大规模数据,计算协方差矩阵和概率密度可能非常复杂。
  4. 假设数据是高斯分布:如果数据显著偏离高斯分布假设,GMM 可能表现不佳。

运用前提条件

  1. 数据独立同分布:假设数据点是独立同分布的。
  2. 簇结构可表示为高斯分布:假设每个簇可以用高斯分布描述,即数据的簇是椭圆形的分布。
  3. 参数初始化:需要合理的参数初始化来提高收敛到全局最优解的概率。
  4. 维度适中:对于非常高维的数据,协方差矩阵计算可能复杂,可能需要降维处理。

完整案例

现在我们使用 Python 对一个大规模数据集进行 GMM 聚类,并展示如何进行算法优化和复杂的可视化。通过这个案例,大家基本可以理解其中的逻辑。

这里以一个合成的大数据集为例。

1. 设置环境和导入库

其中有不熟悉的库,可以单独查查,了解其功能。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from sklearn.mixture import GaussianMixture
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
from sklearn.datasets import make_blobs
from scipy.spatial.distance import cdist

2. 创建合成数据集

生成一个合成的三维大数据集,模拟复杂的高斯混合分布数据。

# 设置种子以确保结果可重复
np.random.seed(42)

# 生成合成数据集
n_samples = 100000
n_features = 3
n_clusters = 5

X, true_labels = make_blobs(n_samples=n_samples, n_features=n_features, centers=n_clusters, cluster_std=1.5, random_state=42)

# 标准化数据
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# 将数据转换为 DataFrame
df = pd.DataFrame(X_scaled, columns=['Feature1''Feature2''Feature3'])

3. 确定最佳的聚类数目

使用肘部法来确定 GMM 的最佳组件数。

# 范围从1到10
n_components_range = range(111)

# 保存 BIC 值
bic_scores = []

for n_components in n_components_range:
    gmm = GaussianMixture(n_components=n_components, random_state=42)
    gmm.fit(X_scaled)
    bic_scores.append(gmm.bic(X_scaled))

# 绘制 BIC 值
plt.plot(n_components_range, bic_scores, marker='o')
plt.title('BIC Scores vs. Number of Components')
plt.xlabel('Number of Components')
plt.ylabel('BIC Score')
plt.show()

# 打印最佳组件数
best_n_components = np.argmin(bic_scores) + 1
print(f'Optimal number of components: {best_n_components}')

4. 应用 GMM 进行聚类

使用最佳组件数来训练 GMM 模型,并预测数据点的簇标签。

# 训练 GMM
gmm = GaussianMixture(n_components=best_n_components, covariance_type='full', random_state=42)
gmm.fit(X_scaled)
labels = gmm.predict(X_scaled)

# 将标签添加到 DataFrame
df['Cluster'] = labels

5. 可视化结果

使用三维散点图和主成分分析 (PCA) 可视化高维数据的聚类结果。

# 3D 可视化
fig = plt.figure(figsize=(108))
ax = fig.add_subplot(111, projection='3d')
scatter = ax.scatter(df['Feature1'], df['Feature2'], df['Feature3'], c=labels, cmap='viridis', alpha=0.5)
legend1 = ax.legend(*scatter.legend_elements(), title="Clusters")
ax.add_artist(legend1)
ax.set_title('3D Scatter Plot of GMM Clusters')
ax.set_xlabel('Feature1')
ax.set_ylabel('Feature2')
ax.set_zlabel('Feature3')
plt.show()
# PCA 降维并可视化
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X_scaled)

plt.figure(figsize=(108))
plt.scatter(X_pca[:, 0], X_pca[:, 1], c=labels, cmap='viridis', alpha=0.5)
plt.title('2D PCA Plot of GMM Clusters')
plt.xlabel('Principal Component 1')
plt.ylabel('Principal Component 2')
plt.colorbar(label='Cluster')
plt.show()

6. 算法优化

为 GMM 模型设置迭代次数和初始化参数,以提高性能。

# 优化 GMM
optimized_gmm = GaussianMixture(n_components=best_n_components, covariance_type='full', max_iter=500, n_init=10, random_state=42)
optimized_gmm.fit(X_scaled)
optimized_labels = optimized_gmm.predict(X_scaled)

# 更新 DataFrame
df['OptimizedCluster'] = optimized_labels

# 可视化优化后的结果
fig = plt.figure(figsize=(108))
ax = fig.add_subplot(111, projection='3d')
scatter = ax.scatter(df['Feature1'], df['Feature2'], df['Feature3'], c=optimized_labels, cmap='plasma', alpha=0.5)
legend1 = ax.legend(*scatter.legend_elements(), title="Optimized Clusters")
ax.add_artist(legend1)
ax.set_title('3D Scatter Plot of Optimized GMM Clusters')
ax.set_xlabel('Feature1')
ax.set_ylabel('Feature2')
ax.set_zlabel('Feature3')
plt.show()
# PCA 降维并可视化
X_pca_optimized = pca.fit_transform(X_scaled)

plt.figure(figsize=(108))
plt.scatter(X_pca_optimized[:, 0], X_pca_optimized[:, 1], c=optimized_labels, cmap='plasma', alpha=0.5)
plt.title('2D PCA Plot of Optimized GMM Clusters')
plt.xlabel('Principal Component 1')
plt.ylabel('Principal Component 2')
plt.colorbar(label='Optimized Cluster')
plt.show()

7. 评估模型

评估 GMM 聚类的效果,如计算轮廓分数。

from sklearn.metrics import silhouette_score

# 计算轮廓分数
silhouette_avg = silhouette_score(X_scaled, optimized_labels)
print(f'Silhouette Score: {silhouette_avg:.3f}')

这个案例展示了使用 GMM 进行大规模数据的聚类过程,包括数据标准化、确定最佳组件数、应用 GMM 以及通过复杂的可视化来展示结果。此外,通过调整 GMM 的迭代次数和初始化来优化算法,提升模型的性能。

最后

最近准备了16大块的内容,124个算法问题的总结,完整的机器学习小册,免费领取~
领取:备注「算法小册」即可~
扫码如有问题,记得添加微信号:xiaobai_ml012

【声明】内容源于网络
0
0
机器学习和人工智能AI
让我们一起期待 AI 带给我们的每一场变革!推送最新行业内最新最前沿人工智能技术!
内容 333
粉丝 0
机器学习和人工智能AI 让我们一起期待 AI 带给我们的每一场变革!推送最新行业内最新最前沿人工智能技术!
总阅读215
粉丝0
内容333