接上一篇文章:【matlab数学建模学习】day8
层次聚类
-
算法原理
- 凝聚型的层次聚类(AGENES):自底而上。首先将每个对象作为一个簇,然后将这些原子簇合并成越来越大的簇,直到所有对象都在一个簇中,或者某个终结条件被达到要求。
- 分裂型的层次聚类(DIANA):自顶而下。首先将所有对象放在一个簇中,然后慢慢细分为越来越小的簇,直到每个对象自行形成一簇,或者满足其他终结条件。
-
算法步骤 输入:K(目标类簇数)、D(样本点集合); 输出:K个类簇集合 AGENES:
- 将D中每个样本点当作其类簇;
- 重复第1步;
- 找到分属两个不同类簇,且距离最近的样本对;
- 将两个类簇合并;
- util类簇数=K。
DIANA:
- 将D中所有样本点归并成类簇;
- 重复第1步;
- 在同类簇中找到距离最远的样本点对;
- 以该样本点对为代表,将原类簇中的样本点重新分属到新类簇;
- util类簇数=K。
-
应用实践 %% 层次聚类
dist_h = 'spearman';
link = 'weighted';
hidx = clusterdata(bonds, 'maxclust', numClust, 'distance' , dist_h, 'linkage', link);
%绘制聚类效果图
figure
F2 = plot3(VX(hidx==1,1), VX(hidx==1,2),VX(hidx==1,3),'r*', ...
VX(hidx==2,1), VX(hidx==2,2),VX(hidx==2,3), 'bo', ...
VX(hidx==3,1), VX(hidx==3,2),VX(hidx==3,3), 'kd');
set(gca,'linewidth',2);
grid on
set(F2,'linewidth',2, 'MarkerSize',8);
set(gca,'linewidth',2);
xlabel('票面利率','fontsize',12);
ylabel('评级得分','fontsize',12);
zlabel('到期收益率','fontsize',12);
title('层次聚类方法聚类结果')
% 评估各类别的相关程度
dist_metric_h = pdist(bonds,dist_h);
dd_h = squareform(dist_metric_h);
[~,idx] = sort(hidx);
dd_h = dd_h(idx,idx);
figure
imagesc(dd_h)
set(gca,'linewidth',2);
xlabel('数据点', 'fontsize',12)
ylabel('数据点', 'fontsize',12)
title('层次聚类结果相关程度图')
ylabel(colorbar,['距离矩阵:', dist_h])
axis square
% 计算同型相关系数
Z = linkage(dist_metric_h,link);
cpcc = cophenet(Z,dist_metric_h);
disp('同型相关系数: ')
disp(cpcc)
% 层次结构图
set(0,'RecursionLimit',5000)
figure
dendrogram(Z)
set(gca,'linewidth',2);
set(0,'RecursionLimit',500)
xlabel('数据点', 'fontsize',12)
ylabel ('标准距离', 'fontsize',12)
title('层次聚类法层次结构图')
同型相关系数:
0.8804
cophenet 函数得到描述聚类树信息与原始数据距离之间相关性的同表象相关系数,这个值越大越好。
?
-
算法总结
- 对于复杂数据,聚类的终止条件(单个数量和阈值)很难判定。
- 包容能力弱,若在某阶段没有选择合成或分裂的决策,就会导致质量不高的聚类结果。
- 使用距离矩阵,导致时间和空间复杂度都很高,几乎无法适用于大数据集。
- 只处理符合某静态模型的簇,忽略了不同簇间的信息,忽略了簇间的互连性和近似度。
|