(MATLAB)层次聚类

前言

参考书:
齐敏《模式识别导论》

参考:
论坛

代码

close all;
clear all;
clc;

m=4;
n=2;
X=randn(m,n);              %产生一个m*n的随机项矩阵,这里用4*2矩阵,数据量较小

Y=pdist(X);                  % 计算 X 中各对行向量的相互距离,得到的Y为行向量
%Y									%进行查看
y=squareform(Y)				%转换为方阵更易于观察		
							
% z=linkage(y)
%dendrogram(z)
Z=linkage(Y);                %产生层次聚类树
dendrogram(Z)             %可视化层次聚类树
Z   				%Z是一个(m-1)*3的矩阵,Z数组的前两列是索引下标列,最后一列是距离列

效果图如下:
其中,横坐标为index,纵坐标为距离。比如,图中2号和4号的距离为1.0228。

效果图
打印出来的:

在这里插入图片描述
分析:

对于上面图中的y,其元素表示的是距离。比如第一行中,第一行第一列的0表示1号到1号的距离,第一行第二列的2.7916可以表示1号到2号的距离,第一行第三列的1.5193是1号到3号的距离,以此类推。

根据层次聚类的原理,按照输出数据y算一下。先要找出y中非0的最小值。在矩阵y中是1.0228,位于第四行第二列,表示2号和4号的距离。因此先要将2号和4号合并起来归为一类,标记为(m+1)号,即5号。之后更新1、3、5号之间的距离,1、3号之间的距离不变,在更新和5号之间的距离时,取最小的数值。这里在算1、5号之间的距离时,5号里面有2号和4号,1号和2、4号的距离分别是2.7916、2.3258,因此取较小的2.3258;同理,3和5号的距离取1.2027。得到以下几个数值:1.5193(1、3的距离),2.3258(1、5的距离),1.2027(3、5的距离),之后再找这几个数值中的最小值,min=1.2027,因此将3、5号聚为一类,即为6号。之后再更新距离,此时只剩下1和6号,算出二者的距离即可,为1.5193。

正如前面代码中所提到的,Z是一个(m-1) x 3的矩阵,由于设定的m为4,故这里Z是一个3 x 3的矩阵,Z数组的前两列是索引下标列,最后一列是距离列。从矩阵Z或者图可以得知,第一次是将2号和4号进行合并,二者的距离是1.0228。第二次是将3号和5号进行聚类,距离1.2027。第三次是剩下的1号和6号进行聚类,距离1.5193,符合推断。

发布了28 篇原创文章 · 获赞 12 · 访问量 4142

猜你喜欢

转载自blog.csdn.net/sf9898/article/details/104145037