基于R语言的聚类分析(k-means,层次聚类)

时间:2021-01-11 16:48:01

今天给大家展示基于R语言的聚类,在此之前呢,首先谈谈聚类分析,以及常见的聚类模型,说起聚类我们都知道,就是按照一定的相似性度量方式,把接近的一些个体聚在一起。这里主要是相似性度量,不同的数据类型,我们需要用不同的度量方式。除此之外,聚类的思想也很重要,要是按照聚类思想来说,主要有这么几大类,第一大类是基于分割的聚类,比如k-means,以及按照这个思路进行了简单扩展的几个聚类,如k-median等。第二大类呢,就是层次聚类,它其实是把个体之间的关系进行了一个层次展示,具体聚为几类,由人为进行设定。第三大类呢,就是基于密度的聚类,这里不要讲基于密度的聚类和基于概率密度分布的聚类相混淆,这其实是一样的,比如混合模型,就是基于概率分布的聚类,而DBSCAN就是基于密度的聚类,实际上,这里密度是指一指局部密度,而不是概率密度分布。那么第四大类呢,就是基于概率密度分布的聚类,这一类聚类方法主要是假设数据来自某个概率分布,或者是某几个概率分布的组合,进而进行参数估计,确定分布的样子,再反过来看看,样本点属于哪一类。那么第五大类呢,是矩阵的分解(Nonnegative Matrix Factorizations ),这一大类其实和之前的几类明显不同,比如SVD分解,或者其他的分解其实在文本挖掘或者推荐算法里边都属于聚类。最后一大类就是谱聚类了。下面我们用R语言进行一下计算。

#要是没有这个包的话,首先需要安装一下
#install.packages("factoextra")
#载入包
library(factoextra)
# 载入数据
data("USArrests") 
# 数据进行标准化
df <- scale(USArrests) 
# 查看数据的前五行
head(df, n = 5)
               Murder   Assault   UrbanPop         Rape
Alabama    1.24256408 0.7828393 -0.5209066 -0.003416473
Alaska     0.50786248 1.1068225 -1.2117642  2.484202941
Arizona    0.07163341 1.4788032  0.9989801  1.042878388
Arkansas   0.23234938 0.2308680 -1.0735927 -0.184916602
California 0.27826823 1.2628144  1.7589234  2.067820292
#确定最佳聚类数目
fviz_nbclust(df, kmeans, method = "wss") + geom_vline(xintercept = 4, linetype = 2)

基于R语言的聚类分析(k-means,层次聚类)

#可以发现聚为四类最合适,当然这个没有绝对的,从指标上看,选择坡度变化不明显的点最为最佳聚类数目。
#设置随机数种子,保证实验的可重复进行
set.seed(123)
#利用k-mean是进行聚类
km_result <- kmeans(df, 4, nstart = 24)
#查看聚类的一些结果
print(km_result)
#提取类标签并且与原始数据进行合并
dd <- cbind(USArrests, cluster = km.res$cluster)
head(dd)
           Murder Assault UrbanPop Rape cluster
Alabama      13.2     236       58 21.2       4
Alaska       10.0     263       48 44.5       3
Arizona       8.1     294       80 31.0       3
Arkansas      8.8     190       50 19.5       4
California    9.0     276       91 40.6       3
Colorado      7.9     204       78 38.7       3

#查看每一类的数目
table(dd$cluster)
 1  2  3  4 
13 16 13  8 
#进行可视化展示
fviz_cluster(km_result, data = df,
             palette = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
             ellipse.type = "euclid",
             star.plot = TRUE, 
             repel = TRUE,
             ggtheme = theme_minimal()
)

结果如下:
基于R语言的聚类分析(k-means,层次聚类)
一般来说,能够对数据聚类后进行可视化展示的也就是二维,三维数据,如果维度很高的话,一种方法是t-SNE方法,这种方法是按照流型的方法进行可视化,用的比较多。另一种的话,就是利用降维方法,比如主成分分析等,进行降维后可视化展示。

下面我们进行层次聚类

#先求样本之间两两相似性
result <- dist(df, method = "euclidean") #产生层次结构 result_hc <- hclust(d = result, method = "ward.D2") #进行初步展示 fviz_dend(result_hc, cex = 0.6)

结果如下:
基于R语言的聚类分析(k-means,层次聚类)

根据这个图,我们可以方便的确定聚为几类比较合适,比如我们聚为四类,并且进行可视化展示

fviz_dend(result_hc, k = 4, 
          cex = 0.5, 
          k_colors = c("#2E9FDF", "#00AFBB", "#E7B800", "#FC4E07"),
          color_labels_by_k = TRUE, 
          rect = TRUE          
)

效果如下:
基于R语言的聚类分析(k-means,层次聚类)

好,今天就到这,明天继续展示其它几类聚类方法,以及图的制作。