参考用书:数据挖掘:R语言实战 黄文 王正林 编著
聚类分析把若干事物按照某种标准归为几个类别
K-均值聚类(K-Means)
K-中心点聚类(K-Medoids)
密度聚类(DBSCAN)
系谱聚类(HC)
期望最大化聚类(EM)
K-均值聚类(K-Means):随机选取的k个样本作为起始中心点,将其余样本归入
相似度最高中心点所在的簇,再确立当前簇中的样本坐标的均值为新的中心点,
依次循环迭代下去,直至所有样本的类别不再变动。
K-中心点聚类(K-Medoids):与均值算法十分相近,知识在选择各类别中心点时
不去样本均值点,而在类别内选取到其余样本距离之和最小的样本为中心。
系谱聚类(HC):其聚类过程通过类似于系谱图的形式展现出来,特点在于不需要
事先设定类别数K,这是因为每次迭代过程仅将距离最近的两个样本/簇聚为一类
其运作过程将自然得到k=1至k=n个类别的聚类结果。
密度聚类(DBSCAN):选取一个未处理的点为圆心,作指定半径的圆,满足阀值MinPts,称为
核心对象,小于阀值MinPts称为边缘点,一直重复,得到若干核心对象和边缘点,这些点是密
度相连的,将各点归类完成。
期望最大化聚类(EM):将数据集看作一个含有隐性变量的概率模型,以获取与数据本身最合适
的聚类方式为目的,通过“反复估计”模型参数寻找出最优解,同时给出相应的最优类别数K。
#k-均值聚类
install.packages("stats")
library(stats)
?kmeans
#kmeans(x, centers, iter.max = 10, nstart = 1,
algorithm = c("Hartigan-Wong", "Lloyd", "Forgy",
"MacQueen"), trace=FALSE)
#x为数据集,centers为预设类别数K,iter.max为迭代的最大值,默认为10
#nstart为选择随机起始中心点的次数,默认为1,algorithm算法选择默认为Harttigan-Wong
iris2<-iris[,1:3]#调用数据集iris前3列作为原始数据集
fit_km1=kmeans(iris2[,-1],center=3)#用kmeans算法对数据集进行聚类
print(fit_km1)#输出类结果
fit_km1$centers#获取各类别中心点坐标
fit_km1$totss;fit_km1$tot.withinss;fit_km1$betweenss
#分别输出本次聚类的总平方和、组内平方和的总和,以及组件平方和
plot(iris2,pch=(fit_km1$cluster-1))
points(fit_km1$centers,pch=8)#将中心点以星号表示
?legend
legend(fit_km1$centers[1,1],fit_km1$centers[1,2],"Center_1",bty="4",xjust = 1,
yjust=0,cex=0.8)
legend(fit_km1$centers[2,1],fit_km1$centers[2,2],"Center_2",bty="4",xjust = 0,
yjust=0,cex=0.8)
legend(fit_km1$centers[3,1],fit_km1$centers[3,2],"Center_3",bty="4",xjust = 0.5,
yjust=0,cex=0.8)
?rep
result=rep(iris2,20)#用result变量存放20个聚类优度变量
for(k in 1:20)#对k进行1至20进行循环
{
fit_km1=kmeans(iris2[,-1],center=k)#取类别数k,进行均值聚类
result[k]=fit_km1$betweenss/fit_km1$totss
}
summary(result)#显示信息,因为数据集的选取原因做的不太理想
#k-中心点聚类
library(cluster)
?pam
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与k分别表示待处理数据和类别数,metric参数用于选择样本点间距离的测算方式
#nedoids制定初始点,默认为NULL,stand用于选择对数据是否进行标准化
#cluster选择是否仅获取各样本聚类结果,keep.data选择是否保留数据集。
fit_pam=pam(iris2[,-2],3)#用K-Medoids对数据集作聚类
print(fit_pam)#输出结果
head((fit_pam$data))
fit_pam$call#显示聚类的函数设置
fit_pam1=pam(iris2[,-1],3,keep.data =FALSE)#更改keep.data的值
fit_pam1$data
fit_pam2=pam(iris2[,-1],3,cluster.only=TRUE)#更改cluster.only的值
print(fit_pam2)
plot(fit_pam)
q
#系谱聚类
?hclust
hclust(d, method = "complete", members = NULL)
#d为待处理样本间的距离矩阵,method用于选择具体算法,默认选择complete
#members用于指出每个待聚类点/簇是由几个样本单独构成,
cutree(tree,k=NULL,h=NULL)
#cutree函数用来对聚类结果剪枝,tree为hclust()的聚类结果,参数k与h用于控制输出的结果。
rect.hclust(tree, k = NULL, which = NULL, x = NULL, h = NULL,
border = 2, cluster = NULL)
#rect.hclust可以在系谱图中指定类别的样本用方框表示出来。
fit_hc=hclust(dist(iris2[,-1]))#系谱聚类
print(fit_hc)
plot(fit_hc)#做聚类出系谱图
group_k3=cutree(fit_hc,k=3)#利用剪枝函数cutree()控制输出的聚类结果
group_k3
table(group_k3)#以列表的形式显示
group_h3=cutree(fit_hc,h=3)#控制输出height=3d的系谱聚类结果
group_h3
table(group_h3)
sapply(unique(group_k3),function(g)iris2$Sepal.Length[group_k3==g])
#查看如下K=3的聚类结果中个类别样本
plot(fit_hc)#做图
rect.hclust(fit_hc,k=4,border="light grey")#用浅灰色框住4分类的聚类结果
rect.hclust(fit_hc,k=3,border="dark grey")#深灰色,3类的聚类结果
rect.hclust(fit_hc,k=7,which=c(2,6),border="dark grey")
#用深灰色矩形框7分类的第2类和第6的聚类结果
#密度聚类
dbscan(data, eps, MinPts = 5, scale = FALSE, method = c("hybrid", "raw",
"dist"), seeds = TRUE, showplot = FALSE, countmode = NULL)
#data为数据集或距离矩阵,sep为考察每一样本地暖是否满足密度要求,MinPts为密度阀值,
#scale是否对数据集标准化,method选data属性hybrid(距离矩阵)/raw(原始数据集),
#showplot选择是否输出聚类结果示意图
library(fpc)
ds1=dbscan(iris2[,-1],eps=1,MinPts=5)#取半径参数eps为1,密度阀值为5
ds2=dbscan(iris2[,-1],eps=4,MinPts=5)
ds3=dbscan(iris2[,-1],eps=4,MinPts=2)
ds4=dbscan(iris2[,-1],eps=8,MinPts=2)
ds1;ds2;ds3;ds4#输出4种参数取值情况下的聚类结果
par(mfcol=c(2,2))#2行2列的画布
plot(ds1,iris2[,-1])#绘制
plot(ds2,iris2[,-1])
plot(ds3,iris2[,-1])
plot(ds4,iris2[,-1])
d=dist(iris2[,-1])#计算数据集的距离矩阵d
max(d);min(d)#查看样本间距离的最大值、最小值
install.packages("ggplot2")
library(ggplot2)
interval=cut_interval(d,3)#对样本距离进行分段处理,取中段数
table(interval)#展示分段结果
for(i in 0:2)#半径参数取0,1,2
{
for(j in 1:10)#密度阀值参数取1到10
{
ds=dbscan(iris2[,-1],eps=i,MinPts = j)#在半径为i,阀值为j时,作DBSCAN距离
print(ds)#输出每一次的聚类结果
}
}
#期望最大化聚类
Mclust(data, G = NULL, modelNames = NULL,
prior = NULL,
control = emControl(),
initialization = NULL,
warn = mclust.options("warn"),
x = NULL,
verbose = interactive(), ...)
data数据集,G预设类别数,modelNames设定模型类别
install.packages(mclust)
library(mclust)
fit_em=Mclust(iris2[,-1])#EM聚类
summary((fit_em))#获取EM聚类结果的信息汇总
summary(fit_em,parameters=T)#获取EM聚类结果的细节信息
plot(fit_em)#绘图共有四种,一一调用
BIC
density
classification
uncertaint
iris2_dens=densityMclust(iris2[,-1])#对每一个样本进行密度估计
plot(iris2_dens,iris2[,-1],col="grey",nleves=55)
BIC
density
plot(iris2_dens,type="persp",col=grey(0,1))
BIC
density