R -- 层次聚类和划分聚类

news2024/11/20 8:30:15

brief

聚类分析是一种数据归约技术,旨在揭漏一个数据集中观测值的子类。子类内部之间相似度最高,子类之间差异性最大。至于这个相似度是一个个性化的定义了,所以有很多聚类方法。
最常用的聚类方法包括层次聚类和划分聚类。

  • 层次聚类,每一个观测自成一个类,然后这些类两两合并,直到所有的类都被合并为止。计算相似度的方法有单联动,全联动,平均联动,质心和ward法。
  • 划分聚类,首先指定子类个数K,然后观测被随机分配成K类,再重新聚合成为类。计算相似度的方法包括K-means和围绕中心点的划分PAM

每个聚类方法都有优缺点,甚至聚类的时候出现不存在的类,这些方法最好是对照使用。

基本步骤

有效的聚类分析是一个多步骤的过程,每一步的决策都会影响下一步的分析。所以多探索多尝试最重要。
基本步骤:

  • 选择合适的变量。这些变量对数据的理解和识别区分应该起主要作用,否则再高级的聚类方法也无法弥补聚类变量选不好的问题。
  • 缩放数据。如果数据的波动范围很大,那么该变量对结果的影响也是最大的(这不就是合适的变量嘛)。但用这样的原始数据并不可取,最好用标准化的数据代替。
    下面是三种缩放方法:
df1 <- apply(mydata, 2, function(x){(x-mean(x))/sd(x)})
df2 <- apply(mydata, 2, function(x){x/max(x)})
df3 <- apply(mydata, 2, function(x){(x ̢ mean(x))/mad(x)})
  • 寻找异常点。很多聚类方法对异常值很敏感,他能扭曲我们的聚类方案。可以通过outliers包中的函数检测离群点,mvoutlier包中有识别多元变量的离群点函数。
  • 计算距离。dist()计算距离和选择相应的算法
  • 选择聚类算法。小样本(<150个观测)或者嵌套聚类可以选择层次聚类。划分聚类可以处理大样本但是需要先确定子类个数K。
  • 尝试其他的聚类算法或者改变距离计算方法
  • 确定类的数目。可以使用NbCluster包中的NbCluster()函数,该函数提供了30个不同的指标帮助你进行选择。
  • 提取子类
  • 结果可视化
  • 解读子类。子类内部有何相似性?子类之间有何差异性?
  • 结果验证。有没有可能是数据集或者聚类方法导致了这种结果,事实上这种划分是没有意义的?

其中距离的计算部分:
在这里插入图片描述
其他计算距离的算法详见帮助文档

?dist

层次聚类

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

# install.packages("flexclust")

data(nutrient, package="flexclust")
row.names(nutrient) <- tolower(row.names(nutrient))
head(nutrient)
# 缩放数据
nutrient.scaled <- scale(nutrient,center = T,scale = T)
head(nutrient.scaled)
# 计算欧几里得距离
d <- dist(nutrient.scaled)
head(d)
typeof(d)
str(d)
# 将距离数据传入层次聚类函数
# 距离数据
fit.average <- hclust(d, method="average")
plot(fit.average, hang=-1, cex=.8, main="Average Linkage Clustering")

在这里插入图片描述
在这里插入图片描述

  • 上述的层次聚类树可视化了聚类的过程,观测之间的相似性和异质性也可以清楚的看到。接下来我们还可以进行子类的确定,让观测分配到合适的类群。最后进行子类提取
library(NbClust)

# 需要输入需要聚类的数据框,距离计算公式,聚类方法
nc <- NbClust(nutrient.scaled, distance="euclidean",
              min.nc=2, max.nc=15, method="average")
table(nc$Best.n[1,]) # 看看多少个指标支持对应的子类个数

在这里插入图片描述
有1个指标支持1个子类
有4个指标支持2个子类
有4个指标支持3个子类
有4个指标支持5个子类
Nbcluster推荐聚成2类

# 那就把K设置成 2或者3或者5试试看
clusters <- cutree(fit.average, k=2)  # cutree将层次聚类结果划分为5个部分
# 第一个子类包括了26个观测,第二个子类包括了一个观测
table(clusters)
# 利用聚合函数看看原来的数据框
aggregate(nutrient, by=list(cluster=clusters), median) # 主要是calcium的含量区别

# 可视化看看
plot(fit.average, hang=-1, cex=.8,
     main="Average Linkage Clustering\n2 Cluster Solution")
rect.hclust(fit.average, k=2)

在这里插入图片描述

划分聚类

kmeans

brief

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

实例

  • 第一步:确定子类个数K值
library(NbClust)

data(wine, package="rattle")
head(wine)
df <- scale(wine[-1])

