从K-Means到GMM:5种聚类算法对比实测,哪种最适合你的数据?

部署运行你感兴趣的模型镜像

第一章:Python数据聚类实战

在数据分析与机器学习领域,聚类是一种无监督学习方法,用于发现数据中的自然分组结构。Python凭借其丰富的科学计算库,成为实现聚类算法的首选语言之一。本章将使用scikit-learn和matplotlib完成一个完整的K-means聚类实战案例。

环境准备与数据生成

首先确保安装必要的依赖包:
pip install numpy matplotlib scikit-learn
接下来生成模拟的二维数据集,便于可视化聚类效果:
import numpy as np
from sklearn.datasets import make_blobs

# 生成包含3个簇的样本数据
X, _ = make_blobs(n_samples=300, centers=3, cluster_std=0.8, random_state=42)
# X 是形状为 (300, 2) 的特征矩阵

K-means聚类实现

使用scikit-learn的KMeans类执行聚类分析:
from sklearn.cluster import KMeans

# 设置聚类数量为3
kmeans = KMeans(n_clusters=3, random_state=42)
y_pred = kmeans.fit_predict(X)  # 拟合并预测簇标签

结果可视化

通过matplotlib绘制聚类结果:
import matplotlib.pyplot as plt

plt.scatter(X[:, 0], X[:, 1], c=y_pred, cmap='viridis', s=50)
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], 
            c='red', marker='x', s=200, label='Centroids')
plt.legend()
plt.title("K-means Clustering Result")
plt.show()

聚类性能评估指标

常用的内部评估指标包括轮廓系数和惯性值(inertia):
  • 惯性值:所有点到其所属簇中心的平方距离之和
  • 轮廓系数:衡量样本与其自身簇和其他簇的分离程度,取值范围[-1, 1]
指标scikit-learn属性/函数说明
惯性值kmeans.inertia_值越小表示簇内紧凑性越高
轮廓系数silhouette_score(X, y_pred)接近1表示聚类效果良好

第二章:K-Means聚类算法原理与实现

2.1 K-Means算法核心思想与数学原理

核心思想
K-Means是一种基于距离的无监督聚类算法,其目标是将数据集划分为K个簇,使得每个数据点归属于最近的簇中心。算法通过最小化簇内样本到质心的平方误差和来实现聚类。
数学原理
设数据集为 $ \{x_1, x_2, ..., x_n\} $,K个簇中心为 $ \{\mu_1, \mu_2, ..., \mu_K\} $,目标函数为:

J = \sum_{i=1}^{K} \sum_{x \in C_i} \|x - \mu_i\|^2
其中 $ C_i $ 表示第i个簇,$ \mu_i $ 是该簇的均值(质心)。
算法流程
  1. 初始化:随机选择K个初始质心
  2. 分配:将每个点分配给最近的质心
  3. 更新:重新计算每个簇的质心
  4. 迭代:重复步骤2-3直至质心不再显著变化

2.2 使用scikit-learn实现K-Means聚类

快速入门K-Means模型构建
在scikit-learn中,K-Means聚类可通过KMeans类轻松实现。首先导入必要模块并准备数据:
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs

# 生成模拟数据
X, _ = make_blobs(n_samples=300, centers=4, cluster_std=0.6, random_state=0)
上述代码生成包含300个样本、4个簇的二维数据,用于后续聚类分析。
模型训练与参数解析
配置K-Means模型时,关键参数包括n_clusters(簇数量)和init(初始化方式):
kmeans = KMeans(n_clusters=4, init='k-means++', n_init=10, random_state=0)
kmeans.fit(X)
labels = kmeans.labels_
centers = kmeans.cluster_centers_
其中,k-means++优化初始质心选择,减少收敛迭代次数;n_init指定多次随机初始化以提升稳定性。

2.3 聚类效果评估:轮廓系数与肘部法则

