R语言数据分析与挖掘(第九章):聚类分析(1)——动态聚类
- 2019 年 12 月 13 日
- 筆記
函数介绍
在R语言中,用于实现k-means聚类的函数为kmeans(),其的数的基本书写写格式为:
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
中,其函数的基本书写格式为:
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,即不打印任何东西。
案例:基于随机生成序列的动态聚类
> 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聚类。
(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类,代码如下:
(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聚类
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类
pam2<-pam(dat,3) summary(pam2) plot(pam2)
代码运行后,可以明显看出,第三类是在左边的大类中划分出来的,各个类别之间的距离用直线标注;右图中的si值显示,当原始数据聚成3类时,其中一类的si值较小,说明划分结果不是很理想,比较k-medoids聚类的结论不一致,说明原始样本中含有极端值,对k-means聚类结果影响较大。
