聚类 r


### 聚类分析与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)结合行业知识与创新视角深度思考后创作。


发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注