文章目录

  • 1.对数据集进行加载、预处理集可视化
    • 1.1 加载数据集
    • 1.2 数据预处理
    • 1.3 将样本点进行可视化
  • 2.密度聚类(DBSCAN 算法)
    • 2.1 加载程序包
    • 2.2 设置聚类参数阈值并可视化
    • 2.3 密度聚类
  • 3.层次聚类(hclust算法)
    • 3.1 层次聚类
    • 3.2 层次聚类参数调整并展示结果
  • 4.期望最大化聚类(Mclust算法)
    • 4.1 期望最大化聚类并获取相关信息
    • 4.2 结果图形展示
      • 2维密度图
      • 3维密度图
  • 总结
  • Reference
  • 实验资料
  • 数据集:2 维数据集—Countries,可以用平面图清晰的展示聚类效果。该数据集含有 68 个国家和地区的出生率(%)与死亡率(%)。

  • 实验目的:通过对该数据集进行分析,发现不同国家与地区的出生率与死亡率,并根据比较进行公共卫生的预测与防御

  • 本实验利用密度聚类、层次聚类和期望最大化聚类对上述数据集进行聚类分析,并将三种聚类方法进行简单的比较。

1.对数据集进行加载、预处理集可视化

1.1 加载数据集

setwd("存放数据集的路径")
countries<-read.csv("countries.csv") #读取数据集

1.2 数据预处理

dim(countries)
head(countries)

从 head()结果图中可以发现该数据集没有列名,且行所对应的是数字,不是相应国家。

下面我们要对行列名进行修改

names(countries)<-c("country","birth","death") #设置三个变量名字
var<-countries$country #取变量 country 的值赋值给 varvar<-as.character(var) #将赋值的变为字符型
head(var)for(i in 1:68) row.names(countries)[i]=var[i]#将数据集 countries 的行名命名为响应国家名
head(countries)

1.3 将样本点进行可视化

plot(countries$birth,countries$death) #画出所有 68 个样本点
c<-which(countries$country=="聚类点1")
d<-which(countries$country=="聚类点2")
e<-which(countries$country=="聚类点3")
f<-which(countries$country=="聚类点4")
g<-which(countries$country=="聚类点5")
h<-which(countries$country=="聚类点6")
m<-which.max(countries$birth) #获取出生率最高的点在数据集中的位置points(countries[c(c,d,e,f,g,h,m),-1],pch=16)#以实心圆点标出如上样本点legend(countries$birth[c],countries$death[c],"天狼星区",bty="n",xjust=0.5,cex=0.8)
#标出天狼星区样本点的图例
legend(countries$birth[d],countries$death[d],"参宿七星区",bty="n",xjust=0.5,cex=0.8)
legend(countries$birth[e],countries$death[e],"蓝移星区",bty="n",xjust=0.5,cex=0.8)
legend(countries$birth[f],countries$death[f],"菲律星区",bty="n",xjust=0.5,cex=0.8)
legend(countries$birth[g],countries$death[g],"塞协尔星区",bty="n",xjust=0.5,cex=0.8)
legend(countries$birth[h],countries$death[h],"大角星区",bty="n",xjust=0.5,cex=0.8)
legend(countries$birth[m],countries$death[m],countries$country[m],bty="n",xjust=1,cex=0.8)

从图中我们大概能看出,(菲律星区、塞协尔星区、大角星区)可聚为一类;
9天狼星区、参宿七星区、蓝移星区)为一类;
象牙海岸/非洲(IVORY-COAST)等为一类。
并且(天狼星区)与(参宿七星区、蓝移星区)的出生率相近,死亡率却要高约 5 个百分比。

以上就是对数据的预处理部分,下面开始对该数据集密度聚类:

2.密度聚类(DBSCAN 算法)

2.1 加载程序包

install.packages("fpc")
library(fpc)

2.2 设置聚类参数阈值并可视化

