分级聚类(谱系聚类)
- 格式:docx
- 大小:64.43 KB
- 文档页数:9
matlab提供了两种方式来做分级聚类一、直接聚类此时调用的是clusterdata函数,而clusterdata函数可以视为pdist、linkage与cluster的综合,也就是说它们的参数在调用时使用的都是默认值,不能调,这就是直接聚类的含义。
其缺点为可供用户选择的面较窄,不能更改距离的计算方法,该方法的使用者无需了解聚类的原理和过程,但是聚类效果受限制。
下面介绍clusterdata函数的具体使用。
clusterdata函数的调用格式:T=clusterdata(X,cutoff)输出参数T是一个包含n个元素的列向量,其元素为相应观测所属类的类序号。
输入参 的矩阵,一定要注意矩阵的每一行对应一个观测(样品),每一列对应一个变量。
数X是n pCutoff 为阈值,它有两种含义,如下:(1)当0<cutoff<2时,T=clusterdata(X,cutoff) 等价于调用了Y=pdist(X,’euclid’); Z=linkage(Y,’single’); T=cluster(Z,’cutoff’,cutoff) ;(此时‘cutoff’指不一致系数或距离的阈值,参数值为正实数。
即此时clusterdata等价于最后T=cluster(Z‘cutoff’,c,’depth’,d),是按照不一致系数的规则来聚类的,并没有指定希望分成几类。
这有别于下面的(2))(2)Cutoff>>2时,T=clusterdata(X,cutoff) 等价于Y=pdist(X,’euclid’); Z=linkage(Y,’single’); T=cluster(Z, ‘maxclust’,cutoff) ;(‘maxclust’指定最大类数,参数值为正整数。
即此时cutoff表示的希望分成的类别数目)二、分步聚类所谓分布聚类,就是将聚类过程分为几个步骤,只不过是可以调具体函数的参数而已。
所用到的函数介绍1.1 pdist函数调用格式:Y=pdist(X,’metric’)说明:用‘metric’指定的方法计算 X 数据矩阵中对象之间的距离。
X:一个m×n的矩阵,它是由m个对象组成的数据集,每个对象的大小为n。
metric’取值如下:‘euclidean’:欧氏距离(默认);‘seuclidean’:标准化欧氏距离;‘mahalanobis’:马氏距离;‘cityblock’:布洛克距离;‘minkowski’:明可夫斯基距离;‘cosine’:‘correlation’:‘hamming’:‘jaccard’:‘chebychev’:Chebychev距离。
pdist生成一个M*(M-1)/2个元素的行向量,分别表示M个样本两两间的距离。
这样可以缩小保存空间,不过,对于读者来说却是不好操作,因此,若想简单直观的表示,可以用squareform函数将其转化为方阵,其中x(i,j)表示第i 个样本与第j个样本之的距离,对角线均为0.1.2 squareform函数调用格式:Z=squareform(Y,..)说明:强制将距离矩阵从上三角形式转化为方阵形式,或从方阵形式转化为上三角形式。
关于这个函数的使用见下面的第二个例子,是最好的说明。
1.3 linkage函数调用格式:Z=linkage(Y,’method’)说明:用‘method’参数指定的算法计算系统聚类树。
Y:pdist函数返回的距离向量;method:可取值如下:‘single’:最短距离法(默认);‘complete’:最长距离法;‘average’:未加权平均距离法;‘weighted’:加权平均法;‘centroid’:质心距离法;‘median’:加权质心距离法;‘ward’:内平方距离法(最小方差算法)返回:Z为一个包含聚类树信息的(m-1)×3的矩阵。
其中前两列为索引标识,表示哪两个序号的样本可以聚为同一类,第三列为这两个样本之间的距离。
另外,除了M个样本以外,对于每次新产生的类,依次用M+1、M+2、…来标识。
为了表示Z矩阵,我们可以用更直观的聚类数来展示,方法为:dendrogram(Z), 产生的聚类数是一个n型树,最下边表示样本,然后一级一级往上聚类,最终成为最顶端的一类。
纵轴高度代表距离列。
另外,还可以设置聚类数最下端的样本数,默认为30,可以根据修改dendrogram(Z,n)参数n来实现,1<n<样本个数。
dendrogram(Z,0)则表n=样本个数的情况,显示所有叶节点。
1.4用cophenet函数评价聚类信息【cophenet函数: 调用格式:c=cophenet(Z,Y)说明:利用pdist函数生成的Y和linkage函数生成的Z计算系统聚类树的cophenetic相关系数。
】cophene检验一定算法下产生的二叉聚类树和实际情况的相符程度,就是检测二叉聚类树中各元素间的距离和pdist计算产生的实际的距离之间有多大的相关性,另外也可以用inconsistent表示量化某个层次的聚类上的节点间的差异性。
cophenetic相关系数反映了聚类效果的好坏,cophenetic相关系数越接近于1,说明聚类效果越好。
可通过cophenetic相关系数对比各种不同的距离计算方法和不同的系统聚类的聚类效果。
1.5最后,用cluster进行聚类,返回聚类列。
Cluster函数在linkage函数的输出结果的基础上创建聚类,并输出聚类结果,其调用格式为:T=cluster(Z,‘cutoff’,c,’depth’,d)或T=cluster(Z, ‘maxclust’,cutoff)由系统聚类树矩阵创建聚类。
输入参数Z是由linkage函数创建的系统聚类树矩阵,它是(M-1)*3的矩阵,m是原始数据中观测(即样品)的个数。
C 用来设定聚类的阈值,当一个节点和它的所有子节点的不一致系数小于c时,该节点及其下面的所有节点被聚为一类。
输出参数T是一个包含m个元素的列向量,其元素为相应观测所属类的类序号。
特别地,当输入参数 c为一个向量,则输出T为一个m行多列的矩阵,c 的每个元素对应T的一列。
也就是可以比较不同的c下的分类结果。
d为计算的深度,默认为2。
三、具体例子(1)第一个例子设某地区有八个观测点的数据,样本距离矩阵如表1所示,根据最短距离法聚类分析。
%最短距离法系统聚类分析X=[7.90 39.77 8.49 12.94 19.27 11.05 2.04 13.29;7.68 50.37 11.35 13.3 19.25 14.59 2.75 14.87;9.42 27.93 8.20 8.14 16.17 9.42 1.55 9.76;9.16 27.98 9.01 9.32 15.99 9.10 1.82 11.35;10.06 28.64 10.52 10.05 16.18 8.39 1.96 10.81];BX=zscore(X); % 标准化数据矩阵Y=pdist(BX) % 用欧氏距离计算两两之间的距离D=squareform(Y) % 欧氏距离矩阵Z = linkage(Y) % 最短距离法T = cluster(Z,3) %等价于 { T=clusterdata(X,3) } ,希望将所有项目分为三类T3=find(T==3) % 第3类集合中的元素[H,TT]=dendrogram(Z) % 画聚类图,H是一个线的句柄的向量聚类谱系图如下图所示:这里没有对聚类的好坏进行评价,读者可以运行c=cophenet(Z,Y)来看看聚类的优度。
(2)第二个例子(1)确定对象(实际上就是数据集中的每个数据点)之间的相似性,实际上就是定义一个表征对象之间差异的距离,例如最简单的平面上点的聚类中,最经常使用的就是欧几里得距离。
这在MATLAB中可以通过Y=pdist(X)实现,例如>> X=randn(6,2)X =-0.4326 1.1892-1.6656 -0.03760.1253 0.32730.2877 0.1746-1.1465 -0.18671.1909 0.7258>> plot(X(:,1),X(:,2),'bo') %如下图接下来>> Y=pdist(X)Y =Columns 1 through 141.7394 1.0267 1.2442 1.5501 1.6883 1.8277 1.9648 0.54012.9568 0.2228 1.3717 1.1377 1.4790 1.0581Column 152.5092例子中X数据集可以看作包含6个平面数据点,pdist之后的Y是一个行向量,15个元素分别代表X 的第1点与2-6点、第2点与3-6点,......这样的距离。
那么对于M个点的数据集X,pdist之后的Y 将是具有M*(M-1)/2个元素的行向量。
Y这样的显示虽然节省了内存空间,但对用户来说不是很易懂,如果需要对这些距离进行特定操作的话,也不太好索引。
MATLAB中可以用squareform把Y转换成方阵形式,方阵中<i,j>位置的数值就是X中第i和第j点之间的距离,显然这个方阵应该是个对角元素为0的对称阵。
>> squareform(Y)ans =0 1.7394 1.0267 1.2442 1.5501 1.68831.7394 0 1.8277 1.9648 0.54012.95681.0267 1.8277 0 0.2228 1.3717 1.13771.2442 1.9648 0.2228 0 1.4790 1.05811.5501 0.5401 1.3717 1.4790 02.50921.68832.9568 1.1377 1.0581 2.5092 0这里需要注意的是,pdist可以使用多种参数,指定不同的距离算法。
help pdist把。
另外,当数据规模很大时,可以想象pdist产生的Y占用内存将是很吓人的,比如X有10k个数据点,那么X占10k*8*2Bytes=160K,这看起来不算啥,但是pdist后的Y会有10k*10k/2*8Bytes=400M 。
怕了把,所以,废话说在前面,用MATLAB的层次聚类来处理大规模数据,大概是很不合适的。
(2) 确定好了对象间的差异度(距离)后,就可以用Z=linkage(Y)来产生层次聚类树了。
>> Z=linkage(Y)Z =3.00004.0000 0.22282.0000 5.0000 0.54011.0000 7.0000 1.02676.0000 9.0000 1.05818.0000 10.0000 1.3717对于M个元素的X,前面说了Y是1行M*(M-1)/2的行向量,Z则是(M-1)*3的矩阵。