基于Python的机器学习系列(21):高斯混合模型(GMM)聚类

        Gaussian Mixture Models (GMM) 是一种常用的聚类算法,与 K-means 类似,但它基于概率模型来进行数据聚类。与 K-means 基于距离度量不同,GMM 通过高斯分布来建模每个簇,并使用概率来判断样本属于哪个簇。下面我们将详细介绍 GMM 的工作原理,并提供一个实现示例。

问题定义

        在 GMM 中,我们假设数据集由多个高斯分布组成,每个高斯分布对应一个簇。每个簇由两个主要参数定义:均值和协方差。均值决定了簇的中心位置,而协方差则描述了簇的形状和扩展。

        具体来说,GMM 试图找出数据点的概率分布,认为这些数据点是由若干个高斯分布混合而成的。每个数据点的生成可以看作是从多个高斯分布中的一个进行抽样。我们需要估计这些高斯分布的均值、协方差以及每个分布的权重(即每个簇的概率)。

GMM 算法

        GMM 算法的核心是期望最大化 (Expectation-Maximization, EM) 算法。EM 算法由两个步骤组成:

  1. 期望步骤 (E-step): 计算每个数据点属于每个簇的概率。这些概率基于当前的高斯分布参数。

  2. 最大化步骤 (M-step): 根据 E-step 计算得到的概率,更新高斯分布的均值、协方差以及簇的权重。

        通过迭代这两个步骤,GMM 会逐渐收敛到一个最优解,即在当前参数下,数据点属于各个簇的概率最大化。

GMM 的 Python 实现

        下面是一个使用 Python 的 GMM 实现示例,我们使用 sklearn 库中的 GaussianMixture 类来进行聚类。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.mixture import GaussianMixture
from sklearn.datasets import make_blobs

# 生成数据
X, y = make_blobs(n_samples=300, centers=4, cluster_std=0.60, random_state=0)

# 使用 GMM 进行聚类
gmm = GaussianMixture(n_components=4, random_state=0)
gmm.fit(X)
labels = gmm.predict(X)

# 可视化结果
plt.scatter(X[:, 0], X[:, 1], c=labels, s=40, cmap='viridis')
plt.title('Gaussian Mixture Model Clustering')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.show()

        在上面的代码中,我们首先生成一个包含 4 个簇的数据集。然后,我们创建一个 GaussianMixture 对象,指定簇的数量为 4,并对数据进行训练。最后,我们使用 predict 方法来预测每个数据点的簇,并将结果可视化。

选择簇的数量

        与 K-means 类似,选择 GMM 的簇数也是一个关键问题。我们可以使用几种方法来选择最优的簇数,例如:

  • 轮廓系数 (Silhouette Score): 计算每个点与其簇内其他点的相似度和与最近簇的相似度之间的差异。
  • BIC (Bayesian Information Criterion) 和 AIC (Akaike Information Criterion): 这些准则用于选择模型的复杂度,帮助确定簇的数量。

        以下是选择最佳簇数的代码示例:

from sklearn.mixture import GaussianMixture
from sklearn.datasets import make_blobs
from sklearn.metrics import silhouette_score

# 生成数据
X, _ = make_blobs(n_samples=300, centers=4, cluster_std=0.60, random_state=0)

# 测试不同的簇数
best_n_clusters = None
best_score = -1

for n_clusters in range(2, 8):
    gmm = GaussianMixture(n_components=n_clusters, random_state=0)
    labels = gmm.fit_predict(X)
    score = silhouette_score(X, labels)
    print(f"Number of clusters: {n_clusters}, Silhouette Score: {score}")
    if score > best_score:
        best_score = score
        best_n_clusters = n_clusters

print(f"Best number of clusters: {best_n_clusters}")

        在这个示例中,我们计算了不同簇数下的轮廓系数,以选择最优的簇数。

总结

        Gaussian Mixture Models 提供了一种基于概率的聚类方法,通过估计数据点属于各个簇的概率来进行聚类。与 K-means 不同,GMM 可以处理复杂的簇形状,并通过 EM 算法不断优化模型参数。虽然 GMM 比 K-means 计算复杂度高,但在处理真实世界的数据时,它往往能提供更准确的聚类结果。

如果你觉得这篇博文对你有帮助,请点赞、收藏、关注我,并且可以打赏支持我!

欢迎关注我的后续博文,我将分享更多关于人工智能、自然语言处理和计算机视觉的精彩内容。

谢谢大家的支持!

  • 21
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

会飞的Anthony

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

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

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

打赏作者

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

抵扣说明:

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

余额充值