#设置聚类的参数:半径和密度
ds1=dbscan(countries[,-1],eps=1,MinPts=5)#取半径参数 eps 为 1,密度阈值 MinPts 为 5
ds2=dbscan(countries[,-1],eps=4,MinPts=5)#取半径参数 eps 为 4,密度阈值 MinPts 为 5
ds3=dbscan(countries[,-1],eps=4,MinPts=2)#取半径参数 eps 为 4,密度阈值 MinPts 为 2
ds4=dbscan(countries[,-1],eps=8,MinPts=2)#取半径参数 eps 为 8,密度阈值 MinPts 为 2ds1;ds2;ds3;ds4par(mfcol=c(2,2)) #设置 4 张图按照 2 行 2 列摆放的空白位置
plot(ds1,countries[,-1],main="1:MinPts=5 eps=1")#绘制MinPts=5,eps=1 时的结果
plot(ds3,countries[,-1],main="3:MinPts=2 eps=4")#绘制MinPts=2,eps=4 时的结果
plot(ds2,countries[,-1],main="2:MinPts=5 eps=4")#绘制MinPts=5,eps=4 时的结果
plot(ds4,countries[,-1],main="4:MinPts=2 eps=8")#绘制MinPts=2,eps=8 时的结果

半径1,阈值5:DBSCAN 算法将绝大多数样本都判定为噪声点仅 9 个密度极为相近的样本点被判定为有效聚类。

半径4,阈值5:仅有 5 个样本被判定为噪声点,而剩余样本都被归为相应的类别簇中。

半径4,阈值2:更多的样本被归入相互密度可达样本类别。

半径8,阈值2:由于核心对象、密度可达等高年的判定条件在很大程度上被放松,可想而知,会有大量的样本点被归为同类中。

由可视化,得出 DBSCAN 算法的参数取值规律:

  • 半径参数(eps)与阈值参数(MinPts)的取值差距越大,所得类别总数越小;
  • 半径参数(eps)相对于阈值参数(MinPts)较小时,越多的样本被判定为噪声点或边缘点。

2.3 密度聚类

1)密度聚类之前需要计算数据集的距离矩阵:

d=dist(countries[,-1])#计算数据集距离矩阵 d
max(d);min(d) #查看样本间距离的最大值,最小值

2)对样本间的距离进行分段处理:
结合最大值最小值相差 50 (49.56259-0.2236068)左右,取居中段数为 30 并展示数据分类结果

library(ggplot2)
interval=cut_interval(d,30)
#对各样本间的距离进行分段处理,结合最大值最小值相差 50 左右,取居中段数为 30
table(interval) #展示数据分类结果which.max(table(interval)) #找出所含样本点最多的区间



3)用不同阈值、不同半径进行密度聚类并可视化

根据上图可知:样本点距离大多在(3.15,5.16]之间,因此考虑半径参数(eps)的取值为 3、4、5、密度阈值参数取 1-10:

for(i in 3:5) #半径参数取 3,4,5
{for(j in 1:10) #密度阈值参数取 1 至 10{ds=dbscan(countries[,-1],eps=i,MinPts=j) #在半径为i,阈值为j时,作dbscan 距离print(ds)}
}

部分结果如上所示

3.层次聚类(hclust算法)

3.1 层次聚类

fit_hc=hclust(dist(countries[,-1])) #对 countries 数据集进行系谱聚类
print(fit_hc)
plot(fit_hc)

从聚类图(无标签)可以看到,在图的最下端每个样本点各占一个分支自成一类,越往上看一条分支下的样本点数越多,直至最下端所有样本点聚为一类。在图的左侧以高度指标衡量树形图的高度。

3.2 层次聚类参数调整并展示结果

group_k3=cutree(fit_hc,k=3)
#利用剪枝函数 cutree()中的参数 k 控制输入 3 类别的系谱聚类结果
group_k3
table(group_k3)


group_h18=cutree(fit_hc,h=18)
#利用剪枝函数中的参数 h 控制输出Height=18 时的系谱聚类结果
group_h18
table(group_h18)


上图分别是利用剪枝函数中的参数 h 控制输出 Height=3 和18时的聚类结果。

sapply(unique(group_k3),function(g)countries$country[group_k3==g])
#查看如上K=3的聚类结果中各类别样本
plot(fit_hc)
rect.hclust(fit_hc,k=4,border="blue")
#用蓝色矩形框出4分类的聚类结果
rect.hclust(fit_hc,k=3,border="red")
#用红色矩形框出3分类的聚类结果
rect.hclust(fit_hc,k=7,which=c(2,6),border="green")
#用绿矩形框出7分类的第2类和第6类的聚类结果


设置类别数的聚类效果如上图所示

4.期望最大化聚类(Mclust算法)

4.1 期望最大化聚类并获取相关信息

1)加载相关包

library(mclust)

2)进行期望最大化聚类并获取相关信息

fit_EM=Mclust(countries[,-1]) #对 countries 数据集进行 EM 聚类
summary(fit_EM)#获取 EM 聚类结果的信息汇总
summary(fit_EM,parameters=TRUE) #获取 EM 聚类结果的细节信息


