📑 查看全课大纲(第 6 / 20 节)

聚类分析代码实战与谱系图绘制

约 28 分钟

📺 正在播放小象官方高清录播(支持倍速与清晰度调节)

小象实战讲义 · 多元统计分析

聚类分析是探索数据内在结构、发现自然分组的核心无监督方法。本节通过Python实战,带你掌握系统聚类(层次聚类)与K-Means聚类的实现流程,学会解读谱系图、确定最佳聚类数并评估效果,能独立完成从预处理到结果解释的全流程分析。

💡 核心导读

  • 系统聚类原理:从距离矩阵出发,通过自下而上合并构建谱系图,掌握Ward法等常用合并准则。
  • 谱系图解读:学会通过剪枝确定聚类数,可视化聚类合并过程。
  • K-Means实战:掌握算法迭代逻辑与参数设置,学会用肘部法则、轮廓系数选最优k。
  • 效果评估:用轮廓系数、簇内平方和等指标量化聚类质量。

一、聚类基础与距离度量

聚类分析是无监督学习方法,旨在根据样本特征的相似性将数据划分为不同组别,无需依赖已知标签。对于Q型聚类(对样品分类),距离是最常用的相似性度量指标。

设样本矩阵为 XRn×pX \in \mathbb{R}^{n \times p},其中 nn 为样品数,pp 为变量数,每行对应一个样品 XiX_i(p维行向量)。常用距离包括:

  • 欧氏距离:最常用的距离度量,对应明考夫斯基距离q=2q=2的情形: dij=k=1p(xikxjk)2d_{ij} = \sqrt{\sum_{k=1}^{p} (x_{ik} - x_{jk})^2}
  • 曼哈顿距离:又称绝对距离,对应q=1q=1的情形: dij=k=1pxikxjkd_{ij} = \sum_{k=1}^{p} |x_{ik} - x_{jk}|
  • 马氏距离:考虑变量的协方差结构,不受量纲和变量相关性影响,公式为: dM2(Xi,Xj)=(XiXj)Σ1(XiXj)d_M^2(X_i, X_j) = (X_i - X_j) \Sigma^{-1} (X_i - X_j)^\top 其中 ΣRp×p\Sigma \in \mathbb{R}^{p \times p} 为总体协方差矩阵,实践中常用样本协方差矩阵代替。

当变量量纲差异较大时,需先对数据进行Z-score标准化处理: zik=xikxˉkskz_{ik} = \frac{x_{ik} - \bar{x}_k}{s_k} 其中xˉk\bar{x}_k为第k个变量的均值,sks_k为标准差。

二、聚类算法Python实战

我们以经典鸢尾花数据集为例进行演示,该数据集包含150个样本、4个花部特征,对应3个鸢尾花品种,是聚类分析的标准测试数据集。以下代码完整实现了数据预处理、系统聚类谱系图绘制、K-Means聚类及效果评估:

import numpy as np
import matplotlib.pyplot as plt
from scipy.cluster.hierarchy import linkage, dendrogram, fcluster
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score

# 加载鸢尾花数据并做Z-score标准化(消除量纲影响)
iris = load_iris()
X_scaled = StandardScaler().fit_transform(iris.data)
y_true = iris.target  # 真实品种标签,仅用于结果对比

# ---------- 系统聚类(Ward法) ----------
# 构建层次聚类连接矩阵,Ward法最小化类内离差平方和增量
Z = linkage(X_scaled, method='ward', metric='euclidean')
# 绘制谱系图(截断显示最后30个合并节点,避免标签拥挤)
plt.figure(figsize=(10, 5))
dendrogram(Z, truncate_mode='lastp', p=30, show_leaf_counts=True)
plt.title('鸢尾花系统聚类谱系图(Ward法)', fontsize=12)
plt.xlabel('样本索引', fontsize=10)
plt.ylabel('合并距离', fontsize=10)
plt.axhline(y=10, color='r', linestyle='--', label='切割高度=10')
plt.legend()
plt.tight_layout()
plt.show()
# 按聚类数k=3切割谱系图,得到最终聚类结果
clusters_hc = fcluster(Z, t=3, criterion='maxclust')

# ---------- K-Means聚类 ----------
# 初始化K-Means模型,k-means++智能初始化提升稳定性
kmeans = KMeans(n_clusters=3, init='k-means++', n_init=10, random_state=42)
clusters_km = kmeans.fit_predict(X_scaled)
# 计算聚类效果评估指标
inertia = kmeans.inertia_  # 簇内平方和(Inertia),越小越好
sil_score = silhouette_score(X_scaled, clusters_km)  # 轮廓系数范围[-1,1],越接近1越好

# 输出核心结果
print(f"K-Means簇内平方和: {inertia:.2f}")
print(f"K-Means轮廓系数: {sil_score:.4f}")
print(f"系统聚类前10个样本类别: {clusters_hc[:10]}")
print(f"K-Means前10个样本类别: {clusters_km[:10] + 1}")  # 转为1-based编号与系统聚类对齐

运行代码后,可从谱系图中直观观察聚类合并过程,在红色虚线处切割即可得到3个簇;K-Means的轮廓系数约为0.46,说明聚类效果较好。

三、最佳聚类数确定

实际应用中通常未知真实聚类数,可通过以下两种常用方法确定最优k:

  1. 肘部法则:绘制簇内平方和随k增大的变化曲线,曲线拐点对应的k即为最优聚类数。
  2. 轮廓系数法:计算不同k下的轮廓系数,选择使轮廓系数最大的k值。

📝 动手练一练

  1. 对鸢尾花数据分别使用最短距离法、最长距离法进行系统聚类,对比不同合并准则下的谱系图差异。
  2. 尝试用肘部法则对鸢尾花数据确定最佳聚类数,验证结果是否与真实品种数一致。

本章小结

本节核心要点回顾:

  1. 聚类是无监督分析方法,需先根据数据特性做标准化处理,选择合适的距离度量。
  2. 系统聚类通过scipy.cluster.hierarchy实现,可通过谱系图剪枝确定聚类数,Ward法通常能得到均衡稳定的结果。
  3. K-Means是划分式聚类算法,需预先指定k值,可通过肘部法则、轮廓系数确定最优参数,sklearn.cluster.KMeans是主流实现。
  4. 聚类效果可通过轮廓系数、簇内平方和等指标量化评估,有真实标签时可进一步做对比验证。

— 小象教研组

配套学习资源与课件
  • 第3章课件:聚类分析
    下载
  • 多元统计分析参考讲义与常用函数(多元分析与主成分常用函数速查)
    下载
  • 课程配套数据集(全课程实战数据包)
    下载
  • 课程全套源代码(课程相关代码汇总)
    下载
🎁 免费学习资源

领取《小象 11GB VIP 课件资料包与大厂真题手册》

包含全套实战 Jupyter 源码、清洗后数据集、大厂高频面试真题与专属学员答疑交流群。

  • 完整 Python / 数据分析 Jupyter 实战源码
  • 大厂真实业务数据集与练习题
  • 微信扫码添加顾问免费领取;想学什么,直接告诉顾问
微信二维码:扫码添加课程顾问微信扫码添加顾问