前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >R语言数据分析与挖掘(第九章):聚类分析(1)——动态聚类

R语言数据分析与挖掘(第九章):聚类分析(1)——动态聚类

作者头像
DoubleHelix
发布2019-12-13 10:25:33
2.8K0
发布2019-12-13 10:25:33
举报
文章被收录于专栏:生物信息云生物信息云
动态聚类算法属于基于质心的聚类,其基本思想为:选择一批凝聚点或给出一个初始的分类,让样品按某原则向凝聚点凝聚,对凝聚点进行不断的修改或迭代,直至分类比较合理或迭代稳定为止。动态聚类法有许多种方法,本文介绍比较流行的K均值法和K中心法。

函数介绍

在R语言中,用于实现k-means聚类的函数为kmeans(),其的数的基本书写写格式为:

代码语言:javascript
复制
kmeans(x, centers, iter.max = 10, nstart = 1,
       algorithm = c("Hartigan-Wong", "Lloyd", "Forgy",
                     "MacQueen"), trace=FALSE)
## S3 method for class 'kmeans'
fitted(object, method = c("centers", "classes"), ...)

参数介绍:

X:指定用于聚类的数值型矩阵或可以转换为矩阵的对象;

Centers:可以为整数或数值向量,整数用于指定聚类数目k,数值向量用于指定初始类质心;

iter.max:用于指定最大迭代次数;

nstart:当参数centers为整数时,本参数用于指定随机抽取的数据集的个数;

Algorithm:指定用于聚类的算法,可供选择的算法有: "Hartigan-Wong","Lloyd","Forgy"和"MacQueen";

Trace:可以为逻辑值或整数,目前仅用于默认方法,即"Hartigan-Wong". 若为TRUE,则指定生成关于算法进度的跟踪信息,当为整数时,更高的值将会指定生成更多的跟踪信息。

函数K-means()的返回结果是一个列表,包括:

cluster表示存储各观测值所属的类别编号;

centers表示存储最终聚类结果的各个类别的质心点;

tots表示所有聚类变量的离差平方和;

wihiness表示每个类别中所有聚类变量的离差平方和,该参数用于刻画各个类别中样本观测点的离散程度;

tot.withiness表示每个类别中所有聚类变量的离差平方和的总和,即wihiness的结果求和;

bewees表示各类别间的聚类变量的离差平方和之和;size表示各个类别的作

本量。

在R语言中,用于实现k-medoids聚类的函数为pam(),该函数存储在R包cluser

中,其函数的基本书写格式为:

代码语言:javascript
复制
pam(x, k, diss = inherits(x, "dist"),
    metric = c("euclidean", "manhattan"), 
    medoids = NULL, stand = FALSE, cluster.only = FALSE,
    do.swap = TRUE,
    keep.diss = !diss && !cluster.only && n < 100,
    keep.data = !diss && !cluster.only,
    pamonce = FALSE, trace.lev = 0)

参数介绍:

X:指定用于聚类的数据对象;

Diss:逻辑值,若为TRUE,则x将被视为不相似矩阵。若为FALSE, 则x将被视为变量的观测矩阵,默认值为"dist" 或不相似对象;

Metric:指定样本间距离测算的方式,可供选择的有"euclidean"和"mahattan",默认值为"euclidean";

Medoids:取值为NULL或一个k维向量,当取值为NULL时,指定初始中心点样本由软件自行选择,默认值为NULL;

Stand:指定进行聚类前是否对数据机型标准化;

cluster.only:逻辑值,指定聚类结果是否仅包括各样本点所归属的类别,若取值为TRUE,则算法的效率更高,默认值为FALSE;

do.swap:逻辑值,用于指定交换阶段是否应发生,若为TRUE,则指定原始算法,若为FALSE,则表示交换阶段的计算机密集程度远大于构建阶段,所以可以通过do.swap = FALSE跳过,默认值为TRUE;

kep.diss: 逻辑值,指定相似性和或者输入数据x是否应该是逻辑值,默认值

为!diss && !cluster.only &&n< 100;

kep.da:逻辑值,指定是否在聚类结果中保留数据集,默认值为!diss&& !clustcr.only;

Pamoncer:逻和值成为0到2之间的熬数,州定由Reynolds符人提出的算法快

捷方式,默认值为FALSE:

trace.lev:一个整数,指定在算法的构建和交换阶段期间的跟踪级别,更高的值将会指定生成更多的跟踪信息,默认位为0,即不打印任何东西。

案例:基于随机生成序列的动态聚类

代码语言:javascript
复制
> set.seed(1234)
> dat <- rbind(matrix(rnorm(100, mean=0,sd = 0.2), ncol = 2),matrix(rnorm(100,mean = 1, sd = 0.3), ncol = 2))
> colnames(dat) <- c("x", "y")
> plot(dat)

上诉代码表示,随机生成两列正态分布数据,第一列的均值为0,标准差为0.2,第二列的均值为1,标准差为0.3,散点图的结果如上图,不难看出,样本点大致分为2类,下面我们进行k-means聚类。

代码语言:javascript
复制
(kmeans.1 <- kmeans(dat, 2))

plot(dat, col = kmeans.1$cluster,main="聚成2类")
points(kmeans.1$centers, col = 3:4, pch = 8, cex = 2)

上诉代码表示将原始数据聚成2类,将聚类结果绘制出来,利用不同颜色区分类别,最后标出类质心。

此外,还可以尝试将原始数据聚成3类,代码如下:

代码语言:javascript
复制
(kmeans.2 <- kmeans(dat, 3))
plot(dat, col = kmeans.2$cluster,main="聚成3类")
points(kmeans.2$centers, col = 3:5, pch = 8, cex = 2)

k-medoids聚类

下面我们利用同样的数据集进行k-medoids聚类

代码语言:javascript
复制
library(cluster)
pam1<-pam(dat,2)
summary(pam1)
par(mfrow=c(1,2))
plot(pam1)

上述代码表示利用函数pam()将dat数据集的聚类分成2类,聚类结果的展示如下图,左图展示了每一类的样本点分布,右边的图像显示了2个簇的阴影,当si的值较大即接近1时,表示相应的观测点能够正确的划分到相似较大的簇中,图中2个簇的si值是0.77和0.64.说明划分结果较好。

同样我们也可以将结果分为3类

代码语言:javascript
复制
pam2<-pam(dat,3)
summary(pam2)
plot(pam2)

代码运行后,可以明显看出,第三类是在左边的大类中划分出来的,各个类别之间的距离用直线标注;右图中的si值显示,当原始数据聚成3类时,其中一类的si值较小,说明划分结果不是很理想,比较k-medoids聚类的结论不一致,说明原始样本中含有极端值,对k-means聚类结果影响较大。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-11-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 MedBioInfoCloud 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 函数介绍
  • 案例:基于随机生成序列的动态聚类
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档