07 · 聚类与降维
一、无监督学习与距离
聚类与降维属于无监督学习:数据没有“标签”,目标是发现结构(亚型/分层)、压缩信息(降维/可视化)、或为后续建模提供特征。医学中常用于人群分层、疾病亚型发现、多指标综合与高维数据预处理。
1.1 聚类要解决什么
目标
把样本分成若干组,使组内相似、组间差异大。
难点
“相似”依赖距离度量与变量尺度;不同算法的“簇形状”假设不同。
关键提醒:聚类结果不是“真相”,而是一种数据驱动的分组方案;必须结合临床解释与稳定性验证。
1.2 距离与标准化
聚类通常基于距离(欧氏、曼哈顿等)。若变量量纲不同(如年龄 vs 生化指标),不标准化会导致大尺度变量主导距离。
# iris 的 4 个连续变量:建议标准化后再聚类/PCA
data(iris)
X <- iris[, 1:4]
Xz <- scale(X) # Z-score 标准化
# 距离矩阵(欧氏距离)
D <- dist(Xz)
二、K-means 聚类
K-means 假定簇大致呈“球形/凸形”,通过迭代最小化簇内平方和(Within-Cluster Sum of Squares, WSS)。需要预先指定簇数 \(k\)。
2.1 算法与输出
# K-means:示例用 iris(只用数值列)
set.seed(123)
km <- kmeans(Xz, centers = 3, nstart = 25)
km$cluster # 每个样本所属类
km$centers # 各类中心(在标准化空间)
table(km$cluster)
nstart:多次随机初始化取最优,能显著降低陷入局部最优的概率。
2.2 如何选 k
肘部法(Elbow)
画 WSS 随 k 变化曲线,寻找“收益递减”的拐点。
轮廓系数(Silhouette)
衡量“类内紧密 vs 类间分离”,越大越好(需额外包)。
# 肘部法:计算不同 k 的 WSS
wss <- sapply(1:8, function(k) kmeans(Xz, centers = k, nstart = 10)$tot.withinss)
plot(1:8, wss, type = "b", xlab = "k", ylab = "WSS")
三、层次聚类
层次聚类不必预先指定 k:从每个样本各自成簇开始,逐步合并最相近的簇,形成树状图(dendrogram)。最后在某个高度切割得到簇。
3.1 dist + hclust
# 层次聚类(Ward 方法常用于连续变量)
hc <- hclust(D, method = "ward.D2")
plot(hc, labels = FALSE, main = "Iris 层次聚类树状图")
3.2 树状图与切割
# 切割为 3 类
cl3 <- cutree(hc, k = 3)
table(cl3)
# 与真实 Species 对照(仅用于理解,不应把聚类当分类)
table(真实 = iris$Species, 聚类 = cl3)
选择方法:不同 linkage(complete/average/Ward)对应不同“簇形状”偏好,建议做稳定性比较。
四、PCA 主成分分析
PCA(主成分分析)是一种线性降维方法:用少数几个相互正交的主成分,尽可能保留原始变量的方差信息。常用于可视化、去相关、压缩冗余。
4.1 主成分与方差解释
# PCA:建议对连续变量 scale
pca <- prcomp(X, scale. = TRUE)
summary(pca) # 每个主成分解释的方差比例
# 碎石图(Scree plot)
plot(pca, type = "l")
4.2 得分与载荷的解读
- 得分(scores):每个样本在主成分坐标系中的位置,可用于二维散点图。
- 载荷(loadings/rotation):主成分是原变量的线性组合,载荷表示每个变量对主成分的贡献方向与大小。
# 前两主成分得分(可画散点图)
head(pca$x[, 1:2])
# 载荷(变量贡献)
pca$rotation[, 1:2]
# 双标图:样本 + 变量方向(适合教学展示)
biplot(pca, cex = 0.7)
医学解读:若 PC1 主要由“多个强相关指标”共同贡献,可把 PC1 视为某种“综合表型/严重程度轴”,但必须结合变量含义解释。
五、小结与练习
本节要求:理解聚类与降维的目的;能在标准化后使用 kmeans、hclust + cutree 完成聚类;能使用 prcomp 做 PCA 并解读方差比例、得分与载荷。
练习建议(R 内置数据集):
- 用
iris:分别做 K-means(k=2~5)并用肘部法选择 k;与层次聚类结果对比。 - 用
USArrests:先标准化,再做 PCA,解释 PC1/PC2 可能代表的“综合维度”。 - 写一段“聚类解释”:每一类的中心/均值特征是什么?是否有可解释的临床含义?