set.seed(1234)
nc <- NbClust(df, min.nc=2, max.nc=15, method="kmeans")
table(nc$Best.n[1,]) # 3个子类最好
# 或者使用碎石图的方法找拐点,如下代可以实现
wssplot <- function(data, nc=15, seed=1234){
	wss <- (nrow(data)-1)*sum(apply(data,2,var))
	for (i in 2:nc){
		set.seed(seed)
		wss[i] <- sum(kmeans(data, centers=i)$withinss)}
		plot(1:nc, wss, type="b", xlab="Number of Clusters",
		ylab="Within groups sum of squares")
}
wssplot(df)
  • 第二步:聚类
set.seed(1234)
fit.km <- kmeans(df, 3, nstart=25)

str(fit.km)

在这里插入图片描述
size : 每个子类包含的观测数目
iter : 迭代次数
withinss : 子类内部 距离之和
centers: 子类的中心点,都少个变量就会有对应的多少个数值,组成了一个高维的点。可能不好理解,看看看下面的代码。

fit.km$centers
aggregate(wine[-1], by=list(cluster=fit.km$cluster), mean)

在这里插入图片描述
第一个子类的中心点是在这里插入图片描述

  • 结果怎么样?
    wine$ type是真实的分类,fit.km$ cluster是kmeans的聚类
    可以看到大约6个观测被错误的分配了,三个观测属于第二个子类,却被分到了第一个子类,还有三个观测属于第二个子类,却被分到了第三个子类。
    在这里插入图片描述

PAM

brief

在这里插入图片描述
在这里插入图片描述

实例

library(cluster)
set.seed(1234)
fit.pam <- pam(wine[-1], k=3, stand=TRUE)
fit.pam$medoids

clusplot(fit.pam, main="Bivariate Cluster Plot")

在这里插入图片描述

  • 结果怎么样
table(wine$Type,fit.pam$clustering)

在这里插入图片描述
在这个数据集上PAM表现不如Kmeans。所以数据集和算法相互影响的,每种聚类方法都有优缺点,多对照使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/428426.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

vscode连接linux

vscode连接linux第一步:下载扩展第二步:打开左侧的那个类似小电脑的选项第三步:点击那个螺丝按钮第四步:选第一个第五步:配置config文件第六步:打开设置第七步:在搜索栏搜索:Always reveal the SSH login terminal第八步:重启vscode第八步:输入密码后,点击右上角号旁边的"…

什么是存算分离架构?

随着硬件技术的快速进步&#xff0c;尤其是网络和存储设备的性能迅速提升&#xff0c;以及云计算厂商推动软硬件协同加速的云存储服务&#xff0c;越来越多的企业开始基于云存储来构建数据存储服务&#xff0c;或数据湖&#xff0c;因此就需要单独再建设一个独立的计算层来提供…

C++ LinuxWebServer 2万7千字的面经长文(上)

⭐️我叫忆_恒心&#xff0c;一名喜欢书写博客的在读研究生&#x1f468;‍&#x1f393;。 如果觉得本文能帮到您&#xff0c;麻烦点个赞&#x1f44d;呗&#xff01; 前言 Linux Web Server项目虽然是现在C求职者的人手一个的项目&#xff0c;但是想要吃透这个项目&#xff…

不得不说的创建型模式-工厂方法模式

工厂方法模式是创建型模式之一&#xff0c;它定义了一个用于创建对象的接口&#xff0c;但将具体创建的过程延迟到子类中进行。换句话说&#xff0c;它提供了一种通过调用工厂方法来实例化对象的方法&#xff0c;而不是通过直接使用 new 关键字来实例化对象。 下面是一个使用 C…

[架构之路-167]-《软考-系统分析师》-4-据通信与计算机网络-3- 常见局域网与广域网

目录 4 . 3 局域网与广域网 4.3.1 局域网基础知识 1 . 星型结构 2 . 总线结构 3 . 环型结构 4 . 网状结构 4.3.2 以太网技术&#xff08;接入网&#xff09; 1 . 以太网基础 2 . 帧结构 3 . 以太网物理层规范 4.3.3 无线局域网&#xff08;接入网&#xff09; 1 . …

huggingface TRL是如何实现20B-LLM+Lora+RLHF

huggingface TRL实现20B-LLMLoraRLHFIntroductionWhat is TRL?Training at scale8-bit matrix multiplicationLoraWhat is PEFT?Fine-tuning 20B parameter models with Low Rank Adapter参考Introduction 作者首先表示RLHF在目前LLM的训练中是一种很powerful的方式&#xf…

SpringBoot 整合Quartz定时任务管理【SpringBoot系列18】

SpringCloud 大型系列课程正在制作中&#xff0c;欢迎大家关注与提意见。 程序员每天的CV 与 板砖&#xff0c;也要知其所以然&#xff0c;本系列课程可以帮助初学者学习 SpringBooot 项目开发 与 SpringCloud 微服务系列项目开发 Quartz是由Java语言编写&#xff0c;是OpenSym…

【环境搭建:onnx模型部署】onnxruntime-gpu安装与测试(python)

ONNX模型部署环境创建1. onnxruntime 安装2. onnxruntime-gpu 安装2.1 方法一&#xff1a;onnxruntime-gpu依赖于本地主机上cuda和cudnn2.2 方法二&#xff1a;onnxruntime-gpu不依赖于本地主机上cuda和cudnn2.2.1 举例&#xff1a;创建onnxruntime-gpu1.14.1的conda环境2.2.2 …

