数学建模之聚类分析
聚类分析聚类分析 所研究的样本或者变量之间存在不同的相似性,要求设法找出一些能够度量它们之间相似程度的统计量作为分类的依据,再利用这些将样本或者变量进行分类。系统聚类分析:将n个样本或者n个指标看成n类,一类包括一个样本或者指标,然后将性质最接近的两类合并成一个新类,依次类推。最终可以按照需要来决定分多少类,每类有多少样本(指标)。系统聚类分析的步骤1计算n个样本两两之间的距离。2...
聚类分析
- 聚类分析 所研究的样本或者变量之间存在不同的相似性,要求设法找出一些能够度量它们之间相似程度的统计量作为分类的依据,再利用这些将样本或者变量进行分类。
- 系统聚类分析:将n个样本或者n个指标看成n类,一类包括一个样本或者指标,然后将性质最接近的两类合并成一个新类,依次类推。最终可以按照需要来决定分多少类,每类有多少样本(指标)。
系统聚类分析的步骤
- 1计算n个样本两两之间的距离。
- 2构成n个类,每类只包含一个样品
- 3合并距离最近的两类为一个新类
- 4计算新类与当前各类的距离(新类与当前类的距离等于当前类与组合类中包含的类的距离的最小值),若类的个数等于1,转5,否则转3
- 5画聚类图
- 6 决定类的个数和类。
系统聚类分析
主要介绍系统聚类分析方法。系统聚类分析法是聚类分析中应用最为广泛的一种方法。
它的基本原理是:首先将一定数量的样品或者指标各自看成一类,然后根据样品(或者指标)的亲疏程度,将亲疏程度最高的两类进行合并。然后考虑合并后的类与其他类之间的亲疏程度,再进行合并。重复这一过程,直至将所有的样品(或者指标)合并为一类。
系统聚类分析用到的函数:
聚类分析
- 研究对于样品或者指标进行分类的一种多元统计方法,是依据研究对象的个体的特征进行分类的方法。
- 聚类分析把分类对象按照一定规则分成若干类,这些类非事先给定的,而是根据数据特征确定的。在同一类中这些对象在某种意义上趋向于彼此相似,而在不同类中趋向于不相似。
- 职能是建立一种能按照样品或者变量的相似程度进行分类的方法。
聚类分析种类
- 聚类分析有两种:一种是对样品的分类,称为Q型,另一种是对变量(指标)的分类,称为R型。
- R型聚类分析的主要作用:1.不但可以了解个别变量之间的亲疏程度,而且可以了解各个变量组合之间的亲疏程度。2.根据变量的分类结果以及它们之间的关系,可以选择主要变量进行Q型聚类分析或回归分析。(回归系数R^2为选择标准)
- Q型聚类分析的主要作用:1.可以综合利用多个变量的信息对样本进行分析。2.分类效果直观,聚类谱系图清楚地表现数值分类结果。3.聚类分析所得到地结果比传统分类方法更细致全面合理。本文主要讨论Q型。
聚类分析基本思想:
在生产实际中经常遇到给产品等级进行分类的问题,如一等品、二等品等,在生物学中,要根据生物的特征进行分类;在考古时要对古生物化石进行科学分类;在球类比赛中经常要对各球队进行分组如何确定种子队,这些问题就是聚类分析问题。随着科学技术的发展,我们利用已知数据首先提取数据特征,然后借助计算机依据这些特征进行分类,聚类的依据在于各类别之间的接近程度如何计量,通常采取距离与相似系数进行衡量。
- 设有n个样品的p元观测数据组成一个数据矩阵。如下:
其中每一行代表一个样品,每一列代表一个指标,xij表示第i个样品关于第j个指标的观测值,聚类分析的基本思想就是在样品之间定义距离,在指标之间定义相似系数,样品之间的相似系数刻画指标之间的相似度。 将样品(或者变量)按照相似度的大小逐一归类,关系密切的聚集到较小的一类,关系疏远的聚集到较大的一类,聚类分析通常有:谱系聚类、快速聚类。本文主要介绍谱系聚类。
样品间的相似度量-距离
一 常用距离的定义
设有n个样品的p元观测数据:
这时,每个样品可看成p元空间的一个点,每两个点之间的距离记为d(xi,xj)满足条件:
距离计算:
例题:
为了研究辽宁、浙江、河南、甘肃、青海5省1991年城镇居民生活消费规律,需要利用调查资料对五个省进行分类,指标变量共8个,意义如下:x1:人均粮食支出,x2:人均副食支出;x3:人均烟酒茶支出,x4:人均其他副食支出,x5:人均衣着商品支出,x6:人均日用品支出,x7:人均燃料支出,x8人均非商品支出。
题目中给的数据都是有关系的。
- 解:计算各省之间的欧氏、绝对、明氏距离
a=[7.9 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.2 8.14 16.17 9.42 1.55 9.76
9.16 27.98 9.01 9.32 15.99 9.1 1.82 11.35
10.06 28.64 10.52 10.05 16.18 8.39 1.96 10.81];
d1=pdist(a);% 此时计算出各行之间的欧氏距离,为了得到书中的距离矩阵,我们键入命令:
D= squareform(d1), % 注意此时d1必须是一个行向量,结果是实对称矩阵
%若想得到书中的三角阵,则有命令:
S = tril(squareform(d1))
d2=pdist(a,'cityblock'); S2 = tril(squareform(d2))
d3=pdist(a,'minkowski',3); S3 = tril(squareform(d3))
结果如下:
例:表1.1 式1999年中国省(自治区、直辖市)的城市规模结构特征的一些数据,试通过聚类分析将这些省(自治区、直辖市)进行分类。
2.基本假设
1.假设图表中的数据经过完全统计;
2.假设本题中考虑的指标变量相互之间无联系。
- 模型的建立与分析
- 模型的求解
- 模型的求解
绘制聚类图,根据实际需要决定类的个数和类。
根据上述解题过程编写如下MATLAB代码:保留列数据,新建为“str801.txt”;保留表中所有数据,新建为“data801.txt”
clc,clear fid=fopen('str801.txt','r'); ss=textscan(fid,'%s'); a=load('data801.txt'); b=zscore(a); d=pdist(b); z=linkage(d); dendrogram(z,'label',ss{:})
- 结果分析:
根据编写代码绘制出的聚类分析图如上图1.1所示,我们发现京津冀、苏沪、青海各自成一类,其余地区成一类。
例2. 13个国家1990,1995,2000可持续发展能力如下:分成4类
采取不同的距离,得到以下结果:
变量间的相似度量——相似系数
当对p个指标变量进行聚类时,用相似系数来衡量变量之间的相似程度(关联度),若用 表示变量之间的相似系数,则应满足:
相似系数中最常用的是相关系数与夹角余弦。
- ① 夹角余弦
两变量的夹角余弦定义为:
- ② 相关系数
两变量的相关系数定义为:
例3.计算例1中各指标之间的相关系数与夹角余弦:
解:
a=[7.9 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.2 8.14 16.17 9.42 1.55 9.76
9.16 27.98 9.01 9.32 15.99 9.1 1.82 11.35
10.06 28.64 10.52 10.05 16.18 8.39 1.96 10.81];
R=corrcoef(a);% 指标之间的相关系数
a1=normc(a); % 将a的各列化为单位向量
J=a1'*a1 % 计算a中各列之间的夹角余弦
结果如下:
谱系聚类法
谱系聚类法是目前应用较为广泛的一种聚类法。谱系聚类是根据生物分类学的思想对研究对象进行分类的方法。在生物分类学中,分类的单位是:门、纲、目、科、属、种。其中种是分类的基本单位,分类单位越小,它所包含的生物就越少,生物之间的共同特征就越多。利用这种思想,谱系聚类首先将各样品自成一类,然后把最相似(距离最近或相似系数最大)的样品聚为小类,再将已聚合的小类按各类之间的相似性(用类间距离度量)进行再聚合,随着相似性的减弱,最后将一切子类都聚为一大类,从而得到一个按相似性大小聚结起来的一个谱系图。
聚类分析的基本思想是认为我们所研究的样本或指标(变量)之间存在着程度不同的相似性(亲疏关系)。于是根据一批样本的多个观测指标,具体找出一些彼此之间相似程度较大的样本(或指标)聚合为一类,把另外一些彼此之间相似程度较大的样本(或指标)又聚合为另一类,关系密切的聚合到一个小的分类单位,关系疏远的聚合到一个大的分类单位,直到把所有样本(或指标)都聚合完毕,把不同的类型一一划分出来,形成一个由小到大的分类系统。最后把整个分类系统画成一张谱系图,用它把所有样本(或指标)间的亲疏关系表示出来。这种方法是最常用的、最基本的一种,称为系统聚类分析。
类间距离
介绍两个类别之间的距离:
设dij表示两个样品xi,xj之间的距离,Gp,Gq分别表示两
个类别,各自含有np,nq个样品.
(1)最短距离:
用两类中样品之间的距离最短者作为两类间距离。
(2)最长距离
用两类中样品之间的距离最长者作为两类间距离
(3)类平均距离
用两类中所有两两样品之间距离的平均作为两类间距离。
(4)重心距离
用两类的重心之间的欧氏距离作为两类间的距离。
(5)离差平方和距离(ward)
显然,离差平方和距离与重心距离的平方成正比。
类间距离的递推公式
设有两类Gp,Gq合并成新的一类Gr,包含了nr=np+nq个样品。如何计算Gr与其他类别Gk之间的距离,这就需要建立类间距离的递推公式。
- 1.最短距离
- 2最长距离
- 3类平均距离
- 4重心距离
谱系聚类法的步骤
- 1选择样本间距离的定义及类间距离的定义
- 2计算n个样本两两之间的距离,得到距离矩阵。
- 3构造个类,每类只含有一个样本
- 4合并符合类间距离定义要求的两类为一个新类
- 5计算新类与当前各类的距离。若类的个数为1,则转到步骤6否则回到步骤4
- 6画出聚类图
- 7决定类的个数和类。
系统聚类分析的方法
- 系统聚类法的聚类原则决定于样本间的距离以及类间距离的定义。类间距离的不同定义就产生了不同的系统聚类分析方法。
- 以下用dij表示样品X(i)和X(j)之间的距离,当样品间的亲疏关系采用相似系数Cij时
- 以下用D(p,q)表示类Gp和Gq之间的距离。
- (1)n个样品开始作为n个类,计算两两之间的距离或者相似系数,得到实对称矩阵。
- (2)从D0的非主对角线上找最小(距离)或者最大元素(相似系数),设该元素是Dpq,则将Gp,Gq合并成一个新类Gr=(Gp,Gq),在D0中去掉Gp,Gq所在的两行、两列,并加上新类与其余各类之间的距离(或者相似系数),得到n-1阶矩阵D1.
- (3)从D1出发重复步骤(2)的做法得到D2,再由D2出发重复上述步骤,直到所有样品聚为一个大类为止。
- (4)在合并过程中要记下合并样品的编号及两类合并时的水平,并绘制聚类谱系图。
例4. 从例1算得的样品间的欧氏距离矩阵出发,用下列方法进行谱系聚类。
(1)最短距离,(2)最长距离
解:我们用1,2,3,4,5分别表示辽宁、浙江、河南、甘肃和青海,将距离矩阵记为D0
- (1)最短距离法:将各省看成一类,即Gi={i} i=1,…5,从D0可以看出各类中距离最短的是d43=2.20,因此将G3,G4在2.20水平上合成一个新类G6={3,4},计算G6和G1,G2,G5之间的最短距离,得到:
即将(3,4)作为单独一列,一行。将上述计算的结果作为第一列,从D0中去掉第3,4行与3,4列,剩余元素作为其余各列得到D1
然后从D1可以看出G5与G6中的距离最小,因此在2.21的水平上将G6与G5合成一类G7,即G7={3,4,5},计算G7与G1、G2之间的最短距离得到:
将计算结果作为第一列,从D1中划掉{3,4}与{5}所在的行和列,剩余元素作为其他列得到:
从D2中可以看出G1,G2最接近,在11.67的水平上合并成一类G8,至此只剩下G7,G8两类,他们之间的距离为:12.8,故在此水平将合成一类,包含了全部的五个省份。最后,作出谱系聚类图。
以2018年五一数学建模C题为例。
注意对数据的量化处理方式:
数据如下:
代码如下:
clc,clear
a=[3.248099862 1400.268343019 1595.279262 5950.668859 653.767546 388.6101631 0.357295727 18320.46154 0.000181229 83235.96118 11701.2957
0.313842461 159.444173537 177.7462234 662.2847022 70.01836837 42.60477173 0.342129003 20970 0.000008924 2628 771.0150925
0.466173300 257.271504590 265.1189989 1025.518975 94.97690194 61.78586048 0.323605467 21921.75 0.000022727 914 1642.154022
0.653314088 193.740207541 257.3170485 955.9373388 79.74565749 56.26133025 0.33415978 14504.66667 0.000012397 339 633.8301523
4.777377094 1890.965552478 2082.616795 8007.801239 932.9081486 558.0550182 0.327117741 16111.6 0.000016287 4840.373816 860.0313942
0.274618332 118.983750840 126.9446139 465.0666947 48.56818687 31.38656774 0.416476625 16795.5 0.000012747 3271 389.5885042
0.227587522 79.673939077 103.4399852 402.6383542 35.18759255 21.34329384 0.314754098 17450 0.000002348 887.733767 330.9389993
0.416676302 169.501844080 194.3978197 776.6916763 59.72942049 44.16420549 0.320140105 18562.5 0.000011300 8691.278086 591.0445205
0.275472987 115.688675169 138.2225522 546.2145303 39.05687346 31.59174764 0.341489362 19719 0.000010870 3565.464982 342.6701571
0.224227313 173.672287944 185.1560534 692.5092589 85.71248786 47.12613714 0.314630309 30815 0.000010066 2608.055401 1917.304038
0.642387833 366.064706442 402.7450517 1551.719929 240.1888106 118.1672418 0.227734688 24155.5 0.000023164 7151.532134 2759.019264
0.216517796 47.380797240 39.30549861 129.1619382 11.69526008 9.253392589 0.620879121 6030 0.000000266 648.8938883 19.44754811
0.212064205 72.389522219 68.70408516 275.8842798 18.86692494 14.42764848 0.304106548 13175 0.000001608 789.8 8.464149342
]
b=zscore(a);
b=zscore(a);
r=corrcoef(b)
d=tril(1-r);d=nonzeros(d)';
d=pdist(b','correlation');
z=linkage(d,'average')
h=dendrogram(z);
set(h,'Color','k','LineWidth',1.3)
T=cluster(z,'maxclust',6)
for i=1:6
tm=find(T==i);
tm=reshape(tm,1,length(tm));
fprintf('第%d类的有%s\n',i,int2str(tm));
end
得到聚类图如下:
问题二:综合评价
综合评价方法推荐秩和比综合评价法。比较好上手。
例题:为了研究辽宁等5省1991年城镇居民生活消费情况的分布规律,根据调查资料做类型分类,用最短距离做类间分类。数据如下:
- 将每一个省区视为一个样品,先计算5个省区之间的欧式距离,用D0表示距离矩阵。
因此将3.4合并成为一类,为类6,替代了3,4两类。类6与剩余1,2,5类之间的距离表示为:
得到新矩阵:
合并类6类5得到新类7
类7与剩余的1,2之间的距离分别为:
得到新矩阵:
合并类1和类2,得到新类8
此时,我们有两个不同的类:类7和类8。
它们的最近距离:
谱系聚类的matlab实现
- (1)输入数据矩阵,注意行和列的实际意义。
- (2)计算各样品之间的距离(行?列?)
欧氏距离:d=pdist(A) % 注意计算A中各行之间的距离;
绝对距离:d= pdist(A,‘cityblock’);
明氏距离:d=pdist(A,‘minkowski’,r); % r要填上具体的实数;
方差加权距离:d= pdist(A,‘seuclid’);
马氏距离:d= pdist(A,‘mahal’);
挑选里面最高大上的性价比最高的来用。
注意:以上命令输出的结果是一个行向量,如果要得到一个距离矩阵,可以用命令:
D= squareform(d),如果要得到三角阵命令: D= tril(squareform(d1)) - (3)选择不同的类间距离进行聚类。要清楚要什么才去选择。
最短距离:z1= linkage(d) % 此处及以下的d都是(2)中算出的距离行向量
最长距离:z2= linkage(d,‘complete’)
中间距离:z3= linkage(d,‘centroid’)
重心距离:z4= linkage(d,‘average’)
离差平方和:z5= linkage(d,‘ward’)
注意:此时输出的结果是一个n-1行3列的矩阵, 每一行表示在某水平上合并为一类的序号; - (4)作出谱系聚类图
H=dendrogram(z,d) % 注意若样本少于30,可以省去d,否则必须填写. - (5)根据分类数目,输出聚类结果
T=cluster(z,k) % 注意k是分类数目,z是(3)中的结果。Find(T==k0) % 找出属于第k0类的样品编号。
例题5:将例1 利用MATLAB软件进行聚类
解:b=[7.9 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.2 8.14 16.17 9.42 1.55 9.76
9.16 27.98 9.01 9.32 15.99 9.1 1.82 11.35
10.06 28.64 10.52 10.05 16.18 8.39 1.96 10.81];
欧氏距离:d1=pdist(b); %b中每行之间距离
% 五种类间距离聚类
z1=linkage(d1);
z2=linkage(d1,'complete');
z3=linkage(d1,'average');
z4=linkage(d1,'centroid');
z5=linkage(d1,'ward');
其中z1输出结果为:
z1 =
3.0000 4.0000 2.2033
6.0000 5.0000 2.2159
1.0000 2.0000 11.6726
8.0000 7.0000 12.7983
% 在2.2033的水平,G3,G4合成一类为G6
% 在2.2159的水平,G6,G5合成一类为G7
% 在11.6726的水平,G1,G2合成一类为G8
% 在12.7983的水平,G7,G8合成一类
作谱系聚类图:H= dendrogram(z1)
% 输出分类结果
T=cluster(z1,3)
结果表明:若分为三类,则辽宁是一类,浙江是一类,河南、青海和甘肃是另一类。
代码如下:
b=[7.9 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.2 8.14 16.17 9.42 1.55 9.76
9.16 27.98 9.01 9.32 15.99 9.1 1.82 11.35
10.06 28.64 10.52 10.05 16.18 8.39 1.96 10.81];
d1=pdist(b); %欧氏距离:b中每行之间距离
% 五种类间距离聚类
z1=linkage(d1);
z2=linkage(d1,'complete');
z3=linkage(d1,'average');
z4=linkage(d1,'centroid');
z5=linkage(d1,'ward');
H= dendrogram(z1) %作谱系聚类图
% 输出分类结果
T=cluster(z1,3)
% 结果表明:若分为三类,则辽宁是一类,浙江是一类,河南、青海和甘肃是另一类。
以上是样品之间是欧式距离,类间距离是最短距离聚类大的结果。
但是实际上呢。对样品之间的每一种距离,可以由五种不同的类间距离进行聚类。那么怎么去评测哪一种最好呢?
为此我们可以去计算复合相关系数,若该系数越接近于1,则该聚类越理想。计算命令如下:
R=cophenet(z,d)
其中,z 是用某种类间距离linkage后的结果,
d是样品之间的某种距离,想了解利用欧式距离聚类,哪种类间距离最好,可以计算五个复合相关系数,代码如下:
R=[cophenet(z1,d1),cophenet(z2,d1),
cophenet(z3,d1),cophenet(z4,d1),
cophenet(z5,d1)]
结果如下:
由结果可以看出,由于0.8623最大,所以认为若样品之间采用欧式距离,则类间距离以中间距离最好,如果我们要找到最理想的分类方法。可以对每一种样品之间的距离,都计算上述的复合相关系数,都计算上述的复合相关系数,这样就可以找到最理想的样品距离与对应的类间距离。
4.3 快速聚类法
快速聚类法又称为动态聚类法,该方法首先将样品进行粗糙分类,然后依据样品间的距离按一定规则进行调整,直至不能调整为止.该方法适用于样品数量较大的数据集的聚类分析,但是需要事先给定聚类数目,此数目对最终聚类结果有很大影响,实际应用时要选择多个数目进行分类,然后找出合理的分类结果.
4.3.1 快速聚类的步骤
聚点是一批有代表性的样品,他的选择决定了初始分类,并对最终分类有很大影响,选择聚点之前要先确定聚类数k.
② 首先按照亚非洲、美洲、欧洲、大洋洲分为四类,以每一类的均值向量作为聚点.
③ 最小最大准则(a为原始数据矩阵)
[m,n]=size(a);
for i=1:m
for j=1:m
d(i,j)=[a(i,:)-a(j,:)]*[a(i,:)-a(j,:)]‘; %欧氏距离平方
end
end
d1=max(d);
d2=sort(d1,'descend');
[d2,i1]=sort(d1,‘descend’); % i1前两位数字为初始聚点号码
d3=max(min(setdiff(d(:,i1(1)),0)),min(setdiff(d(:,i1(2)),0)));
t3=[find(d(:,i1(1))==d3),find(d(:,i1(2))==d3)];% c=[i1(1),i1(2),t3];
c1=setdiff([1:13]',c);
d4=max(min(d(c1,c)));
t4=[find(d(:,i1(1))==d4),find(d(:,i1(2))==d4),find(d(:,t3)==d4)];
由此得到:美国、南非、日本、德国
快速聚类的步骤
% 初始聚类
c2=setdiff(c1,t4);
c3=[i1(1),i1(2),t3,t4];
D=d(:,[i1(1),i1(2),t3,t4]);
[D1,J1]=sort(D,2);
for i=1:m
if D1(i)~=0
L1(i)=J1(i,1);
else
L1(i)=J1(i,2);
end
end
q1=find(L1==1);q2=find(L1==2);q3=find(L1==3);q4=find(L1==4);
G1=a([i1(1),q1],:)
G2=a(setdiff([i1(2),q2],[i1(1),q1]),:)
G3=a(setdiff([t3,q3],[i1(1),i1(2),q1,q2]),:)
G4=a(setdiff([t4,q4],[i1(1),i1(2),t3,q3]),:)
% 二次聚点与分类
m1=mean(G1);
m2=G2;
m3=mean(G3);
m4=mean(G4);
Q=dist([m1;m2;m3;m4],a');
F1=sort(Q);
[F1,U1]=sort(Q)
e1=find(U1(1,:)==1),
e2=find(U1(1,:)==2),
e3=find(U1(1,:)==3),
e4=find(U1(1,:)==4)
聚类结果如下:
巴西、印度、南非
类的个数的确定
由适当的阈值确定;
根据数据点的散布直观地确定类的个数;
根据统计量确定分类个数;
根据谱系图确定分类个数的准则:
- 各类重心间的距离必须很大;
- 类中保包含的元素不要太多;
- 类的个数必须符合实际应用;
- 如果采用几种不同的聚类方法处理,则在各种聚类图中应该发现相同的类。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)