使用Matlab完成层次聚类算法(最小生成树算法)

来源:互联网 发布:中国期刊 数据库 编辑:程序博客网 时间:2024/06/07 07:09

最近要写作业,涉及到一些聚类算法。

关于聚类算法的一些理论和定义,请参照博客http://blog.sina.com.cn/s/blog_62f3c4ef01014uhe.html  和大传送术http://blog.csdn.net/a1b2c3d4123456/article/details/45966429 这两篇文章。

Matlab具体实现如下:

filename = 'C:\Users\zyfls\Desktop\ML\第七章聚类\chap_7_数据集.xlsx';A = xlsread(filename);for i=1:500    data(i,1)=A(i,1);    data(i,2)=A(i,2);endY=pdist(data,'euclidean');%计算欧式距离Y=squareform(Y);%转换成方阵Z=linkage(Y,'average');%参数为平均距离figure(1);dendrogram(Z,0);%可视化聚类树T=cluster(Z,3);%剪枝为三类figure(2);for i=1:500    data(i,3)=T(i);     if T(i)==1         plot(data(i,1),data(i,2),'r.');     else if T(i)==2             plot(data(i,1),data(i,2),'g.');         else T(i)==3             plot(data(i,1),data(i,2),'b.');         end     end     hold on;end

xlsx文件是500个点的点坐标。


源码中参数注释如下
%      'single'    --- nearest distance (default)%      'complete'  --- furthest distance%      'average'   --- unweighted average distance (UPGMA) (also known as%                      group average)%      'weighted'  --- weighted average distance (WPGMA)%      'centroid'  --- unweighted center of mass distance (UPGMC)%      'median'    --- weighted center of mass distance (WPGMC)%      'ward'      --- inner squared distance (min variance algorithm)

‘single’:最短距离法(默认);

‘complete’:最长距离法;

‘average’:未加权平均距离法;

‘weighted’: 加权平均法;

‘centroid’:质心距离法; 

‘median’:加权质心距离法;

‘ward’:内平方距离法(最小方差算法)

此代码使用average参数完成聚类,聚类效果如下:


聚类树效果如下:


另附single(最短距离)聚类参数效果如下:


weighted(加权距离)聚类参数效果如下:





其中方阵Y是得到任意两点之间的欧式距离:

接下来Z=linkage(Y,'average');生成聚类树,简单说就是先找距离最近的两点,将其归为一类,接下来将这两个点看作一个点继续与其它点比较,从中再找最近的两点,最后归为一类。

总结,通过得到的聚类树可以知道,最终会生成一个根节点,也就是聚类成为了一类,但是大多数情况下,我们会将其划分为多类。对于这个例子来说,是分为三类。

所以要对聚类树进行剪枝(我也不知道这是不是叫剪枝,觉得这个操作非常符合剪枝这个动作)。


代码中T=cluster(Z,3)完成了将Z的聚类结果分为了三类。具体理论上怎么实现的,不太清楚,先挖个坑...





原创粉丝点击