本文主要介绍聚类算法的原理、聚类分析的两个基本问题:性能度量和距离计算,聚类分析中类个数的确定方法与原则,以及进行聚类分析前的数据中心化和标准化变换处理。

一、概述

聚类(Clustering)是一种无监督学习(Unsupervised Learning),即训练样本的标记信息是未知的。聚类既可以通过对无标记训练样本的学习来揭示数据的内在性质及规律,找寻数据内在的分布结构,也可以作为分类等其他学习任务的前驱任务,为进一步的数据分析提供基础。
主要的聚类算法可以划分为如下几类:划分聚类、层次聚类、密度聚类、网格聚类以及模型聚类。后续会抽取部分进行详细介绍。
聚类算法原理:输入一组未被标记的样本,根据数据自身的距离或相似度划分为若干组,划分的原则是组内距离最小化而组间距离最大化。聚类分析涉及两个基本问题——性能度量和距离计算

二、性能度量

聚类性能度量亦称聚类“有效性指标”(Validity Index),其作用包括:通过某种性能度量来评估算法好坏;明确最终将要使用的性能度量,可以直接将其作为聚类过程的优化目标,从而得到更符合要求的聚类结果。
聚类将样本集D划分为互不相交的子集,这里成为样本簇,要达到的目标为“簇内相似度”高且“簇间相似度”低

聚类性能度量大致有两类:

  • 将聚类结果与某个“参考模型”进行比较,称为“外部指标”;
  • 直接考察聚类结果而不利用任何参考模型,称为“内部指标”。

1.外部指标

对数据集D={X1,X2,…,Xm},假定通过聚类给出的簇划分为C={C1,C2…,Ck},参考模型给出的簇划分为C∗={C∗1,C∗2,…,C∗s},令λ与λ∗分别表示与C和C∗对应的簇标记向量。将样本两两配对考虑,定义:

聚类算法 java 聚类算法原理_聚类


其中:

集合SS包含了在C中隶属于相同簇且在C∗中也隶属于相同簇的样本对;

集合SD包含了在C中隶属于相同簇但在C∗中隶属于不同簇的样本对;

集合SD包含了在C∗中隶属于相同簇但在C中隶属于不同簇的样本对;

集合DD包含了在C中隶属于不同簇且在C∗中也隶属于不同簇的样本对。

由于每个样本对仅能出现在一个集合中,因此有a+b+c+d=m(m−1)/2成立。基于上述表达式,有以下常用的聚类性能衡量外部指标:

聚类算法 java 聚类算法原理_clustering_02


上述性能指标结果值均在[0,1]区间,且越大越好。

2.内部指标

对数据集D={X1,X2,…,Xm},假定通过聚类给出的簇划分为C={C1,C2…,Ck},定义:

聚类算法 java 聚类算法原理_聚类_03


其中:

dist()用于计算两个样本之间的距离;

u代表簇C的中心点;

avg(C)对应于簇C内样本间的平均距离;

diam(C)对应于簇C内样本的最远距离;

dmin(Ci,Cj)对应于簇Ci和Cj最近样本间的距离;

dcen(Ci,Cj)对应于簇Ci和Cj中心点之间的距离.基于上述表达式,有以下常用的聚类性能衡量内部指标:

聚类算法 java 聚类算法原理_聚类算法 java_04


显然,DBI的值越小越好,而DI则越大越好。

除了以上性能度量指标之外,常见的还有F值、互信息(Mutual Information)、平均阔宽(Average Silhouette Width)等。

三、距离计算

对于函数dist()进行距离度量,满足以下四个基本性质即可:

  • 非负性:dist(xi,xj)>=0;
  • 同一性:dist(xi,xj)=0当且仅当xi=xj;
  • 对称性:dist(xi,xj)=dist(xj,xi);
  • 直递性:dist(xi,xj)<=dist(xi,xk)+dist(xk,xj)(其中k为任一点,又称“三角不等式”)

在讨论距离计算时还需要考虑属性上是否定义了“序”关系,如定义了序的{1,2,3}中1和2比较接近,与3比较远,而没有定义序的{飞机,火车,轮船}则不能直接在属性值上计算距离。

1.有序属性

对于有序属性距离计算,常用的有:“闵可夫斯基距离”、“欧氏距离”、“曼哈顿距离”等,其中最常用的是“闵可夫斯基距离”:

聚类算法 java 聚类算法原理_聚类算法 java_05

2.无序属性

对于无序属性可采用VDM(Value Difference Matrix)。令mu,a表示在属性u上取值为a的样本数,mu,a,i表示在第i个样本簇中在属性u上取值为a的样本数,k为样本簇数,则属性u上两个离散值a与b之间的VDM距离为:

聚类算法 java 聚类算法原理_clustering_06

另外,当样本空间中不同属性的重要性不同时,可使用“加权距离”。而在R语言中,可以用dist()函数进行距离的计算。

四、类个数的确定

1.确定类个数的方法

在聚类过程中类的个数的确定是一个十分困难的问题,至今仍未找到令人满意的方法,目前基本的方法有三种:

  • 给定一个阈值:通过观察谱系图,给出一个阈值T,要求类与类之间的距离要大于T。
  • 观测样本的散点图:对于二维和三维的样本,可以通过观测数据散点图来确定类的个数。
  • 根据谱系图确定分类的个数。

2.确定类个数的准则

Bemirmen (1972) 提出根据研究目的来确定适当的分类方法,并提供了以下准则:

  • 各类中心的距离必须很大;
  • 确定的类中,各类所包含的元素都不要太多;
  • 类的个数符合使用目的;
  • 若采用几种不同的聚类方法处理,则在各自的聚类图中应发现相同的类。

五、数据中心化和标准化变换

在做聚类分析的过程中,大多数数据是不能直接参与运算的,需要先做数据中心化或标准化处理

1.中心化变换

称x∗ij=xij−x̅j,其中i=1,2,⋅⋅⋅,n,j=1,2,⋅⋅⋅,p为中心化变换,其中

聚类算法 java 聚类算法原理_聚类_07

,变换后数据的均值为0,方差阵不变。中心化可以解决模型运行不稳定的问题。

2.标准化变换

称x∗ij=(xij−x̅j)/Sj,其中i=1,2,⋅⋅⋅,n,j=1,2,⋅⋅⋅,p为标准化变换,其中

聚类算法 java 聚类算法原理_聚类算法 java_08

。变换后数据,每个变量的样本均值为0,标准差为1,而且标准化后的数据与变量的量纲无关。

3.R语言数据中心化和标准化变换处理

R语言中,可以用scale(x, center = TRUE, scale = TRUE)函数作数据中心化和标准化变换处理,其中x为待变换的数据矩阵,center参数控制是否中心化,scale参数控制是否标准化,两者缺省值都是TRUE。

作者:薛毅