聚类分析有关函数介绍

1.pdist函数

用pdist函数可以计算观测量两两之间的距离,其语法格式如下。

Y = pdist(X):计算X矩阵中成对对象的欧氏距离。X为一mn矩阵,可以看作大小为n的m个向量。对于由m个对象组成的数据集,将有(m-1)m/2个匹配对。Y是长度为(m-1)m/2的向量,包含距离信息。这些距离信息按照(1, 2), (1, 3), …, (1, m), (2, 3), …, (2, m), ..., ...,(m-1, m) 的顺序排列。Y也常称为相似矩阵或不相似矩阵。

为了节省空间和计算时间,Y用向量的格式保存。但可以用squareform函数将它转换为方形矩阵,这样,矩阵中的元素(i,j)(i<j)对应于原始数据中的对象i与j之间的距离。

Y = pdist(X,'metric'):使用'metric'指定的方法计算X数据矩阵中对象之间的距离。 'metric'可以是下面字符串中的任意一个。

'euclidean'—— 欧氏距离(默认选项)。

'seuclidean'—— 标准化欧氏距离。

'mahalanobis'—— 马氏距离。

'cityblock'—— 布洛克距离。

'minkowski'—— 明可夫斯基距离。

'cosine'——1减去点(视为向量)间夹角的余弦。

'correlation'——1减去点(视为值序列)间的样本相关系数。

'hamming'——Hamming距离,不同坐标所占的比例。

'jaccard'——1减去Jaccard系数,该系数为不同非0坐标所占的比例。

'chebychev'——Chebychev距离(最大坐标差值)。

Y=pdist(X,@distfun):接受距离函数的句柄,该函数的形式为:

d=distfun(XI,XJ,p1,p2,…)

输入为两个qn矩阵XI和XJ,它们每个都包含X的行。另外还有0或其他参数。返回q1距离向量d,其第k个元素为观测量XI(k,:)和XJ(k,:)之间的距离。

Y = pdist(X,'minkowski', p):使用明可夫斯基距离计算X数据矩阵中对象之间的距离。p为明可夫斯基距离计算过程中的幂次,默认值为2。

2.squareform函数

该函数可以将距离矩阵从上三角形式转换为方形形式,或从方形形式转换为上三角形式。其语法格式如下。

Z = squareform(Y):将pdist函数返回的距离信息Y重新定义为方形对称矩阵Z的格式。在Z中,Z(i, j) 表示原始数据中i观测量和j观测量的距离。

Y=squareform(Z):Z是一个方形对称矩阵,对角线上的元素为0。创建向量Y,它包含对角线下方的元素。Y与pdist函数的输出具有相同的格式。

Z=squareform(y, 'tovector'):强制squareform函数将y作为向量处理。

Y=squareform(Z, 'tomatrix'):强制squareform函数将Z作为矩阵处理。

如果输入为单一元素,则使用后面介绍的两种格式很有用,所以输入为向量和方形矩阵都是可以的。

3.Linkage函数

利用该函数可以创建系统聚类树。其语法格式如下。

Z = linkage(Y):使用最短距离法创建一个系统聚类树。输入矩阵Y为pdist函数的输出,是一个距离向量,长度为(m-1)m/21,其中m为原始数据集中的对象数。

Z = linkage(Y,'method'):用'method'指定的算法计算系统聚类树。'method'可以有下面一些取值。

'single'—— 最短距离法(默认选项)。

'complete'—— 最长距离法。

'average'—— 未加权平均距离法。

'weighted'—— 加权平均距离法。

'centroid'—— 质心距离法,只在Y包含欧氏距离时输出Z才有意义。

'median'—— 加权质心距离法。

'ward'—— 内平方距离法(最小方差算法)。

输出Z为一个包含聚类树信息的(m-1)3矩阵。聚类系统的叶节点(没有次级节点的节点)为原始数据集中的对象,编号为1~m。这些叶节点构成了聚类树的基础。基于这些叶节点,可以建成更高的类。每一个新生成的类对应Z中的第i行,并指定编号为m+i,其中m为初始叶节点的总个数。

第1列和第2全即Z(i, 1:2),包含组成新类的配对对象的编号。该新类指定编号为m+i。有m-i个更高的类对应于系统聚类树的内节点。第3列,即Z(i, 3),包含每一个第i行类中配对对象之间对应的联结距离。

例如,有30个初始节点。若由联结函数组成的第10个类连接对象5和对象7,并且它们的距离是1.5,则Z的第10行将包含值(5, 7, 1.5)。该新组成的类的编号是10+30=40。若类40在后面的行中显示了,则意味着新构成的类又被合并到某个更高的类中了。

4.dendrogram函数

该函数可以输出冰柱图,其语法格式如下。

H=dendrogram(Z):生成系统二叉聚类树Z的冰柱图。Z是一个(m-1)3矩阵,由linkage函数生成,其中m是原始数据集中的对象个数。输出H是冰柱图中直线的句柄向量。冰柱图由系统聚类树中许多连接对象的U形线组成。每个U形的高度代表两个相连对象之间的距离。

H = dendrogram(Z, p):生成只有顶部p个节点的冰柱图。默认时,dendrogram 函数使用30作为p的值。当有30个以上的初始节点时,冰柱图将显得很拥挤。设置p=0,会显示所有节点。

[H, T] = dendrogram(...):创建一个冰柱图,返回一个大小为m的向量T,其中包含了原始数据集中每个对象的聚类个数。当p小于对象的总个数时,T很有用,所以显示中的某些叶节点对应于多个对象。例如,为了找到哪个对象包含在冰柱图的叶节点k中,使用find(T==k)函数进行查找。当原始数据中的对象数少于p个时,所有对象都显示在冰柱图中。此时,T为单位图,即T=(1:m)’,其中每个节点只包含一个对象。