在无监督学习中,聚类效果的量化至关重要。由于缺乏真实标签,需依赖内部指标评估簇的紧致性与分离性。
轮廓系数(Silhouette Score)
轮廓系数衡量样本与其所属簇内其他点的接近程度,以及与其他簇的分离程度。其值介于 -1 到 1 之间,越接近 1 表示聚类效果越好。
from sklearn.metrics import silhouette_score
from sklearn.cluster import KMeans

score = silhouette_score(X, labels)
print(f"轮廓系数: {score:.3f}")
该代码计算给定数据 X 和聚类标签 labels 的平均轮廓系数。高分表明簇内紧凑、簇间分离。
肘部法则(Elbow Method)
通过绘制不同 k 值对应的簇内平方和(WCSS),寻找“肘部”拐点以确定最优簇数。
  • 计算多个 k 值下的 WCSS
  • 绘制曲线并识别下降趋势变缓的拐点
该方法虽直观,但有时拐点不明显,需结合轮廓系数综合判断。

2.4 K-Means在真实数据集上的应用实战

加载与预处理鸢尾花数据集
使用scikit-learn内置的鸢尾花数据集进行聚类分析,首先对特征进行标准化处理以消除量纲影响。
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans

# 加载数据
iris = load_iris()
X = iris.data

# 标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
StandardScaler确保各特征处于同一数量级,避免花瓣长度等大范围特征主导聚类结果。
执行K-Means聚类
设定聚类数k=3,调用KMeans算法拟合数据:
kmeans = KMeans(n_clusters=3, random_state=42, n_init='auto')
labels = kmeans.fit_predict(X_scaled)
参数n_init='auto'提升收敛稳定性,random_state保证结果可复现。输出的labels即为每个样本的簇归属。

2.5 算法局限性分析与改进思路

常见性能瓶颈
在高维数据场景下,传统算法如K-means易受初始中心点影响,导致收敛至局部最优。此外,距离度量对异常值敏感,影响聚类效果。
改进策略示例
采用K-means++初始化可优化质心选择。以下为关键代码片段:

# 使用scikit-learn实现K-means++
from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters=3, init='k-means++', n_init=10)
kmeans.fit(X)
其中,init='k-means++'确保初始中心点分布更合理,n_init控制重复运行次数以提升稳定性。
  • 引入降维预处理(如PCA)缓解维度灾难
  • 结合DBSCAN识别噪声点,增强鲁棒性

第三章:高斯混合模型(GMM)深入解析

3.1 GMM的概率生成模型与EM算法

高斯混合模型(Gaussian Mixture Model, GMM)是一种常用的概率生成模型,假设数据由多个高斯分布线性组合而成。每个成分对应一个聚类中心,通过隐变量表示样本所属的分布成分。
模型数学表达
GMM的概率密度函数为:

p(x) = Σk=1K πk · N(x | μk, Σk)
其中,πk 是第k个高斯成分的先验权重,μk 和 Σk 分别为其均值和协方差矩阵。
EM算法迭代优化
由于隐变量存在,直接最大似然估计困难,采用期望最大化(EM)算法分两步迭代:
  • E步:计算后验概率 γ(znk) = P(zn=k | xn)
  • M步:更新参数 μk, Σk, πk 以最大化期望似然
该过程持续直至收敛,实现对复杂分布的有效建模。

3.2 基于GaussianMixture的聚类实现

高斯混合模型原理
GaussianMixture(高斯混合模型,GMM)是一种基于概率分布的软聚类方法,假设数据由多个高斯分布线性组合而成。与KMeans硬聚类不同,GMM输出样本属于各类的概率,更适合处理重叠簇。
代码实现与参数解析
from sklearn.mixture import GaussianMixture
import numpy as np

# 生成示例数据
X = np.array([[1, 2], [1, 4], [2, 2], [8, 8], [9, 8]])