从结果可以看出,最优类别数为 4,且各类别分别含有 12、2、17、37 个样本。

4.2 结果图形展示

plot(fit_EM)countries_BIC<-mclustBIC(countries[,-1])#获取数据集 countries 在各模型和类别数下的 BIC 值
countries_BICsum=summary(countries_BIC,data=countries[,-1])#获取数据集 countries 的 BIC 值概况
countries_BICsumcountries_BIC
plot(countries_BIC,G=1:7,col="black")
names(countries_BICsum)mclust2Dplot(countries[,-1],classification=countries_BICsum$classification,parameters=countries_BICsum$parameters,col="black")
#绘制分类图

①查看BIC:

②查看classification:

③查看uncertainty:

④查看density:

countries_BIC<-mclustBIC(countries[,-1])#获取数据集 countries 在各模型和类别数下的 BIC 值
countries_BICsum=summary(countries_BIC,data=countries[,-1])#获取数据集 countries 的 BIC 值概况
countries_BICsum
countries_BIC


plot(countries_BIC,G=1:7,col="black")
names(countries_BICsum)


mclust2Dplot(countries[,-1],classification=countries_BICsum$classification,parameters=countries_BICsum$parameters,col="black")
#绘制分类图

上图不仅将各类别样本的主要分布区域用椭圆圈出,并标出了类别中心点,且以样本点图形的大小来显示该样本归属于相应类别的概率大小。

countries_Dens=densityMclust(countries[,-1])#对每一个样本进行密度估计

2维密度图

plot(countries_Dens,countries[,-1],col="grey",nlevels=55)#作 2 维密度图

①查看BIC:

②查看density:

3维密度图

plot(countries_Dens,type="persp",col=grey(0.8)) #作 3 维密度图

①查看BIC:

②查看density:

(需要加载一会)

密度估计图是三维的图形,它更直观的展示了密度区域,使得对密度的疏密有个大致的了解。

总结

系谱聚类?:从可视化中就可以感受到系谱聚类与上个实验中的均值聚类和中心点聚类的不同。系谱聚类的可视化图就像是一个族谱一样分了很多不同的分支,而分支的最底端是所有的样品点名称。

密度聚类:与其它聚类的不同之处在于需要对它设置阈值和半径。相对于以上的均值聚类、中心点聚类和系谱聚类来说,它的优势在于弥补了前者只能发现“类圆形”聚类簇的缺陷,而密度聚类算法由于是基于“密度”来聚类的,可以在具有噪声的空间数据库中发现任意形状的簇。

期望最大化聚类:思路十分巧妙,在使用该算法进行聚类时,它将数据集看作一个含有隐形变量的概率模型,并以实现模型最优化,即获取与数据本身性质最契合的聚类方式为目的,通过“反复估计”模型参数找出最优解,同时给出相应的最优类别数 K。因此,期望最大化聚类相对于前面提到的聚类来说更为抽象

Reference

dbscan: Density-based Spatial Clustering of Applications with Noise (DBSCAN)/文RDocumentation

hclust: Hierarchical Clustering/文RDocumentation

Mclust: Model-Based Clustering/文RDocumentation

DBSCAN/百度百科

DBSCAN 算法/文简书@dreampai

聚类分析算法总结/文知乎@石显

基于EM算法的聚类R包mclust/文简书@小潤澤

R语言数据挖掘实践----聚类分析的常用函数/文个人图书馆@新用户26922hFh

实验资料

数据集&R语言代码
提取码:1111(这里应该会自动填充)

