聚类分析

出于将认识的对象按照一些特征进行分类的必要,聚类分析(cluster analyses)作为一种定量方法,将从数据分析的角度,给出一个更准确、细致的分类工具。

1 相似性的刻画

因为要对对象在数量的角度进行分类,所以要引入相似性的概念。相似的东西会被归为一类,这是自然的思想。如果对于一群有待分类的样本点需用$p$个变量描述,则每个样本点可以看成是$R^p$空间中的一个点。因此,很自然地想到可以用距离来度量样本点间的相似程度。

1.1 样本间的相似性度量

记$\Omega$是样本点集,距离$d(x,y)$是$\Omega\times\Omega\rightarrow R^+$的一个函数,满足条件:

  1. $d(x,y)\ge0,x,y\in\Omega$;

  2. $d(x,y)=0$ 当且仅当 $x=y$;

  3. $d(x,y)=d(y,x)$;

  4. $d(x,y)\le d(y,z)+d(x,z),x,y,z\in\Omega$.

即我们所知的正则性、对称性和三角不等式。在聚类分析中,对于定量变量最常用的是Minkowski距离

而其中最常用的是欧式距离。其优点是当坐标轴正交旋转时,欧氏距离保持不变。

要注意采用Minkowski距离时,要采用相同量纲的变量,否则若测量值变异范围悬殊时,建议先进行数据标准化。此外,还应避免变量的多重相关性。其造成的信息重叠会片面强调某些变量的重要性。由于这些缺点的存在,一个改进的距离就是马氏距离,定义如下:

$$
d( x,y ) =\sqrt{( x-y ) ^T\Sigma ^{-1}( x-y )}
$$

x,y来自p维总体Z的样本观测值,$\Sigma$是Z的协方差矩阵。实际中$\Sigma$往往不知道,需要用样本协方差估计。马氏距离对所有线性变换是不变的,因此不受量纲影响。

1.2 类与类间的相似性度量

如果有两个样本类$G_1,G_2$,可以用下面的方法测量距离:

  1. 最短距离法:

    $$
    D( G_1,G_2) =\underset{\begin{array}{c}
    x_i\in G_1\
    y_j\in G_2\
    \end{array}}{\min}{ d( x_i,y_j)}
    $$

  2. 最长距离法:

    即上面的min改成max.

  3. 重心法:

    $$
    D(G_1,G_2) =d(\bar{x},\bar{y})
    $$

  4. 类平均法

  5. 离差平方和法

2 系统聚类法

2.1 系统聚类法的功能和特点

生成聚类图的步骤:设$\Omega={w_1,w_2,…,w_n}$,

  1. 计算n个样本点两两之间的距离${d_{ij}}$,记为矩阵$D=(d_{ij})_{n\times n}$;

  2. 首先构造n 个类,每一个类中只包含一个样本点,每一类的平台高度均为零;

  3. 合并距离最近的两类为新类,并且以这两类间的距离值作为聚类图中的平台高度;

  4. 计算新类与当前各类的距离,若类的个数已经等于1,转入步骤5,否则,回到步骤3;

  5. 画聚类图;

  6. 决定类的个数和类。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
