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 给定一个列表结构 x,unlist 将其简化为生成一个包含 x 中出现的所有原子分量的向量。
# lapply返回一个与 X 长度相同的列表,其中每个元素都是将 FUN 应用于 X 的相应元素的结果。
#runif()函数用于生成从0到1区间范围内的服从正态分布的随机数,每次生成的值都不一样。runif(20) 表示生成20个0到1之间的随机数
#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)) #设置画布展示,1行2张图
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)