所谓聚类,就是将类似的事物汇集在一 起,而将不类似的事物划分到不一样的类别的过程,是数据分析之中十分重要的一种手段。好比古典生物学之中,人们经过物种的形貌特征将其分门别类,能够说就是 一种朴素的人工聚类。如此,咱们就能够将世界上纷繁复杂的信息,简化为少数方便人们理解的类别,能够说是人类认知这个世界的最基本方式之一。 在数据分析的术语之中,聚类和分类是两种技术。分类是指咱们已经知道了事物的类别,须要从样品中学习分类的规则,是一种有指导学习;而聚类则是由咱们来给定简单的规则,从而获得分类,是一种无指导学习。二者能够说是相反的过程。html 网上关于聚类算法的资料不少,可是其实大都是几种最基本的方法,如K-means、层次聚类、SOM等,以及它们的许许多多的改进变种。这里,我就来讨论一下这些聚类算法,对它们的表现作一个简单的评估。由于内容有点多(其实主要是图占位置……),因此准备分几回来完成。算法
基本测试函数 0、测试数据集post 在介绍这些算法以前,这里先给出两个简单的测试样品组,下面每介绍完一个算法,能够直接看看它对这两个样品组的聚类结果,从而获得最直观的认识。学习
下图就是两个简单的二维样品组:测试 1)第一组样品属于最基本的聚类测试,界线仍是比较分明的,不过三个cluster的大小有较明显差别,能够测试一下算法对cluster size的敏感度。样品总共有2000个数据点动画 2)第二组是典型的甜甜圈形。使用这样的测试组主要是为了考察算法对cluster形状敏感度。共有1500个数据点。spa 对于这样的两个样品组,人类凭肉眼能够很容易地判断它们应该分为三个cluster(特别是我还用颜色作了区分……),但对于计算机就不必定了,因此就须要有足够优秀的聚类算法。 一、类似性度量 对于聚类,关键的一步是要告诉计算机怎样计算两个数据点的“类似性”,不一样的算法须要的“类似性”是不同的。 好比像以上两组样品,给出了每一个数据点的空间坐标,咱们就能够用数据点之间的欧式距离来判断,距离越近,数据点能够认为越“类似”。固然,也能够用其它的度量方式,这跟所涉及的具体问题有关。
二、层次聚类 层次聚类,是一种很直观的算法。顾名思义就是要一层一层地进行聚类,能够从下而上地把小的cluster合并汇集,也能够从上而下地将大的cluster进行分割。彷佛通常用得比较多的是从下而上地汇集,所以这里我就只介绍这一种。 所谓从下而上地合并cluster,具体而言,就是每次找到距离最短的两个cluster,而后进行合并成一个大的cluster,直到所有合并为一个cluster。整个过程就是创建一个树结构,相似于下图。 那 么,如何判断两个cluster之间的距离呢?一开始每一个数据点独自做为一个类,它们的距离就是这两个点之间的距离。而对于包含不止一个数据点的 cluster,就能够选择多种方法了。最经常使用的,就是average-linkage,即计算两个cluster各自数据点的两两距离的平均值。相似的 还有single-linkage/complete-linkage,选择两个cluster中距离最短/最长的一对数据点的距离做为类的距离。我的经 验complete-linkage基本没用,single-linkage经过关注局域链接,能够获得一些形状奇特的cluster,可是由于太过极 端,因此效果也不是太好。 层 次聚类最大的优势,就是它一次性地获得了整个聚类的过程,只要获得了上面那样的聚类树,想要分多少个cluster均可以直接根据树结构来获得结果,改变 cluster数目不须要再次计算数据点的归属。层次聚类的缺点是计算量比较大,由于要每次都要计算多个cluster内全部数据点的两两距离。另外,由 于层次聚类使用的是贪心算法,获得的显然只是局域最优,不必定就是全局最优,这能够经过加入随机效应解决,这就是另外的问题了。
聚类结果 对样品组1使用average-linkage,选择聚类数目为4,能够获得下面的结果。右上方的一些异常点被独立地分为一类,而其他的数据点的分类基本符合咱们的预期。 若是选择聚类数目为5,则是下面的结果。其中一个大的cluster被分割,但没有出现均匀分割的状况(好比K-means),只有少许的数据点被分离,大致的分类仍是比较正确的。所以这个算法能够处理大小差异比较大的聚类问题,对cluster size不太敏感。 如 何肯定应该取多少个cluster?这是聚类里面的一个很是重要的问题。对于层次聚类,能够根据聚类过程当中,每次合并的两个cluster的距离来做大概 判断,以下图。由于总共有2000个数据点,每次合并两个cluster,因此总共要作2000次合并。从图中能够看到在后期合并的两个cluster的 距离会有一个陡增。假如数据的分类是十分显然的,就是应该被分为K个大的cluster,K个cluster之间有明显的间隙。那么若是合并的两个小 cluster同属于一个目标cluster,那么它们的距离就不会太大。但当合并出来K个目标cluster后,再进行合并,就是在这K个 cluster间进行合并了,这样合并的cluster的距离就会有一个很是明显的突变。固然,这是十分理想的状况,现实状况下突变没有这么明显,咱们只 能根据下图作个大体的估计。 对于测试样品2,average-linkage可谓彻底失效,这是因为它对“类似性”的理解形成的,因此只能获得凸型的cluster。 整体而言,像average-linkage这样的算法仍是比较稳定的,能够大体地判断聚类数目,聚类效果也不错,在数据量比较小的时候可使用。 三、K-means算法 K-means是最为经常使用的聚类方法之一,尽管它有着不少不足,可是它有着一个很关键的优势:快!K-means的计算复杂度只有O(tkn),t是迭代次数,k是设定的聚类数目,而n是数据量,相比起不少其它算法,K-means算是比较高效的。 K-means的目标是要将数据点划分为k个cluster,找到这每一个cluster的中心,而且最小化函数 其中 为了获得每一个cluster的中心,K-means迭代地进行两步操做。首先随机地给出k个中心的位置,而后把每一个数据点归类到离它最近的中心,这样咱们就构造了k个cluster。可是,这k个中心的位置显然是不正确的,因此要把中心转移到获得的cluster内部的数据点的平均位置。实际上也就是计算,在每一个数据点的归类肯定的状况下,上面函数取极值的位置,而后再次构造新的k个cluster。这个过程当中,中心点的位置不断地改变,构造出来的cluster的也在变化(动画请看这里)。经过屡次的迭代,这k个中心最终会收敛并再也不移动。 K-means其实是EM算法的一个特例(关于EM算法,请猛击这里和这里),根据中心点决定数据点归属是expectation,而根据构造出来的cluster更新中心则是maximization。理解了K-means,也就顺带了解了基本的EM算法思路。 实际应用里,人们指出了不少K-means的不足。好比须要用户事先给出聚类数目k,而这个每每是很难判断的;又如K-means获得的是局域最优,跟初始给定的中心值有关,因此每每要尝试多个初始值;老是倾向于获得大小接近的凸型cluster等等。 K- means算法相比起上面提到的层次聚类,还有一个很大的不一样,那就是它须要数据点的坐标,由于它必需要求取平均,而层次聚类实际上并不须要坐标数据,只 须要知道数据点之间的距离而已。这也就是说K-means只适用于使用欧氏距离来计算数据点类似性的状况,由于若是采用非欧距离,那么也不能经过简单的平 均来获得cluster中心。 聚类结果 取 k=3,K-means对样品组1聚类获得下面两张图。为何是两张图呢?正如前面所说,K-means的聚类结果跟初始中心选择有关,而不是因此的初始 值都能保证聚类成功的,下面第二张就是失败的例子。另外因为K-means总倾向于获得接近大小的cluster,因此能够看到两个小的cluster对 大cluster的“入侵”。 对甜甜圈样品组,K-means也是彻底没辙。 从 上面的结果能够看出,K-means的聚类效果确实不是很好。用户若是选择了不正确的聚类数目,会使得本应同一个cluster的数据被断定为属于两个大 的类别,这是咱们不想看到的。由于须要数据点的坐标,这个方法的适用性也受到限制。可是效率是它的一个优点,在数据量大或者对聚类结果要求不是过高的状况 下,能够采用K-means算法来计算,也能够在实验初期用来作测试看看数据集的大体状况。 |