1. 程式人生 > >使用Matlab完成層次聚類演算法(最小生成樹演算法)

使用Matlab完成層次聚類演算法(最小生成樹演算法)

最近要寫作業,涉及到一些聚類演算法。

關於聚類演算法的一些理論和定義,請參照部落格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);
end
Y=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的聚類結果分為了三類。具體理論上怎麼實現的,不太清楚,先挖個坑...