利用R语言进行聚类分析实战(数据+代码+可视化+详细分析)

news/2024/5/20 6:03:16 标签: r语言, 开发语言, 算法, 聚类

🍉CSDN小墨&晓末:https://blog.csdn.net/jd1813346972

   个人介绍: 研一|统计学|干货分享
         擅长Python、Matlab、R等主流编程软件
         累计十余项国家级比赛奖项,参与研究经费10w、40w级横向

文章目录

  • 1 研究目的
  • 2 数据背景
  • 3 案例演示
    • 3.1 读取数据
    • 3.2 按样本聚类
      • 3.2.1 最短距离法
      • 3.2.2 最长距离法
      • 3.2.3 中间距离法
      • 3.2.4 类平均法
      • 3.2.5 重心法
      • 3.2.6 离差平方和法
      • 3.2.7 K-means快速聚类
      • 3.2.8 样本聚类总结
    • 3.3 按变量聚类
      • 3.3.1 最短距离法
      • 3.3.2 最长距离法绘制树状聚类
      • 3.3.3 中间距离法
      • 3.3.4 类平均法
      • 3.3.5 重心法
      • 3.3.6 离差平方和法
      • 3.3.7 K-means快速聚类
      • 3.3.8 变量聚类总结

1 研究目的

  对来源于Frank and Asuncion (2010)胎心宫缩监护(cardiotocography, CTG) 数据(CTG.xls)分别使用最短距离法、最长距离法、类平均法、重心法、离差平方和法(Ward.D、Ward.D2)、K-means法进行按样本聚类和按变量聚类

2 数据背景

  胎心宫缩监护(cardiotocography, CTG) 数据(CTG.xls)。这组数据来源于Frank and Asuncion (2010)。该数据有2129 个观测值及23个变量,包含了致命心律(fetal heart rate, FHR)的各种度量以及基于监护记录的由专家分类的宫缩(uterine contraction, UC) 特征.这些变量的情况列示于下表. 表中最后三个分类变量的水平为:Tendency(FHR 直方图的趋势)有三个水平 (-1 = 左不对称, 0=对称, 1= 右不对称);CLASS(FHR 分类代码) 用1~10 表示从平静睡眠到可疑10种活动状况;NSP(胎儿状态分类代码) 有三个水平(1= 正常, 2= 疑似, 3= 病态)。删去3 个有不少缺失值的观测值, 形成新的数据文件ctg.naomit.csv。舍弃第23 个变量NSP, 用前面22个变量进行聚类分析。

  根据数据文件显示:NSP共有三个水平(1= 正常, 2= 疑似, 3= 病态),故本文聚类过程中共分为三类。

3 案例演示

3.1 读取数据

  运行程序:

data<-read.csv("G:\\ctg.naomit.csv")                 #数据读取
data1<-data[c(1:2126),c(1:22)]                                       #选取数据

3.2 按样本聚类

3.2.1 最短距离法

  运行程序:

library(MASS)                            #加载包
data2=scale(data1)                       #标准化
D=dist(data2)                            #计算距离
plot(hclust(D,"single"))                 #最短距离法绘制树状聚类图
hc=hclust(D,"single")                    #计算新类与当前各类距离
head(data.frame(hc$merge,hc$height))     #显示前六行数据

  运行结果:

##     X1   X2 hc.height
## 1  -68  -69         0
## 2 -230 -788         0
## 3 -234 -235         0
## 4 -305 -307         0
## 5 -324 -325         0
## 6 -327 -334         0

  运行程序:

rect.hclust(hclust(D,"single"),3)        #加三分类框

  运行结果:

图1 最短距离法树状聚类

3.2.2 最长距离法

  运行程序:

hc=hclust(D,"complete")                  #计算新类与当前各类距离
head(data.frame(hc$merge,hc$height))     #显示前六行数据

  运行结果:

##     X1   X2 hc.height
## 1  -68  -69         0
## 2 -230 -788         0
## 3 -234 -235         0
## 4 -305 -307         0
## 5 -324 -325         0
## 6 -327 -334         0

  运行程序:

plot(hc)                                 #绘制树状聚类图
rect.hclust(hc,3)                        #加三分类框

  运行结果:

图2 最长距离法树状聚类

3.2.3 中间距离法

  运行程序:

hc=hclust(D,"median")                    #计算新类与当前各类距离
head(data.frame(hc$merge,hc$height))     #显示前六行数据

  运行结果:

