当前位置: 首页 > news >正文

【R语言】聚类分析

聚类分析是一种常用的无监督学习方法,是将所观测的事物或者指标进行分类的一种统计分析方法,其目的是通过辨认在某些特征上相似的事物,并将它们分成各种类别。R语言提供了多种聚类分析的方法和包。

方法优点缺点适用场景
K-means计算效率高需预设K值球形数据分布
层次聚类可视化直观计算复杂度O(n²)小数据集/层级关系分析
DBSCAN发现任意形状参数敏感噪声数据/密度差异大
PAM对异常值鲁棒计算成本高中小规模数据

一、层次聚类

它是通过计算样本之间的距离来构建一个层次化的聚类结构,结果通常用树状图(dendrogram)来表示。

实现层次聚类的常用函数是R语言内置函数hclust(),还可以用cluter扩展包agens()函数flashClust扩展包hclust()函数

1、hclust()函数

下面用flexclust扩展包中的milk数据集进行讲解,此数据集包含了25种哺乳动物乳汁的成分数据:水分(water)、蛋白质(protein)、乳糖(lactose)、脂肪(fat)和灰分(ash)。

1.1 准备数据

library(flexclust)
# 第1步 准备数据:查看数据
data(milk)
milk

 

1.2 标准化数据 

# 第2步 标准化数据
milk_data <- scale(milk, center=T, scale=T)
milk_data

1.3 计算距离

# 第3步 计算欧几里得距离;也可以选用其它方法
milk_dist <- dist(milk_data, method="euclidean")
milk_dist

1.4 层次聚类

 使用平均距离法进行层次聚类

# 使用平均距离法进行层次聚类
fit_average <- hclust(milk_dist, method="averge")
fit_average

使用离差平和法进行层次聚类

# 使用平均距离法进行层次聚类
fit_average <- hclust(milk_dist, method="ward.D2")
fit_average

1.5 可视化结果

plot(fit_average, hang=-1, cex=1.2,main="平均距离层次聚类")

plot(fit_average, hang = -1, main = "层次聚类树状图", xlab = "样本", sub = "")
# 用矩形标出3个聚类
rect.hclust(fit_average, k = 3, border = 2:4)  

 1.6 切割聚类并评估

使用flexclust扩展包中的cuttree()函数将聚类结果分为3类(为什么分为3类,在此不细究,可上网查询方法)。

clusters <- cutree(fit_average, k=3)
# 可视化结果
plot(fit_average, hang=-1, cex=1, main="平均距离层次最终聚类")
rect.hclust(fit_average, k=3)

二、K-均值聚类 

1、kmeans()函数

层次聚类是一次性的,即样本点一旦被划分道一个类中,就不会再被分配到其它的类中,而且当样本量达到数百甚至数千时,层次聚类会很难处理。

R语言中最常用的K-均值聚类函数时kmeans()函数。

1.1 数据准备

用R语言内置的iris数据集为例。首先需要将类别信息去除。

head(iris)
iris_data <- iris[, 1:4]
head(iris_data)

1.2 标准化数据

# 标准化数据,消除量纲的影响
iris_scaled <- scale(iris_data, center=T, scale=TRUE)
head(iris_scaled)

 1.3 选择最佳K值

使用肘部法选择最佳的K值:通过计算不同聚类数k对应的总组内平方和(Total Within-Cluster Sum of Squares, WSS),找到WSS下降速度显著变缓的“肘部”点,该点对应的k即为最佳聚类数。

wss <- numeric(10)
for (k in 1:10) {
  kmeans_model <- kmeans(iris_scaled, centers = k, nstart = 25)
  wss[k] <- kmeans_model$tot.withinss
}
plot(1:10, wss, type = "b", pch = 19, 
     main = "肘部法选择最佳k值", 
     xlab = "聚类数k", ylab = "总组内平方和(WSS)")

从下面的截图可知,当k=3时,下降速度明显变缓。 

 1.4 K-均值聚类

centers:聚类数k。

nstart:随机初始中心点的次数(建议设为25以减少局部最优影响)。

iter.max:最大迭代次数(默认10)。

set.seed(123)
# 进行K-均值聚类
fit_means <- kmeans(iris_scaled, centers=3, iter.max=100, nstart=25)

1.5 可视化结果

library(factoextra)
fviz_cluster(fit_means, data = iris_scaled, 
             palette = "jco",  # 配色方案
             geom = "point",   # 仅显示点
             ellipse.type = "norm",  # 添加正态分布椭圆
             ggtheme = theme_minimal())

 

http://www.dtcms.com/a/23780.html

相关文章:

  • 共享经济视角下的2+1链动模式开源AI智能名片S2B2C商城小程序应用探究
  • 基于SpringBoot的“高校创新创业课程体系”的设计与实现(源码+数据库+文档+PPT)
  • 第三章:组件开发实战 - 第四节 - Tailwind CSS 深色模式适配
  • 如何才能写出好的prompt?
  • 机器学习_15 支持向量机知识点总结
  • 【自学笔记】版本控制与持续集成基础知识点总览-持续更新
  • 【网络编程】之NAT技术与代理
  • Linux CentOS 7部署Vulhub靶场
  • 在 Vue 3 中使用 Lottie 动画:实现一个加载动画
  • 小数第N位【快速幂(快速指数)算法】--数论
  • fastadmin自定义弹窗
  • DeepSeek有哪些创新点
  • 游戏数据表管理系统的架构设计与优化实践
  • Python 面试题
  • QT入门看这一篇就够了——超详细讲解(40000多字详细讲解,涵盖qt大量知识)
  • 力扣144. 二叉树的前序遍历145. 二叉树的后序遍历94. 二叉树的中序遍历(非递归版)
  • Redis的基础使用
  • (8/100)每日小游戏平台系列
  • vscode插件开发
  • 50道题快速复习MySQL之准备篇
  • Unity截取RenderTexture某帧画面显示在Image上
  • 装多系统踩的坑
  • Unity中可靠的UDP实现
  • 三层渗透测试-DMZ区域 二三层设备区域
  • Redis 过期键(expires)机制详解
  • 【个人开发】deepspeed+Llama-factory 本地数据多卡Lora微调【完整教程】
  • 2025三掌柜赠书活动第五期:Elasticsearch实战(第2版)
  • 250217-数据结构
  • Jetson Agx Orin平台JP6.0-r36.3版本修复了vi模式下的原始图像损坏(线条伪影)
  • DeepSeek等大模型功能集成到WPS中的详细步骤