前言
何为聚类(clustering)?简单而言,就是按照某个特定标准(如距离准则)把一个数据集分割成不同的类或簇,使得同一个簇内的数据对象的相似性尽可能大,同时不在同一个簇中的数据对象的差异性也尽可能大。即聚类后同一类的数据尽可能聚到一起,不同类的数据尽量分离。数据集中不同观测值间的相似性是根据观测值间的距离进行度量的,比如欧氏距离(euclidean distance)和基于相关性的距离(correlation-based distance)。
谈到聚类,就不得不谈一下分类(classification),两者是有一定差别的。聚类通常又被称为无监督学习(unsupervised learning),即在聚类的时候,我们并不关心某一类是什么,我们需要实现的目标只是把相似的东西聚到一起。因此,一个聚类算法通常只需要知道如何计算相似度就可以开始工作了,因此,聚类通常并不需要使用训练数据进行学习。
而分类就不一样了,对于一个分类器,通常需要你告诉它“这个东西被分为某某类”这样一些例子,理想情况下,一个会从它得到的训练集中进行“学习”,从而具备对未知数据进行分类的能力,这种提供训练数据的过程通常叫做监督学习(supervised learning)。
从类别来看,聚类的算法有很多种,比如有基于划分的方法、基于层次的方法、基于密度的方法、基于网格的方法、基于模型的方法、基于模糊的方法和其他聚类方法(基于约束、基于粒度、谱聚类、核聚类和量子聚类),但常用的有两种:
- 基于划分的聚类(partitioning clustering):给定包含N个点的数据集,划分法将构造K个分组,每个分组代表一个聚类,这里每个分组至少包含一个数据点,每个数据点属于且仅属于一个分组。对于给定的K值,算法先给出一个初始的分组方法,然后通过反复迭代的方法改变分组,使得每一次改进之后的分组方案较前一次好,这里好的标准在于同一组中的点越近越好,不同组中的点越远越好。常用的方法就是k-means方法。
- 基于层次的聚类(hierarchical clustering):主要是将给定的数据集进行逐层分解,直到满足某种条件为止。具体可分为“自底向上”和“自顶向下”两种方案。在“自底向上”方案中,初始时每个数据点组成一个单独的组,在接下来的迭代中,按一定的距离度量将相互邻近的组合并成一个组,直至所有的记录组成一个分组或者满足某个条件为止。
下面将首先介绍在R中进行聚类分析所需的数据格式和如何去准备数据,然后介绍两个将要使用的R包,cluster 和 factoextra,分别用于进行聚类的计算和结果的可视化。
数据的准备
要想在R中进行聚类分析,应该按照如下要求准备数据:
- 行必须是观测值(个体或样本),列必须是变量;
- 任何缺失数据都必须删除;
- 必须对数据进行标准化(如成比例缩放)。如想详细了解,请关注下一篇文章。
下面我们将使用内置的R数据集“USArrests”,其中包含1973年美国50个州中每10万居民因袭击,谋杀和强奸而被捕的统计结果。它还包括生活在城市地区人口比例。
data("USArrests") # 加载数据
df <- USArrests
- 删除数据中可能存在的缺失值:
df <- na.omit(df)
- 对数据进行标准化:
df <- scale(df)
将要使用的R包
在后面的文章中,将主要使用2个R包:
- cluster:用以对数据进行聚类计算;
- factoextra:用于对聚类结果进行可视化,官方文档:https://rpkgs.datanovia.com/factoextra/.
factoextra中包含许多用于聚类分析和可视化的函数,包括:
函数 | 功能 |
---|---|
dist(fviz_dist, get_dist) | 距离矩阵的计算与可视化 |
get_clust_tendency | 评估聚类趋势 |
fviz_nbclust(fviz_gap_stat) | 确定最佳的聚类数 |
fviz_dend | 树状图的增强版可视化 |
fviz_cluster | 聚类结果的可视化 |
fviz_mclust | 基于模型的聚类结果的可视化 |
fviz_silhouette | 聚类中的轮廓信息的可视化 |
hcut | 分层聚类的计算并剪切树 |
hkmeans | 分层的k均值聚类 |
eclust | 聚类分析的可视化增强版 |
参考
本文由 Boer 创作,采用 知识共享署名4.0
国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: Aug 25,2020