##     X1   X2 hc.height
## 1  -68  -69         0
## 2 -230 -788         0
## 3 -234 -235         0
## 4 -305 -307         0
## 5 -324 -325         0
## 6 -327 -334         0

  运行程序:

plot(hc)                                 #绘制树状聚类图
rect.hclust(hc,3)                        #加三分类框

  运行结果:

图3 中间距离法树状聚类

3.2.4 类平均法

  运行程序:

hc=hclust(D,"average")                   #计算新类与当前各类距离
head(data.frame(hc$merge,hc$height))     #显示前六行数据

  运行结果:

##     X1   X2 hc.height
## 1  -68  -69         0
## 2 -230 -788         0
## 3 -234 -235         0
## 4 -305 -307         0
## 5 -324 -325         0
## 6 -327 -334         0

  运行程序:

plot(hc)                                 #绘制树状聚类图
rect.hclust(hc,3)                        #加三分类框

  运行结果:

图4 类平均法树状聚类

3.2.5 重心法

  运行程序:

hc=hclust(D,"centroid")                  #计算新类与当前各类距离
head(data.frame(hc$merge,hc$height))     #显示前六行数据

  运行结果:

##     X1   X2 hc.height
## 1  -68  -69         0
## 2 -230 -788         0
## 3 -234 -235         0
## 4 -305 -307         0
## 5 -324 -325         0
## 6 -327 -334         0

  运行程序:

plot(hc)                                 #绘制树状聚类图
rect.hclust(hc,3)                        #加三分类框

  运行结果:

图5 重心法树状聚类

3.2.6 离差平方和法

1.ward.D法

  运行程序:

plot(hclust(D,"ward.D"))                 #绘制树状聚类图
rect.hclust(hclust(D,"ward.D"),3)        #加三分类框

  运行结果:

图6 Ward.D法树状聚类

2.ward.D2法

  运行程序:

plot(hclust(D,"ward.D2"))                #离差平方和
rect.hclust(hclust(D,"ward.D2"),3)       #加三分类框

  运行结果:

图7 Ward.D2法树状聚类

3.2.7 K-means快速聚类

  由于K-means聚类法不适用于分类属性变量的聚类,故选取前20个变量进行K-means聚类

  运行程序:

km=kmeans(data2[,1:20],3)    
plot(data2,pch=km$cluster,col=km$cluster)

  运行结果:

图8 Kmeans法树状聚类

3.2.8 样本聚类总结

  首先选取数据前22个变量的样本数据,为消除量纲的影响对数据进行标准化;再对样本分别进行最短距离、最长距离、中间距离、类平均、重心、离差平方和、Kmean法进行样本聚类,但由于样本量较大,导致数据显示结果较为混乱,从不同的系统聚类法中可以看出离差平方和法相较于其他系统聚类方法进行聚类结果分类更为明显。在K-mean快速聚类法中,由于K-mean聚类对分类属性的数据不适用,所以考虑去除变量Tendency、CLASS,然后进行K-mean快速聚类,将3类结果以不同颜色和形状呈现,具有较强观赏性。

3.3 按变量聚类

3.3.1 最短距离法

  运行程序:

d=data.frame(cor(data2))                   #计算各变量相似系数
D1=as.dist(d)                              #计算各变量距离     
hc1=hclust(D1,method = "single")           #最短距离法
plot(hc1)                          
rect.hclust(hc1,3)                         #加三分类框

  运行结果:

图9 最短距离法树状聚类

3.3.2 最长距离法绘制树状聚类

  运行程序:

hc1=hclust(D1,method = "complete")         #最长距离法
plot(hc1)                          
rect.hclust(hc1,3)                         #加三分类框

  运行结果:

图10 最长距离法树状聚类

3.3.3 中间距离法

  运行程序:

hc1=hclust(D1,method = "median")           #中间距离法
plot(hc1)                          
rect.hclust(hc1,3)                         #加三分类框

  运行结果:

图11 中间距离法树状聚类

3.3.4 类平均法

  运行程序:

hc1=hclust(D1,method = "average")          #类平均法
plot(hc1)                          
rect.hclust(hc1,3)                         #加三分类框

  运行结果:

图12 类平均法树状聚类

3.3.5 重心法

  运行程序:

hc1=hclust(D1,method = "centroid")          #重心法
plot(hc1)                          
rect.hclust(hc1,3)                          #加三分类框

  运行结果:

图13 重心法树状聚类

3.3.6 离差平方和法

1.ward.D法

  运行程序:

hc1=hclust(D1,method = "centroid")          #重心法
plot(hc1)                          
rect.hclust(hc1,3)                          #加三分类框

  运行结果:

