内容摘要:
本文详细解析聚类分析的核心方法,涵盖样本与类间相似性度量(欧氏距离、马氏距离、类平均法等)及层次聚类流程。通过销售员业绩案例,逐步演示MATLAB中 pdist
、linkage
、cluster
函数的实战应用,包括数据标准化、距离矩阵计算、聚类树生成与结果划分。结合代码示例与可视化解读,帮助读者掌握多维数据分群的核心技能。
关键词:聚类分析 相似性度量 层次聚类 MATLAB函数 距离矩阵
1. 聚类分析概述
聚类分析(Cluster Analysis)是一种无监督学习方法,旨在将数据集中的对象划分为若干组(簇),使得同一簇内的对象相似性较高,不同簇间差异显著。其核心步骤包括相似性度量与聚类算法设计。本节重点介绍样本与类间相似性度量方法,以及基于层次聚类的系统聚类法(Hierarchical Clustering),并结合MATLAB函数pdist
、linkage
、cluster
进行实战演示。
2. 相似性度量方法
方法 | 公式 | 特点 | 适用场景 |
---|---|---|---|
欧氏距离 | d ( x , y ) = ∑ k = 1 p ( x k − y k ) 2 d(x,y) = \sqrt{\sum_{k=1}^{p} (x_k - y_k)^2} d(x,y)=∑k=1p(xk−yk)2 | 对量纲敏感,需标准化;坐标旋转后距离不变。 | 空间直线距离计算 |
马氏距离 | d ( x , y ) = ( x − y ) T Σ − 1 ( x − y ) d(x,y) = \sqrt{(x-y)^T \Sigma^{-1}(x-y)} d(x,y)=(x−y)TΣ−1(x−y) | 解决变量相关性与量纲影响;计算复杂度高。 | 高相关性变量 |
绝对值距离 | d ( x , y ) = ∑ k = 1 p ∣ x k − y k ∣ d(x,y) = \sum_{k=1}^{p} |x_k - y_k| d(x,y)=∑k=1p∣xk−yk∣ | 适用于网格状路径数据(如城市街区)。 | 网格数据、城市街区距离 |
Chebyshev距离 | d ∞ ( x , y ) = max 1 ≤ k ≤ p ∣ x k − y k ∣ d_{\infty}(x,y) = \max_{1 \leq k \leq p} |x_k - y_k| d∞(x,y)=max1≤k≤p∣xk−yk∣ | 适用于棋盘距离计算。 | 棋盘距离、最大差异度量 |
最短距离法 | D ( G 1 , G 2 ) = min x i ∈ G 1 , y j ∈ G 2 d ( x i , y j ) D(G_1, G_2) = \min_{x_i \in G_1, y_j \in G_2} d(x_i, y_j) D(G1,G2)=minxi∈G1,yj∈G2d(xi,yj) | 易形成链状结构,对噪声敏感。 | 噪声较少的数据 |
最长距离法 | D ( G 1 , G 2 ) = max x i ∈ G 1 , y j ∈ G 2 d ( x i , y j ) D(G_1, G_2) = \max_{x_i \in G_1, y_j \in G_2} d(x_i, y_j) D(G1,G2)=maxxi∈G1,yj∈G2d(xi,yj) | 倾向于生成紧凑簇,抗噪声能力强。 | 噪声较多的数据 |
类平均法 | D ( G 1 , G 2 ) = 1 n 1 n 2 ∑ x i ∈ G 1 ∑ y j ∈ G 2 d ( x i , y j ) D(G_1, G_2) = \frac{1}{n_1 n_2} \sum_{x_i \in G_1} \sum_{y_j \in G_2} d(x_i, y_j) D(G1,G2)=n1n21∑xi∈G1∑yj∈G2d(xi,yj) | 平衡最短与最长距离,鲁棒性较好。 | 一般数据 |
Ward法 | D ( G 1 , G 2 ) = D 12 − D 1 − D 2 D(G_1, G_2) = D_{12} - D_1 - D_2 D(G1,G2)=D12−D1−D2 | 倾向于生成方差小的簇。 | 方差较小的簇 |
3. 系统聚类法(层次聚类)
3.1 算法流程
- 初始化:每个样本自成一类,计算距离矩阵 D D D。
- 迭代合并:
- 找到距离最小的两类 G p G_p Gp 和 G q G_q Gq,合并为新类 G r G_r Gr。
- 更新距离矩阵,重新计算 G r G_r Gr 与其他类的距离。
- 终止条件:所有样本聚为一类,生成聚类树(Dendrogram)。
3.2 MATLAB核心函数详解
函数 | 功能 | 语法 | 参数说明 | 输出 |
---|---|---|---|---|
pdist | 计算样本间距离 | Y = pdist(X, 'metric', '参数') | - X :
m
×
n
m \times n
m×n 数据矩阵,每行为一个样本。- 'metric' :距离类型,如 'euclidean' 、'cityblock' 。 | Y :长度为
(
m
−
1
)
⋅
m
/
2
(m-1)\cdot m/2
(m−1)⋅m/2 的距离向量。 |
linkage | 生成层次聚类树 | Z = linkage(Y, 'method') | - Y :pdist 输出的距离向量。- 'method' :类间距离方法,如 'single' 、'complete' 。 | Z :
(
m
−
1
)
×
3
(m-1) \times 3
(m−1)×3 矩阵,记录聚类过程。 |
cluster | 从聚类树中划分指定数量的簇 | T = cluster(Z, 'maxclust', K) | - Z :linkage 输出的聚类树。- 'maxclust', K :指定最终簇的数量
K
K
K。 | T :
m
×
1
m \times 1
m×1 向量,元素表示对应样本所属的簇编号。 |
dendrogram | 绘制聚类树 | dendrogram(Z) | - Z :linkage 输出的聚类树。 | 生成聚类树状图。 |
squareform | 将距离向量转换为方阵 | D = squareform(Y) | - Y :pdist 输出的距离向量。 | D :
m
×
m
m \times m
m×m 对称距离矩阵。 |
MATLAB核心函数示例
函数 | 示例代码 | 功能说明 |
---|---|---|
pdist | dist = pdist(data, 'cityblock'); | 计算数据矩阵 data 中样本间的绝对值距离。 |
linkage | Z = linkage(dist, 'average'); | 使用类平均法生成层次聚类树。 |
cluster | T = cluster(Z, 'maxclust', 3); | 将数据划分为3个簇。 |
dendrogram | dendrogram(Z); | 绘制聚类树状图。 |
squareform | dist_matrix = squareform(dist); | 将距离向量转换为对称距离矩阵。 |
3.3 完整案例:销售员业绩聚类
数据准备
5名销售员的销售业绩如下:
销售员 | 销售量(百件) | 回款额(万元) |
---|---|---|
w 1 w_1 w1 | 1 | 0 |
w 2 w_2 w2 | 1 | 1 |
w 3 w_3 w3 | 3 | 2 |
w 4 w_4 w4 | 4 | 3 |
w 5 w_5 w5 | 2 | 5 |
步骤详解
-
计算绝对值距离矩阵:
data = [1,0; 1,1; 3,2; 4,3; 2,5]; dist = pdist(data, 'cityblock'); % 绝对值距离 dist_matrix = squareform(dist); % 转换为方阵
输出距离矩阵:
[ 0 1 4 6 6 1 0 3 5 5 4 3 0 2 4 6 5 2 0 6 6 5 4 6 0 ] \begin{bmatrix} 0 & 1 & 4 & 6 & 6 \\ 1 & 0 & 3 & 5 & 5 \\ 4 & 3 & 0 & 2 & 4 \\ 6 & 5 & 2 & 0 & 6 \\ 6 & 5 & 4 & 6 & 0 \\ \end{bmatrix} 0146610355430246520665460 -
生成聚类树:
Z = linkage(dist, 'single'); % 最短距离法 dendrogram(Z); % 绘制聚类树
-
划分3个簇:
T = cluster(Z, 'maxclust', 3); disp(T'); % 输出:[1, 1, 2, 2, 3]
结果解读:
- 第1类: w 1 , w 2 w_1, w_2 w1,w2(业绩较差)
- 第2类: w 3 , w 4 w_3, w_4 w3,w4(业绩中等)
- 第3类: w 5 w_5 w5(业绩最佳)
4. 总结
- 相似性度量:欧氏、马氏距离适用于不同场景,需结合数据特性选择。
- 层次聚类流程:
pdist
→linkage
→dendrogram
→cluster
四步完成分析。 - MATLAB优势:函数简洁高效,支持多种距离与聚类方法,适合快速验证算法。
核心代码模板:
data = [样本数据矩阵];
dist = pdist(data, 'metric'); % 计算距离
Z = linkage(dist, 'method'); % 生成聚类树
dendrogram(Z); % 可视化
T = cluster(Z, 'maxclust', K); % 划分K个簇
掌握上述方法,可灵活应用于客户分群、图像分割、生物分类等场景,为数据分析提供有力支持。