实验题目
给出六个民族的出生死亡率,和他们的平均寿命,如下表所示
出生死亡率(%) | 平均寿命 | |
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所示
图1重心法
(2)最短距离法
图2最短距离法
(3)最长距离法
图3.最长距离法
(4)类平均法
图4.类平均法
(5)离差平方和法
图5.离差平方和法
以上5组实验样本之间求距离的方式均为欧式距离,于是我有做了一组绝对值距离的实验,层次聚类的方法为最大距离法。实验结果如图6所示
图6.绝对值距离
实验总结
通过本次课程及实验,我对层次聚类的概念的理解不再是迷茫模糊了,而是能够对一些简单的数据进行层次聚类了,下面我以实验中的最短距离法实验为基础来阐述如何进行层次聚类。
(1)首先,得到数据后应进行数据的归一化。这是为了消除由与不同特征之间数量级相差过大的影响。就如同本实验的数据一样,出生率基本都在10以内,平均寿命基本都大于50,当去除归一化函数后得到的结果如图7所示,4和5被划为了一类,而不是其他实验的5和6为一类。这是应为4与5平均寿命的差值小于5和6的差值,平均寿命的数量级大,其在计算距离时的权重也大。这才相差一个数量级,如果数量级相差过大,那么小数量级的特征将会不起作用,分出类的可靠性也会降低。
图7.没有进行归一化的分类结果
(2)算出不同数据之间的距离。样本之间距离的计算方法有好几种,应该根据样本的特征选择合适的方法。最短距离法实验中各样本的距离如下图8所示(数组表示,(1,5)表示1和5之间的距离。)
图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所示,与我说的过程一致。
图9. MATLAB中聚类过程