划分聚类分析: K均值和基于中心点的划分(PAM)

来源:互联网 发布:淘宝那家动漫海报好 编辑:程序博客网 时间:2024/05/16 10:03

一.原理

K均值聚类
      最常见的划分方法是K均值聚类分析。从概念上讲, K均值算法如下:
       (1) 选择K个中心点(随机选择K行);
       (2) 把每个数据点分配到离它最近的中心点;
       (3) 重新计算每类中的点到该类中心点距离的平均值(也就说,得到长度为p的均值向量,这里的p是变量的个数);
       (4) 分配每个数据到它最近的中心点;
       (5) 重复步骤(3)和步骤(4)直到所有的观测值不再被分配或是达到最大的迭代次数(R把10次作为默认迭代次数)。

       这种算法是把观测值分成k组并使得观测值到其指定的聚类中心的平方的总和为最小。也就是说,在步骤(2)和步骤(4)中,每个观测值被分配到使下式得到最小值的那一类中:

        表示第i个观测值中第j个变量的值。表示第k个类中第j个变量的均值,其中p是变量的个数。

 

PAM聚类算法:

       因为K均值聚类方法是基于均值的,所以它对异常值是敏感的。一个更稳健的方法是围绕中心点的划分(PAM)。与其用质心(变量均值向量)表示类,不如用一个最有代表性的观测值来表示(称为中心点)。 K均值聚类一般使用欧几里得距离,而PAM可以使用任意的距离来计算。因此, PAM可以容纳混合数据类型,并且不仅限于连续变量。

       PAM算法如下:
       (1) 随机选择K个观测值(每个都称为中心点);
       (2) 计算观测值到各个中心的距离/相异性;
       (3) 把每个观测值分配到最近的中心点;
       (4) 计算每个中心点到每个观测值的距离的总和(总成本);
       (5) 选择一个该类中不是中心的点,并和中心点互换;
       (6) 重新把每个点分配到距它最近的中心点;
       (7) 再次计算总成本;
       (8) 如果总成本比步骤(4)计算的总成本少,把新的点作为中心点;
       (9) 重复步骤(5)~(8)直到中心点不再改变。


二、步骤和结果

环境:windows 10 64位系统,R ×64 3.1.2

 K 均值聚类     

       在R中K均值的函数格式是kmeans(x,centers),这里x表示数值数据集(矩阵或数据框),centers是要提取的聚类数目。函数返回类的成员、类中心、平方和(类内平方和、类间平方和、总平方和)和类大小。
      由于K均值聚类在开始要随机选择k个中心点,在每次调用函数时可能获得不同的方案。使用set.seed()函数可以保证结果是可复制的。此外,聚类方法对初始中心值的选择也很敏感。
       kmeans()函数有一个nstart选项尝试多种初始配置并输出最好的一个。例如,加上nstart=25会生成25个初始配置。通常推荐使用这种方法。

        让我们用K均值聚类来处理包含178种意大利葡萄酒中13种化学成分的数据集。该数据最初来自于UCI机器学习库(http://www.ics.uci.edu/~mlearn/MLRepository.html),但是可以通过rattle包获得。在这个数据集里,观测值代表三种葡萄酒的品种,由第一个变量(类型)表示。我们可以放弃这一变量,进行聚类分析,看看是否可以恢复已知的结构。具体实验过程,如下:

  

 



因为变量值变化很大,所以在聚类前要将其标准化(1)。下一步,使用wssplot()和Nbclust()函数确定聚类的个数(2) 。图1表示从一类到三类变化时,组内的平方总和有一个明显的下降趋势。三类之后,下降的速度减弱,暗示着聚成三类可能对数据来说是一个很好的拟合。在图2中, NbClust包中的24种指标中有15种建议使用类别数为三的聚类方案。需要注意的是并非30个指标都可以计算每个数据集。


图1 画出组内的平方和和提取的聚类个数的对比。从一类到三类下降得很快           

      (之后下降得很慢),建议选用聚类个数为三的解决方案


图2  使用NbClust包中的26个指标推荐的聚类个数

使用kmeans()函数得到的最终聚类中,聚类中心也被输出了(3)。因为输出的聚类中心是基于标准化的数据,所以可以使用aggregate()函数和类的成员来得到原始矩阵中每一类的变量均值。

          使用Kmeans()函数总的聚类情况如下图3所示。


图3 划分3类的分类情况

PAM聚类算法:

       我们可以使用cluster包中的pam()函数使用基于中心点的划分方法。格式是pam(x, k, metric="euclidean",stand=FALSE),这里的x表示数据矩阵或数据框, k表示聚类的个数,metric表示使用的相似性/相异性的度量,而stand是一个逻辑值,表示是否有变量应该在计算该指标之前被标准化。具体实验过程,如下:


       注意,这里得到的中心点是葡萄酒数据集中实际的观测值。在这种情况下,分别选择36、 107和175个观测值来代表三类。通过从13个测定变量上得到的前两个主成分绘制每个观测的坐标来创建二元图(参见第14章)。每个类用包含其所有点的最小面积的椭圆表示。图4列出了使用PAM方法处理葡萄酒的数据。


图4  基于意大利葡萄酒数据使用PAM算法得到的三组聚类图


相应代码及对用的word文档解释可从以下链接得到:

划分聚类分析: K均值和基于中心点的划分(PAM) 及相应代码-CSDN下载
http://download.csdn.net/download/u012711335/10142621


注:本文思想来自《R语言实战》