Spring整合MyBatis与JUnit

Spring整合 想必到现在我们已经对Spring有一个简单的认识了&#xff0c;Spring有一个容器&#xff0c;叫做IoC容器&#xff0c;里面保存bean。在进行企业级开发的时候&#xff0c;其实除了将自己写的类Spring管理之外&#xff0c;还有一部分重要的工作就是使用第三方的技术。前…

Spring —— Spring Boot 创建和使用

JavaEE传送门JavaEE Spring —— Spring简单的读取和存储对象 Ⅱ Spring —— Bean 作用域和生命周期 目录Spring Boot 创建和使用Spring BootSpring Boot 项目创建使用 IDEA 创建网页版创建Spring Boot 目录介绍运行 Spring Boothello world约定大于配置Spring Boot 创建和使…

关于SeaDAS的安装教程以及使用问题笔记

2022年硕士研究生最后半个学期&#xff0c;已经交完了毕业论文&#xff0c;因为觉得工作以后会用到SeaDAS就拿出了一些时间学习&#xff0c;现在已经工作快一年了&#xff0c;而工作中也并没有用到这个软件&#xff0c;估计以后也不会用到了吧。现在把当时学习整理的一些笔记分…

字符串匹配算法(BFKMP)

个人主页&#xff1a;平行线也会相交 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 平行线也会相交 原创 收录于专栏【数据结构初阶&#xff08;C实现&#xff09;】 目录字符串匹配算法BF算法代码实现KMP算法代码实现nextval数组改进字符串匹配算法 在学…

MySQL 库操作

目录 创建数据库 语法 案例 字符集和校验规则&#xff08;建数据库/建表用&#xff09; 查看系统默认字符集以及校验规则 db.opt 更改 查看数据库支持的字符集 查看数据库支持的字符集校验规则 校验规则对数据库的影响 排升序 操纵数据库 查看数据库 显示创建语…

[计算机图形学]几何:隐式显式表示(前瞻预习/复习回顾)

一、前言 本篇我们将开启GAMES101几何部分的讲解的第一讲解&#xff0c;也是几何的基本表示&#xff0c;现实中有非常多的几何&#xff0c;如布料&#xff0c;绝对光滑的曲面&#xff0c;水滴&#xff0c;毛发&#xff0c;微观的细胞等等非常复杂的几何&#xff0c;那么如何在…

十分钟在 macOS 快速搭建 Linux C/C++ 开发环境

有一个使用了 Epoll 的 C 项目&#xff0c;笔者平时用的 Linux 主力开发机不在身边&#xff0c;想在 macOS 上开发调试&#xff0c;但是没有 Linux 虚拟机。恰好&#xff0c;JetBrains CLion 的 Toolchains 配置除了使用本地环境&#xff0c;还支持 SSH、Docker。 笔者使用 CL…

Zabbix的介绍与部署

目录 zabbix zabbix简介 zabbix主要功能 zabbix主要特点 zabbix运行机制 zabbix架构 1.sever-client架构 2.sever-proxy-client架构 3.master-node-client架构 如何进行数据采集 zabbix工作原理 zabbix监控模式 安装zabbix5.0 部署zabbix服务端 web页面测试 部…

系统集成项目管理工程师 笔记(第二章:信息系统集成及服务管理)

文章目录2.3.1 ITIL与IT服务管理&#xff08;ITSM&#xff09; 117ITSM三个根本目标2.3.2 ITSS与信息技术服务 121ITSS的4个组成要素和5个生命周期2.3.3 信息系统审计 127信息系统审计是建立在以下 4 个理论基础之上的信息系统审计流程示意图审计步骤第2章 信息系统集成及服务管…

怎么设置动态壁纸?这样做就行!

案例&#xff1a;怎么设置动态壁纸 【朋友们&#xff0c;我的壁纸一直都是静态的&#xff0c;最近感觉有点审美疲劳了&#xff0c;想换些好看的动态壁纸&#xff0c;有朋友知道应该如何设置动态壁纸吗&#xff1f;】 经常使用电脑的朋友可能会觉得一直用同一张壁纸会感觉审美…

通过两阶段知识学习多种不利天气排除

论文&#xff1a;Learning Multiple Adverse Weather Removal via Two-stage Knowledge Learning and Multi-contrastive Regularization: Toward a Unified Model【通过两阶段知识学习多种不利天气排除】 论文下载地址&#xff1a;https://openaccess.thecvf.com/content/CVP…

过去的90天,ODC 发生了哪些新的改变?

欢迎访问 OceanBase 官网获取更多信息&#xff1a;https://www.oceanbase.com/ 关于作者 胡智娟 OceanBase 产品经理 主要负责 OceanBase 生态工具数据研发、迁移评估方向的产品工作&#xff0c;在蚂蚁集团有多年数据库管理实战经验&#xff0c;对日常研发及运维痛点有较深感悟…