【R】【密度聚类、层次聚类、期望最大化聚类】相关推荐

  1. R语言聚类算法之期望最大化聚类(Expectation Maximization Algorithm)

    1.原理解析: 它将数据集看作一个含有隐性变量的概率模型,并以实现模型最优化,即获取与数据本身性质最契合的聚类方式为目的,通过"反复估计"模型参数找到最优解,同时给出相应的最优类别 ...

  2. R语言 均值聚类、中心聚类、系谱聚类、密度聚类、最大期望聚类

    关注微信公共号:小程在线 关注CSDN博客:程志伟的博客 R版本:v_3.6.1 主要讲述5类聚类: K-means聚类 K-中心聚类 系谱聚类 密度聚类 EM聚类 5种聚类的应用实例以及详细的参数说 ...

  3. 机器学习--聚类(五种主要聚类算法)

    机器学习–聚类(五种主要聚类算法) 原博文: 聚类是一种机器学习技术,它涉及到数据点的分组.给定一组数据点,我们可以使用聚类算法将每个数据点划分为一个特定的组.理论上,同一组中的数据点应该具有相似的属 ...

  4. 【聚类】五种主要聚类算法

    原博文: 聚类是一种机器学习技术,它涉及到数据点的分组.给定一组数据点,我们可以使用聚类算法将每个数据点划分为一个特定的组.理论上,同一组中的数据点应该具有相似的属性和/或特征,而不同组中的数据点应该 ...

  5. R语言KMeans聚类分析确定最优聚类簇数实战:期望最大化expectation-maximization准则(确定最优聚类簇数)

    R语言KMeans聚类分析确定最优聚类簇数实战:期望最大化expectation-maximization准则(确定最优聚类簇数) 目录

  6. R语言层次聚类(hierarchical clustering):使用scale函数进行特征缩放、hclust包层次聚类(创建距离矩阵、聚类、绘制树状图dendrogram,在树状图上绘制红色矩形框)

    R语言层次聚类(hierarchical clustering):使用scale函数进行特征缩放.hclust包层次聚类(创建距离矩阵.聚类.绘制树状图dendrogram,在树状图上绘制红色矩形框) ...

  7. R密度聚类之DBSCAN模型

    R密度聚类之DBSCAN模型 目录 R密度聚类之DBSCAN模型 密度聚类DBSCAN 模型构建及分析

  8. 【数据挖掘】基于密度的聚类方法 - DBSCAN 方法 ( DBSCAN 原理 | DBSCAN 流程 | 可变密度问题 | 链条现象 | OPTICS 算法引入 | 聚类层次 | 族序概念 )

    文章目录 I . DBSCAN 简介 II . DBSCAN 算法流程 III . DBSCAN 算法 优缺点 IV . 可变密度问题 V . 链条现象 VI . OPTICS 算法原理 VII . ...

  9. 【数据挖掘】聚类算法 简介 ( 基于划分的聚类方法 | 基于层次的聚类方法 | 基于密度的聚类方法 | 基于方格的聚类方法 | 基于模型的聚类方法 )

    文章目录 I . 聚类主要算法 II . 基于划分的聚类方法 III . 基于层次的聚类方法 IV . 聚合层次聚类 图示 V . 划分层次聚类 图示 VI . 基于层次的聚类方法 切割点选取 VII ...

最新文章

  1. python 根据字典中值的大小对项进行排序
  2. linux内核模块编译出现找不到include/generated/asm/unistd_32.h” 问题解决
  3. 刘志勇:微博短视频百万级高并发架构
  4. ERROR 1 (HY000): Can‘t create/write to file ‘/var/www/11.txt‘ (Errcode: 13)报错解决方案
  5. C++ 简单的 Tcp 实现[socket] 服务器端与客户端通信
  6. 靶形数独(信息学奥赛一本通-T1447)
  7. Verilog 初学笔记--顺序操作 和 并行操作的一点思考(参考黑金教程:Verilog HDL那些事 建模篇)...
  8. (4)Redis的Java API
  9. magisk下载里显示没有模块_magisk框架
  10. abaqus2020软件 Linux版本安装教程 超详细安装教程
  11. 【密码学原理】密钥管理和分发——对称密钥分发
  12. IDM下载器Windows系统是最快的下载工具
  13. nginx: [warn] conflicting server name
  14. kafka中zk的作用
  15. Win10分屏HDMI检测不到显示器
  16. (转)程序员依然是这个时代,贫寒学子翻身的不二选择
  17. 面试老大难的数据库缓存一致性问题
  18. WPF中使用Winform控件
  19. 接收微信公众号的事件推送并且回复消息
  20. 2019年人工智能研发热点回眸

热门文章

  1. 数字图像处理——车牌识别(matlab)
  2. 天勤2022数据结构(六)图
  3. 我的世界服务器修改logo,《我的世界手机版》如何修改界面logo斜体小黄字
  4. 中创易票通打印票据支票 非凡软件
  5. 液压绞车液压系统设计
  6. 卧式铣床主传动系统设计建模及运动仿真
  7. 电商技术架构演进过程——具体到每一个技术
  8. 在Elasticsearch中回测阿隆(Aroon)指標交叉交易策略
  9. 内蒙古大学考研复试计算机,内蒙古大学计算机考研复试题
  10. C语言基础 - 正负数按位取反公式推导