k-means聚类算法及案例分析


k-means聚类算法的R语言实现

#步骤1 数据集准备及描述

n=100

g=6

set.seed(g)

d<-data.frame(x=unlist(lapply(1:g,function(i) rnorm(n/g,runif(1)*i^2))),

              y=unlist(lapply(1:g,function(i) rnorm(n/g,runif(1)*i^2)))) #生成数据集

解释:#unlist 给定一个列表结构 xunlist 将其简化为生成一个包含 x 中出现的所有原子分量的向量。

            # lapply返回一个与 X 长度相同的列表,其中每个元素都是将 FUN 应用于 X 的相应元素的结果。

            #runif()函数用于生成从01区间范围内的服从正态分布的随机数,每次生成的值都不一样。runif(20) 表示生成2001之间的随机数

            #rnorm(n/g,runif(1)*i^2) 表示总共生成n/g个随机数,且每个随机数的大小为runif(1)*i^2

           #lapply(1:g,function(i) rnorm(n/g,runif(1)*i^2)) 表示总共生成与(1:g*n/g)长度相同的列表,且列表中的数字为runif(1)*i^2,其中i的取值为1:g

           #x=unlist(lapply(1:g,function(i) rnorm(n/g,runif(1)*i^2))) 标识把列表简化为向量

dim(d)

class(d)

#步骤2 计算簇类数k

library(cluster)

library(fpc)

pamk.best<-pamk(d)  #判断是否存在多个聚类

par(mfrow=c(1,2))  #设置画布展示,12张图

cat("number of clusters estimated by optimum average silhouette width:",pamk.best$nc,"\n") #cat表示连接

plot(pam(d,pamk.best$nc),main="")  #pam(x,k)将数据x划分为k个聚类

#这两个组成部分解释了100%的点变异性

#此图表示最佳平均轮廓宽度簇类数估计,从簇类数估计看,簇类设置为4类为最佳

#步骤3 聚类结果展示及其可视化

par(mfrow=c(1,1))

c1<-kmeans(d,pamk.best$nc)

c1

plot(d,col=c1$cluster)+points(c1$centers,col=3:6,pch=12,cex=1)

#plot(d,col=c1$cluster) 画出聚类结果

#points(c1$centers,col=3:6,pch=12,cex=1) 画出每个聚类的中心,且设置颜色col,设置参数控制符号(图中的四方格)pch,设置控制符号和文字的大小cex

案例1:k-means聚类算法在NCI60数据即上的应用

#NCI60数据集由64个细胞系的6830个基因表达数据构成,每个细胞系都有一个标签变量记录了其癌细胞的类型

library(ISLR)

nci.labs<-NCI60$labs

nci.data<-NCI60$data

#在进行 PCA 和聚类分析时,由于是无指导约学习,不使用癌细胞的类型特征,在 PCA和聚类分析之后,可以用这些特征检验无指导学习的结果与癌细胞类型的匹配度。

dim(nci.data)

nci.labs[1:4] #查看癌细胞系的类型

table(nci.labs) #列出癌细胞的类型

set.seed(2)

km.out<-kmeans(sd.data, 4, nstart=20) #k均值聚类法

km.clusters<-km.out$cluster

table(km.clusters,hc.clusters)

相关