实验题目

给出六个民族的出生死亡率,和他们的平均寿命,如下表所示

出生死亡率(%)

平均寿命

1

5.80

70.59

2

7.44

67.14

3

8.11

65.48

4

10.21

58.88

5

9.51

59.88

6

9.81

60.47

MATLAB代码

%聚类分析
%步骤
%1.样本标准化
%2.计算各个样本之间的距离
%3.选择合适的方式聚类
clc
clear all
close all
X = [5.80  70.59
     7.44  67.14
     8.11  65.48
     10.21 58.88
     9.51  59.24
     9.81  60.47
    ];
figure;
plot (X(:,1),X(:,2),'ro','MarkerSize',8,'LineWidth',1);
xlabel('x(1)')
ylabel('x(2)')
title('原始数据')
grid on
figure
Xn = zscore(X);%标准化
Y = pdist(Xn,'euclidean');%求距离
squareform(Y)%方便查看
Z = linkage(Y,'single');%类
dendrogram(Z);%画图
xlabel('样本')
ylabel('类间距离')
title('层次聚类分析')

代码分析

zscore ():这是一个归一化的函数,是用原始数据的均值和方差来进行归一化的,可把原始数据归一化为均值为0、方差1的数据,称为z—score 标准化。这是进行聚类的重要一步,我对其的理解就是不同特征之间的量纲可能相差很大,在进行不同数据之间的距离计算时,量纲大的权重较大,一些量纲较小的可能会被忽略掉,为了避免这种情况,所以要进行归一化。其它的归一化函数还有最大最小标准化等。

pdist(): 这个函数是为了进行数据之间求距离的,输入为数组及以何种方式求距离,方式主要有欧式距离、马氏距离、曼哈顿距离、切比雪夫距离、绝对值距离,输出为每两个数据之间的距离。这一步是为了聚类做准备。本文选择的输入方式为Y = pdist(X,Distance)。

method有以下几种:

'euclidean':欧几里德距离(默认)。

'squaredeuclidean':平方欧氏距离

'seuclidean':标准化欧氏距离

'mahalanobis':Mahalanobis

'cityblock':城市街区距离。

'minkowski':明考斯基距离

'chebychev':切比切夫距离

'hamming':Hamming距离

squareform():为了方便展示个个数据之间的距离,输出为一个矩阵,例如矩阵中的位置(1,2)为第1个数据和第二个数据之间的距离。

linkage():是用指定的方法来进行层次聚类,pdist()是计算两个样本之间的距离,linkage()是用指定的方法来算类与类之间的距离,然后把距离最近的化为一个新类,在计算新类与其它类的距离,再把距离最近的化为一个新类,重复以上操作直至只有一个类。本文选择的输入方式为 Z = linkage(X,method) 。

method有以下几种:

Single:最短距离

Complete:最大距离

Average:平均距离

Centroid:重心距离

Ward:离差平方和

dendrogram():是把linkage()生成的数据画成树状图。

cluster():是根据linkage()创建分类。

不同层次聚类方法得到的实验结果图

(1)重心法

得到的树状图如图1所示

为什么用聚类算法运行时间这么长 MATLAB_层次聚类

图1重心法

(2)最短距离法

为什么用聚类算法运行时间这么长 MATLAB_matlab_02

图2最短距离法

(3)最长距离法

为什么用聚类算法运行时间这么长 MATLAB_归一化_03

图3.最长距离法

(4)类平均法

为什么用聚类算法运行时间这么长 MATLAB_层次聚类_04

图4.类平均法

(5)离差平方和法

为什么用聚类算法运行时间这么长 MATLAB_matlab_05

图5.离差平方和法

 以上5组实验样本之间求距离的方式均为欧式距离,于是我有做了一组绝对值距离的实验,层次聚类的方法为最大距离法。实验结果如图6所示

为什么用聚类算法运行时间这么长 MATLAB_数据_06

图6.绝对值距离

实验总结

通过本次课程及实验,我对层次聚类的概念的理解不再是迷茫模糊了,而是能够对一些简单的数据进行层次聚类了,下面我以实验中的最短距离法实验为基础来阐述如何进行层次聚类。

(1)首先,得到数据后应进行数据的归一化。这是为了消除由与不同特征之间数量级相差过大的影响。就如同本实验的数据一样,出生率基本都在10以内,平均寿命基本都大于50,当去除归一化函数后得到的结果如图7所示,4和5被划为了一类,而不是其他实验的5和6为一类。这是应为4与5平均寿命的差值小于5和6的差值,平均寿命的数量级大,其在计算距离时的权重也大。这才相差一个数量级,如果数量级相差过大,那么小数量级的特征将会不起作用,分出类的可靠性也会降低。

为什么用聚类算法运行时间这么长 MATLAB_聚类_07

图7.没有进行归一化的分类结果

(2)算出不同数据之间的距离。样本之间距离的计算方法有好几种,应该根据样本的特征选择合适的方法。最短距离法实验中各样本的距离如下图8所示(数组表示,(1,5)表示1和5之间的距离。)

为什么用聚类算法运行时间这么长 MATLAB_聚类_08

图8.各个样本之间的距离

(3)先把每个数据当成一个类,把距离最近的两个类化为一个新类,计算该新类由其他类之间的距离。根据图8可以看出样本5和6之间的距离最近所以把5,6归为一新类7。由于层次聚类方法为最小距离法,所以类1,2,3,4和新类7之间的距离取它们各自内部的样本与5,6距离的最近值,即它们与7之间的距离分别为3.1728,1.9728,1.4484,0.4065。

(4)再把距离最近的两类归为一个新类,再计算新类与其他类之间的距离。再加入新类7后,类1,2,3,4,7之间最近的距离为4,7之间的距离,所以4,7化为新类8。根据最小距离法,类1,2,3与8之间的距离分别为3.1728,1.9728,1.4484。

(5)重复步骤(4),直至所有样本归为一个类。类1,2,3,8,之间距离最近的为2,3之间的距离0.5259,所以2,3划为新类9。根据最小距离法,类1,8与9之间的距离分别为1.2077,1.4484。而1,8之间的距离为3.1728,所以1,9划为新类10。8和10之间的距离为1.4484,它们再归为新类11,至此,所有样本归为一类,聚类结束。MATLAB中聚类过程如下图9所示,与我说的过程一致。

为什么用聚类算法运行时间这么长 MATLAB_聚类_09

图9. MATLAB中聚类过程