clc,clear 
a=[1,0;1,1;3,2;4,3;2,5];
[m,n]=size(a); %m为行指标,n为列指标
d=zeros(m,m);
for i=1:m
for j=i+1:m
d(i,j)=mandist(a(i,:),a(j,:)'); %曼哈顿距离
end
end
d %d即距离矩阵
nd=nonzeros(d);
nd=union(nd,nd) %把该向量中的重复元素删除
for i=1:m-1
nd_min=min(nd);
[row,col]=find(d==nd_min);tm=union(row,col);%tm用于记录某个样本点位置,删去重复元素,因为该矩阵为上三角
tm=reshape(tm,1,length(tm));%将tm转为行向量
s(i)={char(['第',int2str(i),'次合成,平台高度为',num2str(nd_min),'时将:',int2str(tm),'合成'])};
%上面大括号{}代表建立cell
nd(find(nd==nd_min))=[]; %每次合成完删除该高度
if length(nd)==0
break;
end
end
s(:) %输出最终结果。其实这个最终结果的可读性不是很好,但该算法的普适性比较好
%或者使用MATLAB统计工具箱的相关命令,编写如下程序:
% clc,clear
% a=[1,0;1,1;3,2;4,3;2,5];
% y=pdist(a,'cityblock');yc=squareform(y)
% z=linkage(y)
% [h,t]=dendrogram(z)

3 变量聚类法

如果在选取指标时,太过细致导致变量多而重叠度(相关度)过高,会给建模与数据分析带来很多不便。因此,人们常常希望能研究变量间的相似关系,按照变量的相似关系把它们聚合成若干类,进而找出影响系统的主要因素,比如主因子法等。

3.1 变量相似性度量

在对变量进行聚类分析时,首先要确定变量的相似性度量,常用的变量相似性度量有两种:

  1. 相关系数

  2. 夹角余弦

3.2 变量聚类法

类似于样本集合聚类分析中最常用的最短距离法、最长距离法等,变量聚类法采用了与系统聚类法相同的思路和过程。在变量聚类问题中,常用的有最大系数法、最小系数法等。

通过这样的操作就可以把一些距离近的变量归为一类,从而达到降维的效果。


4 案例分析

下表是1999 年中国省、自治区的城市规模结构特征的一些数据,以latex的代码形式呈现,要对其使用聚类分析来分类。

\begin{table}[htbp]
\centering
\caption{Add caption}
\begin{tabular}{cccccc}
省、自治区 & 城市规模 (万人) & 城市首位度 & 城市指数 & 基尼系数 & 城市规模中位 值(万人) \
京津冀 & 699.70 & 1.4371 & 0.9364 & 0.7804 & 10.880 \
山西 & 179.46 & 1.8982 & 1.0006 & 0.5870 & 11.780 \
内蒙古 & 111.13 & 1.4180 & 0.6772 & 0.5158 & 17.775 \
辽宁 & 389.60 & 1.9182 & 0.8541 & 0.5762 & 26.320 \
吉林 & 211.34 & 1.7880 & 1.0798 & 0.4569 & 19.705 \
黑龙江 & 259.00 & 2.3059 & 0.3417 & 0.5076 & 23.480 \
苏沪 & 923.19 & 3.7350 & 2.0572 & 0.6208 & 22.160 \
浙江 & 139.29 & 1.8712 & 0.8858 & 0.4536 & 12.670 \
安徽 & 102.78 & 1.2333 & 0.5326 & 0.3798 & 27.375 \
福建 & 108.50 & 1.7291 & 0.9325 & 0.4687 & 11.120 \
江西 & 129.20 & 3.2454 & 1.1935 & 0.4519 & 17.080 \
山东 & 173.35 & 1.0018 & 0.4296 & 0.4503 & 21.215 \
河南 & 151.54 & 1.4927 & 0.6775 & 0.4738 & 13.940 \
湖北 & 434.46 & 7.1328 & 2.4413 & 0.5282 & 19.190 \
湖南 & 139.29 & 2.3501 & 0.8360 & 0.4890 & 14.250 \
广东 & 336.54 & 3.5407 & 1.3863 & 0.4020 & 22.195 \
广西 & 96.12 & 1.2288 & 0.6382 & 0.5000 & 14.340 \
海南 & 45.43 & 2.1915 & 0.8648 & 0.4136 & 8.730 \
川渝 & 365.01 & 1.6801 & 1.1486 & 0.5720 & 18.615 \
云南 & 146.00 & 6.6333 & 2.3785 & 0.5359 & 12.250 \
贵州 & 136.22 & 2.8279 & 1.2918 & 0.5984 & 10.470 \
西藏 & 11.79 & 4.1514 & 1.1798 & 0.6118 & 7.315 \
陕西 & 244.04 & 5.1194 & 1.9682 & 0.6287 & 17.800 \
甘肃 & 145.49 & 4.7515 & 1.9366 & 0.5806 & 11.650 \
青海 & 61.36 & 8.2695 & 0.8598 & 0.8098 & 7.420 \
宁夏 & 47.60 & 1.5078 & 0.9587 & 0.4843 & 9.730 \
新疆 & 128.67 & 3.8535 & 1.6216 & 0.4901 & 14.470 \
\end{tabular}%
\label{tab:addlabel}%
\end{table}%

计算的MATLAB程序如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
%% 数据处理
clear;clc;close all;
data=xlsread('数据.xlsx','Sheet1','B2:F28');
[~,name]=xlsread('数据.xlsx','Sheet1','A2:A28');
[n,~]=size(data);
zs_data=zscore(data);%去中心化
distance_data=pdist(zs_data,"euclidean");%计算距离
D=squareform(distance_data);%生成距离矩阵

%% 系统聚类法
z=linkage(D,"average");%生成cluster树数据
figure(1);
[h,t]=dendrogram(z,"Labels",name,'ColorThreshold','default');

得到的聚类树如下:
color_tree

可以看到采用欧氏距离后产生的聚类树,宏观可以分成三类。