[H,T,perm]=dendrogram(…):生成冰柱图并返回冰柱图叶节点标签的置换向量。对于水平冰柱图,perm从左向右排序;对于垂直冰柱图,perm从下往上排序。

[…]=dendrogram(…, 'colorthreshold',t):在冰柱图中连接小于阈值t的地方给每组节点指定一种唯一的颜色。t为区间[0,max(Z(:,3))]中的值。将t设置为字符串'default'时,与t=.7(max(Z(:,3)))相同。值为0时等同于不指定'colorthreshold'。max(Z(:,3))将整个树作为一组并给整个树着一种颜色。

[…]=dendrogram(…, 'orientation', 'orient'):设置冰柱图在图形窗口中的摆放方向。当'orient'的值为'top'时,从上往下摆放;当'orient'摆放值为'bottom'时,从下往上;拜访值为'left'时,从左往右摆放;当'orient'摆放值为'right'时,从右往左摆放。默认时值为'top'。

[…]=dendrogram(…, 'labels',S):接受一个字符数组或字符串元胞数组S,每个观测量有一个标签。对于树中包含单个观测量的任何叶节点,用该观测量的标签进行标注。

5.cophenet函数

利用该函数可以计算cophenetic相关系数。其语法格式如下。

c = cophenet(Z, Y):计算cophenetic相关系数。该系数可以比较由linkage函数生成Z中的距离信息和由pdist函数生成的Y中的距离信息。Z是一个(m-1)3矩阵,距离信息在第3列中,Y为一大小为(m-1)m/2的向量。

例如,给定距离为Y的一组对象{1,2,.... ,m} ,使用linkage函数可以生成一个系统聚类树。使用cophenet函数可以衡量该分类的歪曲程度,表示数据与该分类结构的拟合程度。

输出值c为cophenet相关系数。该值越接近1越好。该值可以用于比较用不同算法得到的分类解。

Z(:, 3)与Y之间的cophenetic相关系数定义为:

\[c=\frac{{∑}_{i\lt j}({Y}_{ij}-y)({Z}_{ij}-Z)}{\sqrt{{∑}_{i\lt j}({Y}_{ij}-y{)}^{2}{∑}_{i\lt j}({Z}_{ij}-z{)}^{2}}}\]

在上式中,Yij 为Y中对象i和对象j的距离;Zij 为Z(:, 3)中对象i和对象j的距离;y和z分别为Y和Z(:, 3)的平均值。

6.cluster函数

使用cluster函数,根据linkage函数的输出,可以创建分类,其语法格式如下。

T=cluster(Z, 'cutoff',c):根据linkage函数生成的系统聚类树Z来创建聚类。Z是一个(m-1)3矩阵。其中m为原始数据中观测量的个数。c是一个临界值,它决定cluster函数怎样创建聚类。输出T为大小为m的向量,包含原始数据中每个观测值所属的类别编号。

T=cluster(Z, 'maxclust', n):指定分类的最大个数。

T=cluster(…, 'criterion', 'crit'):使用指定的准则进行聚类,其中crit为'inconsistent'或'distance'。

T=cluster(…, 'depth',d):输入树的深度值d。默认时d=2。

7.clusterdata函数

利用该函数可以根据数据创建分类,其语法格式如下。

T = clusterdata(X,cutoff) 使用pdist,linkage和cluster函数创建数据矩阵X的分类。X为一个mn矩阵,m为观测量个数,n为变量个数。cutoff 为阈值,确定如何将linkage函数生成的系统聚类树分成不同的类。

当0 < cutoff < 2时,clusterdata在不连续值大于cutoff时形成聚类树。当cutoff为整数并且cutoff>=2时,clusterdata将cutoff解释为用linkage函数生成聚类时始终保持的最大分类数。输出T为大小为m的向量,包含每个观测量的类别号。

T = clusterdata(X, cutoff):与下面的命令行意义相同:

Y = pdist(X,'euclid');

Z = linkage(Y,'single');

T = cluster(Z,cutoff);

T=clusterdata(X, 'param1',val1, 'param2',val2,…):通过一系列参数/值对对聚类提供更多控制。合法的参数包括如下。

'distance'——任何在pdist函数中可用的距离度量的名称。

'linkage'——任何在linkage函数中可用的连接方法。

'cutoff'——不连续性或距离度量的阈值。

'maxclust'——最大分类个数。

'criterion'——'inconsistent'或'distance'。

'depth'——计算不连续值的深度。

8.inconsistent函数

该函数可以计算聚类树的不连续系数,其语法格式如下。

Y = inconsistent(Z):计算系统聚类树Z的每个联结的不连续系数,其中Z为(m1)3矩阵,由linkage函数生成。不连续系数通过比较聚类树中每个联结的长度与系统聚类树上同一水平的其他联结的平均长度来识别联结。该系数的值越大,由对应联结联系的对象的相似性越差。

Y = inconsistent(Z,d):计算系统聚类树Z中到深度d的每个联结的不连续系数,其中d为整数,表示参与计算的聚类树的水平数。默认时,d=2。输出Y为(m-1)4矩阵,具有表5-1所示的格式。

表5-1 Y矩阵各列的描述

描 述
1 计算中包含的所有联结长度的均值
2 计算中包含的所有联结的标准离差
3 计算中包含的联结个数
4 不连续系数

对于每个联结k,不连续系数的计算为

\[Y(k, 4)=(z(k, 3)-Y(k, 1))/Y(k, 2)\]

对于叶节点(没有次级节点的节点),不连续系数设置为0。