第九章聚类分析与判别分析在实际工作中,我们经常遇到分类问题.若事先已经建立类别,则使用判别分析,若事先没有建立类别,则使用聚类分析.聚类分析主要是研究在事先没有分类的情况下,如何将样本归类的方法.聚类分析的内容包含十分广泛,有系统聚类法、动态聚类法、分裂法、最优分割法、模糊聚类法、图论聚类法、聚类预报等多种方法.聚类分析指将物理或抽象对象的集合分组成为由类似的对象组成的多个类的分析过程。它是一种重要的人类行为。聚类分析的目标就是在相似的基础上收集数据来分类。聚类源于很多领域,包括数学,计算机科学,统计学,生物学和经济学。在不同的应用领域,很多聚类技术都得到了发展,这些技术方法被用作描述数据,衡量不同数据源间的相似性,以及把数据源分类到不同的簇中。聚类与分类的不同在于,聚类所要求划分的类是未知的。聚类是将数据分类到不同的类或者簇这样的一个过程,所以同一个簇中的对象有很大的相似性,而不同簇间的对象有很大的相异性。从统计学的观点看,聚类分析是通过数据建模简化数据的一种方法。§9.1聚类分析基本知识介绍在MATLAB软件包中,主要使用的是系统聚类法.系统聚类法是聚类分析中应用最为广泛的一种方法.它的基本原理是:首先将一定数量的样品(或指标)各自看成一类,然后根据样品(或指标)的亲疏程度,将亲疏程度最高的两类合并,然后重复进行,直到所有的样品都合成一类.衡量亲疏程度的指标有两类:距离、相似系数.一、常用距离1)欧氏距离假设有两个n维样本),,,(112111nxxxx和),,,(222212nxxxx,则它们的欧氏距离为njjjxxxxd122121)(),(2)标准化欧氏距离假设有两个n维样本),,,(112111nxxxx和),,,(222212nxxxx,则它们的标准化欧氏距离为TxxDxxxxsd)()(),(2112121其中:D表示n个样本的方差矩阵,),,,(22221ndiagonalD,2j表示第j列的方差.3)马氏距离假设共有n个指标,第i个指标共测得m个数据(要求nm):imiiixxxx21,11211122121212(,,,)nnnmmnnxxxxxxXxxxxxx于是,我们得到nm阶的数据矩阵),,,(21nxxxX,每一行是一个样本数据.nm阶数据矩阵X的nn阶协方差矩阵记做)(XCov.两个n维样本),,,(112111nxxxx和),,,(222212nxxxx的马氏距离如下:TxxXCovxxxxmahal)())()((),(2112121马氏距离考虑了各个指标量纲的标准化,是对其它几种距离的改进.马氏距离不仅排除了量纲的影响,而且合理考虑了指标的相关性.4)布洛克距离两个n维样本),,,(112111nxxxx和),,,(222212nxxxx的布洛克距离如下:njjjxxxxb12121||),(5)闵可夫斯基距离两个n维样本),,,(112111nxxxx和),,,(222212nxxxx的闵可夫斯基距离如下:pnjpjjxxxxm112121||),(注:1p时是布洛克距离;2p时是欧氏距离.6)余弦距离TTTxxxxxxxxd221121211),(这是受相似性几何原理启发而产生的一种标准,在识别图像和文字时,常用夹角余弦为标准.7)相似距离TTTxxxxxxxxxxxxxxd))(())(())((1),(22221111221121二、MATLAB中常用的计算距离的函数假设我们有nm阶数据矩阵),,,(21nxxxx,每一行是一个样本数据.在MATLAB中计算样本点之间距离的内部函数为y=pdist(x)计算样本点之间的欧氏距离y=pdist(x,'seuclid')计算样本点之间的标准化欧氏距离y=pdist(x,'mahal')计算样本点之间的马氏距离y=pdist(x,'cityblock')计算样本点之间的布洛克距离y=pdist(x,'minkowski')计算样本点之间的闵可夫斯基距离y=pdist(x,'minkowski',p)计算样本点之间的参数为p的闵可夫斯基距离y=pdist(x,'cosine')计算样本点之间的余弦距离y=pdist(x,'correlation')计算样本点之间的相似距离另外,内部函数yy=squareform(y)表示将样本点之间的距离用矩阵的形式输出.三、常用的聚类方法常用的聚类方法主要有以下几种:最短距离法、最长距离法、中间距离法、重心法、平方和递增法等等.四、创建系统聚类树假设已经得到样本点之间的距离y,可以用linkage函数创建系统聚类树,格式为z=linkage(y).其中:z为一个包含聚类树信息的(m-1)3的矩阵.例如:z=2.0005.0000.23.0004.0001.28则z的第一行表示第2、第5样本点连接为一个类,它们距离为0.2;则z的第二行表示第3、第4样本点连接为一个类,它们距离为1.28.在MATLAB中创建系统聚类树的函数为z=linkage(y)表示用最短距离法创建系统聚类树z=linkage(y,'complete')表示用最长距离法创建系统聚类树z=linkage(y,'average')表示用平均距离法创建系统聚类树z=linkage(y,'centroid')表示用重心距离法创建系统聚类树z=linkage(y,'ward')表示用平方和递增法创建系统聚类树§9.2聚类分析示例例1在MATLAB中写一个名为opt_linkage_1的M文件:x=[31.7;11;23;22.5;1.21;1.11.5;31];y=pdist(x,'mahal');yy=squareform(y)%Reformatadistancematrixbetweenuppertriangularandsquareformz=linkage(y,'centroid')h=dendrogram(z)%Plotdendrogramgraphs画树状图存盘后按F5键执行,得到结果如下:yy=02.38792.19831.69462.16842.22840.88952.387902.60972.06160.23780.62552.37782.19832.609700.63532.55222.01532.98901.69462.06160.635301.97501.51062.41722.16840.23782.55221.975000.66662.14002.22840.62552.01531.51060.666602.45170.88952.37782.98902.41722.14002.45170z=2.00005.00000.23786.00008.00000.63533.00004.00000.63531.00007.00000.88959.000010.00002.106311.000012.00002.0117按重心距离法得到的系统聚类树为其中:h=dendrogram(z)表示输出聚类树形图的冰状图.一、根据系统聚类树创建聚类假设已经求出系统聚类树z,我们根据z来创建聚类,使用cluster函数.例2在MATLAB中写一个名为opt_cluster_1的M文件:x=[31.7;11;23;22.5;1.21;1.11.5;31];y=pdist(x,'mahal');yy=squareform(y)z=linkage(y,'centroid')h=dendrogram(z)t=cluster(z,3)其中:“t=cluster(z,3)”表示分成3个聚类,需要分成几个由人工选择.存盘后按F5键执行,得到结果如下:t=3122113即第1、第7样本点为第3类,第2、第5、第6样本点为第1类,第3、第4样本点为第2类.二、根据原始数据创建分类在MATLAB软件包中,内部函数clusterdata对原始数据创建分类,格式有两种:1)clusterdata(x,a),其中0a1,表示在系统聚类树中距离小于a的样本点归结为一类;2)clusterdata(x,b),其中b1是整数,表示将原始数据x分为b类.例3在MATLAB中写一个名为opt_clusterdata_1的M文件:x=[31.7;11;23;22.5;1.21;1.11.5;31];t=clusterdata(x,0.5)z=clusterdata(x,3)存盘后按F5键执行,得到结果如下:t=4322314z=2311332其中:t的结果表示距离小于0.5的样本点归结为一类,这样,共有四类,第1类:样本点6;第2类:样本点3、4;第3类:样本点2、5;第4类:样本点1、7.而z的结果表示首先约定将原始数据x分为3类,然后计算,结果如下:第1类:样本点3、4;第2类:样本点1、7;第3类:样本点2、5、6.利用内部函数clusterdata对原始数据创建分类,其缺点是不能更改距离的计算法.比较好的方法是分步聚类法.三、分步聚类法假设有样本数据矩阵x,第一步对于不同的距离,利用pdist函数计算样本点之间的距离:y1=pdist(x)y2=pdist(x,'seuclid')y3=pdist(x,'mahal')y4=pdist(x,'cityblock')第二步计算系统聚类树以及相关信息:z1=linkage(y1)z2=linkage(y2)z3=linkage(y3)z4=linkage(y4)第三步利用cophenet函数计算聚类树信息与原始数据的距离之间的相关性,这个值越大越好:%cophenetCopheneticcorrelationcoefficient同表象相关系数,同型相关系数,共性分类相关系数CPCCt1=cophenet(z1,y1)t2=cophenet(z2,y2)t3=cophenet(z3,y3)t4=cophenet(z4,y4)注:z在前,y在后,顺序不能颠倒.第四步选择具有最大的cophenet值的距离进行分类.利用函数clusterdata(x,a)对数据x进行分类,其中0a1,表示在系统聚类树中距离小于a的样本点归结为一类.例4在MATLAB中写一个名为opt_cluster_2的M文件:x=[31.7;11;23;22.5;1.21;1.11.5;31];y1=pdist(x);y2=pdist(x,'seuclid');y3=pdist(x,'mahal');y4=pdist(x,'cityblock');z1=linkage(y1);z2=linkage(y2);z3=linkage(y3);z4=linkage(y4);t1=cophenet(z1,y1)t2=cophenet(z2,y2)t3=cophenet(z3,y3)t4=cophenet(z4,y4)存盘后按F5键执行,得到结果如下:t1=0.9291t2=0.9238t3=0.9191t4=0.9242结果中t1=0.9291最大,可见此例利用欧式距离最合适.于是,在MATLAB中另写一个名为opt_cluster_3的M文件:x=[31.7;11;23;22.5;1.21;1.11.5;31];y1=pdist(x);z1=linkage(y1)存盘后按F5键执行,得到结果如下:z1=2.00005.00000.20003.00004.00000.50006.00008.00000.50991.00007.00000.70009.000011.00001.280610.000012.00001.3454矩阵z1的第1行表示样本点2、5为一类,在系统聚类树上的距离为0.2,其它类推.考察矩阵z1的第3列,系统聚类树上的6个距离,可以选择0.5作为聚类分界值.在MATLAB中另写一个名为opt_clus