聚类分析.docx
- 文档编号:6190426
- 上传时间:2023-01-04
- 格式:DOCX
- 页数:19
- 大小:111.53KB
聚类分析.docx
《聚类分析.docx》由会员分享,可在线阅读,更多相关《聚类分析.docx(19页珍藏版)》请在冰豆网上搜索。
聚类分析
聚类分析
在实际工作中,我们经常遇到分类问题.若事先已经建立类别,则使用判别分析,若事先没有建立类别,则使用聚类分析.
聚类分析主要是研究在事先没有分类的情况下,如何将样本归类的方法.聚类分析的内容包含十分广泛,有系统聚类法、动态聚类法、分裂法、最优分割法、模糊聚类法、图论聚类法、聚类预报等多种方法.
聚类分析指将物理或抽象对象的集合分组成为由类似的对象组成的多个类的分析过程。
它是一种重要的人类行为。
聚类分析的目标就是在相似的基础上收集数据来分类。
聚类源于很多领域,包括数学,计算机科学,统计学,生物学和经济学。
在不同的应用领域,很多聚类技术都得到了发展,这些技术方法被用作描述数据,衡量不同数据源间的相似性,以及把数据源分类到不同的簇中。
聚类与分类的不同在于,聚类所要求划分的类是未知的。
聚类是将数据分类到不同的类或者簇这样的一个过程,所以同一个簇中的对象有很大的相似性,而不同簇间的对象有很大的相异性。
从统计学的观点看,聚类分析是通过数据建模简化数据的一种方法。
§9.1聚类分析基本知识介绍
在MATLAB软件包中,主要使用的是系统聚类法.
系统聚类法是聚类分析中应用最为广泛的一种方法.它的基本原理是:
首先将一定数量的样品(或指标)各自看成一类,然后根据样品(或指标)的亲疏程度,将亲疏程度最高的两类合并,然后重复进行,直到所有的样品都合成一类。
衡量亲疏程度的指标有两类:
距离、相似系数.
一、常用距离
1)欧氏距离
假设有两个
维样本
和
,则它们的欧氏距离为
3)马氏距离
假设共有
个指标,第
个指标共测得
个数据(要求
):
,
于是,我们得到
阶的数据矩阵
,每一行是一个样本数据.
阶数据矩阵
的
阶协方差矩阵记做
。
两个
维样本
和
的马氏距离如下:
马氏距离考虑了各个指标量纲的标准化,是对其它几种距离的改进.马氏距离不仅排除了量纲的影响,而且合理考虑了指标的相关性.
4)布洛克距离
两个
维样本
和
的布洛克距离如下:
5)闵可夫斯基距离
两个
维样本
和
的闵可夫斯基距离如下:
注:
时是布洛克距离;
时是欧氏距离.
6)余弦距离
这是受相似性几何原理启发而产生的一种标准,在识别图像和文字时,常用夹角余弦为标准.
7)相似距离
二、MATLAB中常用的计算距离的函数
假设我们有
阶数据矩阵
,每一行是一个样本数据.在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.2
3.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聚类分析示例
层次聚类法(HierarchicalClustering)的计算步骤:
①计算n个样本两两间的距离{dij},记D
②构造n个类,每个类只包含一个样本;
③合并距离最近的两类为一新类;
④计算新类与当前各类的距离;若类的个数等于1,转到5);否则回3);
⑤画聚类图;
⑥决定类的个数和类;
例1在MATLAB中写一个名为opt_linkage_1的M文件:
x=[31.7;11;23;22.5;1.21;1.11.5;31];%每行一个样本
y=pdist(x,'mahal');每两个样本的马氏距离,1-2…1-72-32-4….
yy=squareform(y)%,样本点之间的距离用矩阵的形式输出
z=linkage(y,'centroid');%用重心距离法创建系统聚类树
h=dendrogram(z)%Plotdendrogramgraphs画树状图
存盘后按F5键执行,得到结果如下:
yy=
02.38792.19831.69462.16842.22840.8895
2.387902.60972.06160.23780.62552.3778
2.19832.609700.63532.55222.01532.9890
1.69462.06160.635301.97501.51062.4172
2.16840.23782.55221.975000.66662.1400
2.22840.62552.01531.51060.666602.4517
0.88952.37782.98902.41722.14002.45170
z=
2.00005.00000.2378
6.00008.00000.6353
3.00004.00000.6353
1.00007.00000.8895
9.000010.00002.1063
11.000012.00002.0117
按重心距离法得到的系统聚类树为
其中:
h=dendrogram(z)表示输出聚类树形图的冰状图.
一、根据系统聚类树创建聚类
假设已经求出系统聚类树z,我们根据z来创建聚类,使用cluster函数.
(1)确定对象(实际上就是数据集中的每个数据点)之间的相似性,实际上就是定义一个表征对象之间差异的距离,例如最简单的平面上点的聚类中,最经常使用的就是欧几里得距离。
这在MATLAB中可以通过Y=pdist(X)实现,例如
>>X=randn(6,2)
X=
-0.43261.1892
-1.6656-0.0376
0.12530.3273
0.28770.1746
-1.1465-0.1867
1.19090.7258
>>plot(X(:
1),X(:
2),'bo')%给个图,将来对照聚类结果
>>Y=pdist(X)
Y=
Columns1through14
1.73941.02671.24421.55011.68831.82771.96480.5401
2.95680.22281.37171.13771.47901.0581
Column15
2.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转换成方阵形式,方阵中位置的数值就是X中第i和第j点之间的距离,显然这个方阵应该是个对角元素为0的对称阵。
>>squareform(Y)
ans=
01.73941.02671.24421.55011.6883
1.739401.82771.96480.54012.9568
1.02671.827700.22281.37171.1377
1.24421.96480.222801.47901.0581
1.55010.54011.37171.479002.5092
1.68832.95681.13771.05812.50920
这里需要注意的是,pdist可以使用多种参数,指定不同的距离算法。
helppdist。
另外,当数据规模很大时,可以想象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.00000.2228
2.00005.00000.5401
1.00007.00001.0267
6.00009.00001.0581
8.000010.00001.3717
对于M个元素的X,前面说了Y是1行M*(M-1)/2的行向量,Z则是(M-1)*3的矩阵。
Z数组的前两列是索引下标列,最后一列是距离列。
例如上例中表示在产生聚类树的计算过程中,第3和第4点先聚成一类,他们之间的距离是0.2228,以此类推。
要注意的是,为了标记每一个节点,需要给新产生的聚类也安排一个标识,MATLAB中会将新产生的聚类依次用M+1,M+2,....依次来标识。
比如第3和第4点聚成的类以后就用7来标识,第2和第5点聚成的类用8来标识,依次类推。
通过linkage函数计算之后,实际上二叉树式的聚类已经完成了。
Z这个数据数组不太好看,可以用dendrogram(Z)来可视化聚类树。
可以看到,产生的聚类树的每一层都是一个倒置的U型(或者说是个n型,~~),纵轴高度代表了当前聚类中两个子节点之间的距离。
横轴上标记出了各个数据点索引下标。
稍微注意以下的是,dendrogram默认最多画30个最底层节点,当然可是设置参数改变这个限制,比如dendrogram(Z,0)就会把所有数据点索引下标都标出来,但对于成千上万的数据集合,这样的结果必然是图形下方非常拥挤。
看你的应用目的了,随你玩~
(3)初步的聚类树画完后,还要做很多后期工作的,包括这样的聚类是不是可靠,是不是代表了实际的对象分化模式,对于具体的应用,应该怎样认识这个完全版的聚类树,产生具有较少分叉的可供决策参考的分类结果呢?
这都是需要考虑的。
MATLAB中提供了cluster,clusterdata,cophenet,inconsistent等相关函数。
cluster用于剪裁完全版的聚类树,产生具有一定cutoff的可用于参考的树。
clusterdata可以认为是pdist,linkage,cluster的综合,当然更简易一点。
cophenet和inconsistent用来计算某些系数,前者用于检验一定算法下产生的二叉聚类树和实际情况的相符程度(就是检测二叉聚类树中各元素间的距离和pdist计算产生的实际的距离之间有多大的相关性),inconsistent则是量化某个层次的聚类上的节点间的差异性(可用于作为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=
3
1
2
2
1
1
3
即第1、第7样本点为第3类,第2、第5、第6样本点为第1类,第3、第4样本点为第2类.
例
设某地区有八个观测点的数据,样本距离矩阵如表1所示,根据最短距离法聚类分析。
%最短距离法系统聚类分析
X=[7.9039.778.4912.9419.2711.052.0413.29;
7.6850.3711.3513.319.2514.592.7514.87;
9.4227.938.208.1416.179.421.559.76;
9.1627.989.019.3215.999.101.8211.35;
10.0628.6410.5210.0516.188.391.9610.81];
BX=zscore(X);%标准化数据矩阵
Y=pdist(X)%用欧氏距离计算两两之间的距离
D=squareform(Y)%欧氏距离矩阵
Z=linkage(Y)%最短距离法
T=cluster(Z,3)等价于{T=clusterdata(X,3)}
find(T==3)%第3类集合中的元素
[H,T]=dendrogram(Z)%画聚类图
聚类谱系图如图1所示:
图1聚类谱系图
二、根据原始数据创建分类
在MATLAB软件包中,内部函数clusterdata对原始数据创建分类,格式有两种:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 聚类分析
![提示](https://static.bdocx.com/images/bang_tan.gif)