📑 查看全课大纲(第 6 / 20 节)
- 1.多元统计分析概述与多元正态分布
- 2.多元数据矩阵与向量化运算
- 3.统计数据探索与高维数据清洗
- 4.样品与变量相似性度量(距离与相似系数)
- 5.系统聚类与K均值聚类算法原理
- 6.聚类分析代码实战与谱系图绘制
- 7.距离判别法理论推导与应用
- 8.贝叶斯判别与Fisher线性判别
- 9.判别分析代码实战与误判率评估
- 10.主成分分析推导、几何意义与统计性质
- 11.主成分回归与共线性消除
- 12.主成分分析代码实战与降维可视化
- 13.因子分析正交模型与因子载荷求解
- 14.因子正交旋转(方差最大化)与因子得分计算
- 15.因子分析代码实战与行业综合评价
- 16.列联表分析与卡方独立性检验
- 17.对应分析理论推导与过渡图原理
- 18.对应分析代码实战与双标图解读
- 19.典型相关变量数学推导与显著性检验
- 20.典型相关系数阵计算与代码实战
聚类分析代码实战与谱系图绘制
约 28 分钟
📺 正在播放小象官方高清录播(支持倍速与清晰度调节)
小象实战讲义 · 多元统计分析
聚类分析是探索数据内在结构、发现自然分组的核心无监督方法。本节通过Python实战,带你掌握系统聚类(层次聚类)与K-Means聚类的实现流程,学会解读谱系图、确定最佳聚类数并评估效果,能独立完成从预处理到结果解释的全流程分析。
💡 核心导读
- 系统聚类原理:从距离矩阵出发,通过自下而上合并构建谱系图,掌握Ward法等常用合并准则。
- 谱系图解读:学会通过剪枝确定聚类数,可视化聚类合并过程。
- K-Means实战:掌握算法迭代逻辑与参数设置,学会用肘部法则、轮廓系数选最优k。
- 效果评估:用轮廓系数、簇内平方和等指标量化聚类质量。
一、聚类基础与距离度量
聚类分析是无监督学习方法,旨在根据样本特征的相似性将数据划分为不同组别,无需依赖已知标签。对于Q型聚类(对样品分类),距离是最常用的相似性度量指标。
设样本矩阵为 ,其中 为样品数, 为变量数,每行对应一个样品 (p维行向量)。常用距离包括:
- 欧氏距离:最常用的距离度量,对应明考夫斯基距离的情形:
- 曼哈顿距离:又称绝对距离,对应的情形:
- 马氏距离:考虑变量的协方差结构,不受量纲和变量相关性影响,公式为: 其中 为总体协方差矩阵,实践中常用样本协方差矩阵代替。
当变量量纲差异较大时,需先对数据进行Z-score标准化处理: 其中为第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:
- 肘部法则:绘制簇内平方和随k增大的变化曲线,曲线拐点对应的k即为最优聚类数。
- 轮廓系数法:计算不同k下的轮廓系数,选择使轮廓系数最大的k值。
📝 动手练一练
- 对鸢尾花数据分别使用最短距离法、最长距离法进行系统聚类,对比不同合并准则下的谱系图差异。
- 尝试用肘部法则对鸢尾花数据确定最佳聚类数,验证结果是否与真实品种数一致。
本章小结
本节核心要点回顾:
- 聚类是无监督分析方法,需先根据数据特性做标准化处理,选择合适的距离度量。
- 系统聚类通过
scipy.cluster.hierarchy实现,可通过谱系图剪枝确定聚类数,Ward法通常能得到均衡稳定的结果。 - K-Means是划分式聚类算法,需预先指定k值,可通过肘部法则、轮廓系数确定最优参数,
sklearn.cluster.KMeans是主流实现。 - 聚类效果可通过轮廓系数、簇内平方和等指标量化评估,有真实标签时可进一步做对比验证。
— 小象教研组
🎁 免费学习资源
领取《小象 11GB VIP 课件资料包与大厂真题手册》
包含全套实战 Jupyter 源码、清洗后数据集、大厂高频面试真题与专属学员答疑交流群。
- ✔完整 Python / 数据分析 Jupyter 实战源码
- ✔大厂真实业务数据集与练习题
- ✔微信扫码添加顾问免费领取;想学什么,直接告诉顾问
微信扫码添加顾问