#用iris数据集进行聚类分析
iris2<-iris[,1:4]
iris.kmeans<-kmeans(iris2,3)#选择聚类个数为3
iris.kmeans
#用table函数查看分类结果情况
table(iris$Species,iris.kmeans$cluster)
#上述属性中,最常用的就是centers和cluster属性,即中心点和聚类的分类集合
#下面我们将分类中心及中心点打印出来
plot(iris2$Sepal.Length,iris2$Sepal.Width,col=iris.kmeans$cluster,pch=as.integer(iris$Species))
points(iris.kmeans$centers,pch="X",cex=1.5,col=4)
#图注:颜色是实际聚类结果,形状是原始数据真实分类(共错分16个).
library(MASS)#载入包
library(ggplot2)
library(ggpubr)
data("geyser")#引入到R空间数据
ggscatter(geyser,x="duration",y="waiting")+geom_density2d()
#画二维概率密度图,在Rstudio里运行后如下所示,这样大体知道数据是来自三个二维正态分布的,将三个二维正态分布看成一个整体,就形成了一个混合模型.
#载入包
library(mclust)
library(ggplot2)
library(factoextra)
set.seed(123)#设置随机种子
#混合模型聚类
mc<-Mclust(geyser)
ggplot(geyser,aes(x=duration,y=waiting,colour=mc$classification))+geom_point()
#在Rstudio里运行后如下图所示:
library(fpc)
iris2<-iris[-5]
#?dbscan
ds<-dbscan(iris2,eps=0.42,MinPts=5)
table(ds$cluster,iris$Species)
#打印出ds和iris2的聚类散点图
plot(ds,iris2)
#打印出iris第一列和第四列为坐标轴的聚类结果
plot(ds,iris2[,c(1,4)])
#另一个表示聚类结果的函数
#?plotcluster
plotcluster(iris2,ds$cluster)
library(kernlab)
library(ggplot2)
data(spirals)
df<-as.data.frame(spirals)#将数据设置为数据框格式
names(df)<-c("x1","x2")#重命名
ggplot(df,aes(x=x1,y=x2))+geom_point()#查看原始数据
sc<-specc(spirals,centers=2)
df1<-df
df1$class<-as.factor(sc@.Data)#将类标签和原始数据融合
ggplot(df1,aes(x=x1,y=x2,colour=class))+geom_point()#进行可视化
dim(iris)
idx<-sample(1:dim(iris)[1],40)
iris3<-iris[idx,-5]
iris3
#?hclust
hc<-hclust(dist(iris3),method="ave")
plot(hc,hang=-1,labels=iris$Species[idx])#这里hang=-1使得树的节点在下方对齐
#将树分为3块
rect.hclust(hc,k=3)
#?cutree
groups<-cutree(hc,k=3)
#手肘法,这里仍以iris数据集为例
data(iris)
dataset<-iris[,-5]#把第5列去掉
dataset<-scale(dataset)#因为每一列的值差别很大,从1到100多的都有,这样会造成误差,所以需要归一化。
#编写代价函数
wssplot<-function(data,nc=5,seed=1234){
wss<-(nrow(data)-1)*sum(apply(data,2,var))
for(i in 1:nc){
set.seed(seed)
wss[i]<-sum(kmeans(data,centers=i)$withinss)
}
plot(1:nc,wss,type="b",xlab="Number of Clusters",ylab="Within groups sum of squares")}
wssplot(dataset)
#由下图可以看出从一类到四类下降的很快,之后下降的很慢,所以最佳聚类个数为3.
library(cluster)
set.seed(123)
#?clusGap
gap_clust<-clusGap(dataset,kmeans,10,B=100,verbose=interactive())#这里的dataset是手肘法里定义的将iris第五列去掉后的数据。
install.packages("factoextra")
library(factoextra)
fviz_gap_stat(gap_clust)
#下图是在Rstudio里运行出的结果,可以看出,在聚类数为4的时候gap值取到了最大值,所以最佳聚类数为3.