# 构建GMM模型
gmm = GaussianMixture(n_components=2, covariance_type='full', random_state=42)
labels = gmm.fit_predict(X)
probs = gmm.predict_proba(X)
其中,n_components指定聚类数量,covariance_type控制协方差矩阵结构('full'表示各簇可拥有任意形状),fit_predict返回最可能的类别标签,而predict_proba输出后验概率分布。
核心优势对比
  • 支持软聚类,提供概率形式的隶属度
  • 能拟合非球形、重叠的数据簇
  • 通过BIC/AIC可辅助选择最优组件数

3.3 GMM与K-Means的对比实验分析

算法原理差异
K-Means基于距离最小化进行硬聚类,每个样本仅属于一个簇;而GMM(高斯混合模型)采用概率框架实现软聚类,通过EM算法估计各成分的均值、协方差及混合系数,支持更复杂的分布建模。
实验设置与结果对比
在二维合成数据集上,分别运行两种算法。以下为Python代码示例:

from sklearn.mixture import GaussianMixture
from sklearn.cluster import KMeans

# K-Means模型
kmeans = KMeans(n_clusters=3, random_state=42)
labels_kmeans = kmeans.fit_predict(X)

# GMM模型
gmm = GaussianMixture(n_components=3, covariance_type='full', random_state=42)
labels_gmm = gmm.fit_predict(X)
其中,covariance_type='full' 表示每个簇可学习任意协方差结构,提升对非球形分布的适应能力。
性能评估指标
使用轮廓系数和调整兰德指数(ARI)进行量化比较:
算法轮廓系数ARI
K-Means0.580.72
GMM0.650.81
结果显示GMM在复杂结构数据中具备更强的表达能力。

第四章:其他主流聚类算法实战对比

4.1 层次聚类:凝聚过程与树状图分析

层次聚类是一种无需预先指定簇数量的聚类方法,其中凝聚式层次聚类(Agglomerative Clustering)从每个样本作为独立簇开始,逐步合并最相似的簇,直至所有样本归属于一个簇。
凝聚过程步骤
  1. 将每个数据点视为一个独立的簇
  2. 计算所有簇之间的距离(常用欧氏距离)
  3. 合并距离最近的两个簇
  4. 更新簇间距离矩阵
  5. 重复步骤3-4,直到所有点合并为一个簇
树状图(Dendrogram)分析
树状图可视化了聚类过程中簇的合并顺序和距离。通过设定高度阈值,可切割树状图以获得特定数量的簇。
from scipy.cluster.hierarchy import dendrogram, linkage
import matplotlib.pyplot as plt

# 使用linkage生成凝聚层次结构
linked = linkage(data, method='ward')  # method: 'single', 'complete', 'average', 'ward'
dendrogram(linked)
plt.title("Hierarchical Clustering Dendrogram")
plt.xlabel("Sample Index")
plt.ylabel("Distance")
plt.show()
上述代码中,linkage 函数执行凝聚聚类,参数 method='ward' 最小化簇内方差,适合球形簇结构。树状图帮助识别自然的簇划分层级。

4.2 DBSCAN:基于密度的噪声鲁棒聚类

DBSCAN(Density-Based Spatial Clustering of Applications with Noise)通过识别高密度区域将数据点聚类,同时有效识别孤立点作为噪声。
核心概念与参数
算法依赖两个关键参数:
  • eps (ε):邻域半径,决定某点周围多大范围内视为“邻近”;
  • minPts:成为核心点所需的最小邻域点数。
算法流程示意
核心点 → 扩展密度可达路径 → 形成簇 → 剩余点标记为噪声
from sklearn.cluster import DBSCAN
import numpy as np

X = np.array([[1, 2], [2, 2], [2, 3], [8, 8], [8, 9], [25, 8]])
clustering = DBSCAN(eps=3, minPts=2).fit(X)
print(clustering.labels_)  # 输出: [0 0 0 1 1 -1]
代码中,前三个点形成簇0,第4、5个点构成簇1,最后一个点因孤立被标记为-1(噪声)。

