### 聚类分析与R语言实现
聚类分析是一种无监督学习方法,旨在将数据对象分组为若干“簇”(Cluster),使簇内对象相似度高、簇间相似度低。R语言凭借丰富的统计工具和扩展包,成为聚类分析的热门工具之一。本文将介绍R中常用的聚类方法、实现步骤及实践案例。
#### 一、R中常用的聚类方法
##### 1. 层次聚类(Hierarchical Clustering)
层次聚类通过“合并”或“分裂”逐步构建簇结构,分为**凝聚式**(从单个样本开始合并)和**分裂式**(从全体样本开始分裂)。R中`stats`包的`hclust()`函数是凝聚式层次聚类的核心工具,支持单链、完全链、平均链等多种距离合并规则。
示例代码(以鸢尾花数据集为例,暂移除类别标签):
“`r
# 加载数据并预处理(移除类别列,标准化数据)
data(iris)
iris_data <- scale(iris[, -5]) # 标准化前4列特征(去除第5列类别)
# 计算样本间欧氏距离矩阵
dist_mat <- dist(iris_data, method = "euclidean")
# 层次聚类(完全链合并规则)
hc <- hclust(dist_mat, method = "complete")
# 可视化聚类树(树状图)
plot(hc, main = "层次聚类树状图(鸢尾花数据)",
xlab = "样本索引", ylab = "距离")
# 切割树状图得到3个簇(与鸢尾花真实类别数一致)
clusters_hc <- cutree(hc, k = 3)
```
##### 2. K均值聚类(K-Means Clustering)
K均值通过迭代优化簇中心(质心)和样本分配,要求预先指定簇数`k`。R中`stats`包的`kmeans()`函数是经典实现,默认使用Lloyd算法,`nstart`参数可增加初始质心的尝试次数以避免局部最优。
示例代码(基于鸢尾花数据):
```r
set.seed(123) # 固定随机种子确保结果可复现
# K均值聚类(k=3,nstart=20增加初始质心尝试)
km <- kmeans(iris_data, centers = 3, nstart = 20)
# 查看聚类结果:样本簇标签、簇中心
km$cluster # 每个样本的簇标签
km$centers # 3个簇的质心(标准化后)
```
##### 3. 密度聚类(DBSCAN)
当数据存在噪声或非球形簇时,K均值和层次聚类效果有限。`cluster`包的`dbscan()`函数实现了**基于密度的空间聚类**(DBSCAN),通过“核心点”“边界点”“噪声点”识别簇,无需预先指定簇数。
示例代码(需先安装`cluster`包):
```r
install.packages("cluster")
library(cluster)
# DBSCAN聚类(eps=0.5为邻域半径,minPts=5为核心点最小样本数)
db <- dbscan(iris_data, eps = 0.5, minPts = 5)
db$cluster # 簇标签(0表示噪声点)
```
#### 二、聚类结果评估
聚类是无监督任务,需通过**内部指标**评估效果,常见指标包括:
- **轮廓系数(Silhouette Coefficient)**:值越接近1表示簇内相似度高、簇间区分度好;接近-1则表示样本分配不合理。
- **簇内/间距离**:簇内距离越小、簇间距离越大,聚类质量越高。
示例(评估K均值聚类结果):
```r
# 计算轮廓系数(需距离矩阵)
library(cluster)
sil_km <- silhouette(km$cluster, dist(iris_data))
# 可视化轮廓图
plot(sil_km, main = "K均值聚类轮廓图(k=3)")
```
#### 三、实践案例:鸢尾花数据聚类分析
1. **数据准备**:加载鸢尾花数据,移除类别列并标准化特征(`scale()`)。
2. **K均值聚类**:尝试`k=3`(与真实类别数一致),观察簇与真实类别的匹配度。
3. **层次聚类**:通过树状图和轮廓系数验证簇合理性。
4. **可视化对比**:用`factoextra`包的`fviz_cluster()`可视化簇分布(需先安装`factoextra`)。
```r
# 安装并加载factoextra
install.packages("factoextra")
library(factoextra)
# K均值聚类可视化(基于前2个主成分降维)
fviz_cluster(km, data = iris_data,
main = "K均值聚类结果(k=3)",
geom = "point", ellipse.type = "convex")
# 层次聚类可视化(切割树状图得到3簇)
clusters_hc <- cutree(hc, k = 3)
fviz_cluster(list(data = iris_data, cluster = clusters_hc),
main = "层次聚类结果(k=3)")
```
#### 四、扩展工具与包
- **`cluster`包**:提供`pam()`(K-medoids,对离群点更鲁棒)、`agnes()`(层次聚类增强版)、`diana()`(分裂式层次聚类)等函数。
- **`fpc`包**:支持密度聚类(如DBSCAN)、聚类有效性评估等。
- **`NbClust`包**:自动选择最优簇数(通过多种指标评估`k`的合理性)。
### 总结
R语言为聚类分析提供了从基础到进阶的完整工具链:`hclust()`和`kmeans()`满足传统聚类需求,`cluster`和`fpc`包扩展了复杂场景的方法,`factoextra`等包则简化了可视化流程。在实践中,需结合数据特点(如分布、噪声、维度)选择方法,并通过轮廓系数、簇内/间距离等指标验证聚类质量。
(注:文中代码可直接在R环境中运行,需确保安装相关包(如`cluster`、`factoextra`)。)
本文由AI大模型(Doubao-Seed-1.6)结合行业知识与创新视角深度思考后创作。