系统聚类(Hierarchical Clustering)是一种用于对数据进行聚类的方法,也叫层次聚类,其主要特点是通过构建层次结构的树形图(树状图或树状结构)来表示数据点之间的关系。这种层次结构可以是自上而下的划分(分裂),也可以是自下而上的合并。系统聚类方法不需要预先设定聚类的数量,而是通过构建层次结构树,形成不同层次的聚类。
系统聚类的基本思想是:
1. **开始阶段:** 将每个数据点视为一个独立的簇。
2. **迭代过程:** 通过计算数据点之间的相似性或距离,合并或分裂簇,形成新的簇。
3. **层次结构的构建:** 通过反复迭代,建立层次结构,形成树状图。
4. **划分聚类:** 可以通过设定阈值,将层次结构树划分为不同层次的簇。
系统聚类可以分为两大类:
1. **凝聚性聚类(Agglomerative Clustering):** 从底层开始,逐渐合并相似的数据点或簇,形成一个大的簇。这是一种自下而上的合并过程。
2. **分裂性聚类(Divisive Clustering):** 从顶层开始,逐渐分裂簇,形成小的簇。这是一种自上而下的划分过程。
系统聚类的常见距离度量包括欧氏距离、曼哈顿距离、切比雪夫距离等。合并或分裂的策略可以基于最小距离、最大距离、平均距离等。
系统聚类的优势在于它不需要事先确定聚类的数量,并且可以通过层次结构图直观地展示不同层次的聚类结果。然而,由于其计算复杂度较高,对于大规模数据集可能效率较低。另外,系统聚类对初始簇的选择敏感,因此可能受到初始条件的影响。
MATLAB的代码实现如下:
clc, clear, close all
a=load('anli10_1.txt');
b=zscore(a); %数据标准化
r=corrcoef(b) %计算相关系数矩阵
%d=tril(1-r); d=nonzeros(d)'; %另外一种计算距离方法
z=linkage(b','average','correlation'); %按类平均法聚类
h=dendrogram(z); %画聚类图
set(h,'Color','k','LineWidth',1.3) %把聚类图线的颜色改成黑色,线宽加粗
T=cluster(z,'maxclust',6) %把变量划分成6类
for i=1:6
tm=find(T==i); %求第i类的对象
fprintf('第%d类的有%s\n',i,int2str(tm')); %显示分类结果
end
结果如下:
clc,clear, close all
a = load('anli10_1.txt');
a(:,[3:6])=[]; %删除数据矩阵的第3列~第6列,即使用变量1,2,7,8,9,10
b=zscore(a); %数据标准化
z=linkage(b,'average'); %按类平均法聚类
h=dendrogram(z); %画聚类图
set(h,'Color','k','LineWidth',1.3) %把聚类图线的颜色改成黑色,线宽加粗
for k=3:5
fprintf('划分成%d类的结果如下:\n',k)
T=cluster(z,'maxclust',k); %把样本点划分成k类
for i=1:k
tm=find(T==i); %求第i类的对象
fprintf('第%d类的有%s\n',i,int2str(tm')); %显示分类结果
end
fprintf('**********************************\n');
end