4.3 谱聚类:图论视角下的非凸结构发现

谱聚类通过构建数据点之间的相似性图,将聚类问题转化为图分割问题,擅长识别传统K-means难以处理的非凸分布结构。
核心步骤流程
  1. 构造相似度矩阵(如高斯核)
  2. 生成图拉普拉斯矩阵
  3. 对拉普拉斯矩阵进行特征分解
  4. 利用前k个最小非零特征向量进行K-means聚类
代码实现示例
from sklearn.cluster import SpectralClustering
sc = SpectralClustering(n_clusters=3, affinity='rbf', gamma=0.1)
labels = sc.fit_predict(X)
该代码使用径向基函数(RBF)核构建相似性矩阵,gamma控制邻居影响范围。SpectralClustering自动完成拉普拉斯矩阵构造与谱分解过程。
性能对比
算法凸形结构非凸结构
K-means✅ 高效准确❌ 易失败
谱聚类⚠️ 可用✅ 表现优异

4.4 多种算法在不同数据形态下的性能对比

常见算法在典型数据分布中的表现
在面对均匀分布、偏态分布和聚集型数据时,不同算法展现出显著差异。快速排序在均匀数据中表现优异,而归并排序在偏态数据中更稳定。
算法均匀数据(ms)偏态数据(ms)聚集数据(ms)
快速排序120280200
归并排序150160155
堆排序180175190
代码实现与关键参数分析
// 快速排序核心逻辑
func QuickSort(arr []int) []int {
    if len(arr) <= 1 {
        return arr
    }
    pivot := arr[len(arr)/2]
    left, mid, right := []int{}, []int{}, []int{}
    for _, v := range arr {
        if v < pivot {
            left = append(left, v)
        } else if v == pivot {
            mid = append(mid, v)
        } else {
            right = append(right, v)
        }
    }
    return append(QuickSort(left), append(mid, QuickSort(right)...)...)
}
该实现采用三路分区策略,pivot选择中位值以提升在聚集数据下的效率。递归分治降低平均时间复杂度至 O(n log n),但在最坏情况下退化为 O(n²)。

第五章:总结与聚类算法选型建议

业务场景驱动的算法选择
在电商用户分群中,若数据分布呈球状且簇大小相近,K-Means 表现优异。以下为典型实现示例:

from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler

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

# 聚类
kmeans = KMeans(n_clusters=5, random_state=42)
labels = kmeans.fit_predict(X_scaled)
处理复杂结构数据的策略
当客户行为数据呈现环形或月牙状分布时,DBSCAN 可有效识别噪声并发现任意形状簇。参数 eps 和 min_samples 需通过网格搜索结合轮廓系数优化。
  • eps 过小导致大量点被标记为噪声
  • min_samples 提高可减少离群点敏感度
  • 使用 KD-Tree 加速邻域查询提升性能
高维数据的降维与聚类协同
文本主题聚类常面临维度灾难。推荐流程如下:
  1. 使用 TF-IDF 或 Sentence-BERT 向量化文本
  2. 通过 UMAP 将向量降至 50 维
  3. 应用 HDBSCAN 进行密度聚类
算法时间复杂度适用场景
K-MeansO(nkd)大规模、球状簇
DBSCANO(n log n)含噪声、非凸簇
HierarchicalO(n³)小样本、需树状结构

您可能感兴趣的与本文相关的镜像

Langchain-Chatchat

Langchain-Chatchat

AI应用
Langchain

Langchain-Chatchat 是一个基于 ChatGLM 等大语言模型和 Langchain 应用框架实现的开源项目,旨在构建一个可以离线部署的本地知识库问答系统。它通过检索增强生成 (RAG) 的方法,让用户能够以自然语言与本地文件、数据库或搜索引擎进行交互,并支持多种大模型和向量数据库的集成,以及提供 WebUI 和 API 服务

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值