图14 Ward.D法树状聚类

2.ward.D2法

  运行程序:

hc1=hclust(D1,method = "ward.D2")          #Ward.D2法
plot(hc1)                          
rect.hclust(hc1,3)                         #加三分类框

  运行结果:

图15 Ward.D2法树状聚类

3.3.7 K-means快速聚类

  运行程序:

pm<-kmeans(d,3)                #分三类
pm$clusterkm=kmeans(data2[,1:20],3)    
plot(data2,pch=km$cluster,col=km$cluster)

  运行结果:

##       LB       AC       FM       UC       DL       DS       DP     ASTV 
##        3        2        1        2        2        1        2        1 
##     MSTV     ALTV     MLTV    Width      Min      Max     Nmax   Nzeros 
##        2        1        1        2        3        2        2        2 
##     Mode     Mean   Median Variance Tendency    CLASS 
##        3        3        3        2        1        1

3.3.8 变量聚类总结

  首先计算22个变量的相似系数并求出其相似聚类,分别利用最短距离、最长距离、中间距离、类平均、重心、离差平方和、Kmean法进行变量聚类,不同方法聚类结果如表1所示,结合图9—图15能较为直观地看出变量聚类情况。

表1 对变量聚类汇总结果


http://www.niftyadmin.cn/n/5393536.html

相关文章

jax可微分编程的笔记(4)

jax可微分编程的笔记(4) 第四章 JAX的微分运算 我们从最小二乘法说起,构建出深度学习的轮廓,并最终基于 MINST手写数据集训练了一个简单的全连接的神经网络. 4.1 微分操作的语法 本节给出复杂积分的运算和隐函数求导这两个例子. 4.1.1 JAX中的梯度操作 from jax imprt gr…

影像仪满足0.02㎜~4㎜的筛网检测需求

影像仪具有高精度、高效、全面数据分析和可视化展示的测量优势。通过影像测量技术&#xff0c;可以有效解决筛网检测中的难题&#xff0c;提高工作效率和工作质量&#xff0c;为筛网的使用和管理提供科学依据&#xff0c;推动筛网行业的发展。 筛网检测的难点 1、超细筛网的…

pytorch简单新型模型测试参数

import torch from torch.nn import Conv2d,MaxPool2d,Sequential,Flatten,Linear import torchvision import torch.optim.optimizer from torch.utils.data import DataLoader,dataset from torch import nn import torch.optim.optimizer# 建模 model nn.Linear(2,1)#损失 …

LeetCode 热题 100 | 二叉树(一)

目录 1 基础知识 1.1 先序遍历 1.2 中序遍历 1.3 后序遍历 2 94. 二叉树的中序遍历 3 104. 二叉树的最大深度 4 226. 翻转二叉树 5 101. 对称二叉树 菜鸟做题&#xff0c;语言是 C 1 基础知识 二叉树常见的遍历方式有&#xff1a; 先序遍历中序遍历后序遍历…

C#中全局处理异常方式

https://www.cnblogs.com/YYkun/p/8952924.html using System; using System.Configuration; using System.Text; using System.Windows.Forms; using ZB.QueueSys.Common; namespace ZB.QueueSys { static class Program { /// <summary> /// 应用程序的主入口点。…

代码随想录算法训练营day58 || 392. 判断子序列115. 不同的子序列

动态规划&#xff0c;用相似思路解决复杂问题 | LeetCode&#xff1a;392.判断子序列_哔哩哔哩_bilibili 动态规划之子序列&#xff0c;为了编辑距离做铺垫 | LeetCode&#xff1a;115.不同的子序列_哔哩哔哩_bilibili 392. 判断子序列 思目&#xff0c;两个字符串中可以任意…

免费享受企业级安全:雷池社区版WAF,高效专业的Web安全的方案

网站安全成为了每个企业及个人不可忽视的重要议题。 随着网络攻击手段日益狡猾和复杂&#xff0c;选择一个强大的安全防护平台变得尤为关键。 推荐的雷池社区版——一个为网站提供全面安全防护解决方案的平台&#xff0c;它不仅具备高效的安全防护能力&#xff0c;还让网站安…

JSTL标签

JSTL标签 一、什么是JSTL标签&#xff1a; 随着J2EE瘦客户机技术JavaServer Pages(JSP)在过去几年中的流行&#xff0c;开发人员已经创建了许多自定义的JSP标记库。虽然很多标记库是为实现不同目标的而编写的&#xff0c;但它们往往也对迭代、条件及其它通用操作都提供了类似…