1. 程式人生 > >matlab做聚類分析

matlab做聚類分析

MATLAB的統計工具箱中的多元統計分析中提供了聚類分析的兩種方法:
1.層次聚類 hierarchical clustering

2.k-means聚類

這裡用最簡單的例項說明以下層次聚類原理和應用發法。

層次聚類是基於距離的聚類方法,MATLAB中通過pdist、linkage、dendrogram、cluster等函式

來完成。層次聚類的過程可以分這麼幾步:

(1) 確定物件(實際上就是資料集中的每個資料點)之間的相似性,實際上就是定義一個表徵對

象之間差異的距離,例如最簡單的平面上點的聚類中,最經常使用的就是歐幾里得距離。

這在MATLAB中可以通過Y=pdist(X)實現,例如
>> X=randn(6,2)
X =
    -0.4326     1.1892
    -1.6656    -0.0376
     0.1253     0.3273
     0.2877     0.1746
    -1.1465    -0.1867
     1.1909     0.7258
>> plot(X(:,1),X(:,2),'bo')    %給個圖,將來對照聚類結果把

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~圖1~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

>> Y=pdist(X)
Y =
   Columns 1 through 14
     1.7394     1.0267     1.2442     1.5501     1.6883     1.8277     1.9648     0.5401    

2.9568     0.2228     1.3717     1.1377     1.4790     1.0581
   Column 15
     2.5092
例子中X資料集可以看作包含6個平面資料點,pdist之後的Y是一個行向量,15個元素分別代表X

的第1點與2-6點、第2點與3-6點,......這樣的距離。那麼對於M個點的資料集X,pdist之後的Y

將是具有M*(M-1)/2個元素的行向量。Y這樣的顯示雖然節省了記憶體空間,但對使用者來說不是很易

懂,如果需要對這些距離進行特定操作的話,也不太好索引。MATLAB中可以用squareform把Y轉

換成方陣形式,方陣中<i,j>位置的數值就是X中第i和第j點之間的距離,顯然這個方陣應該是

個對角元素為0的對稱陣。
>> squareform(Y)
ans =
          0     1.7394     1.0267     1.2442     1.5501     1.6883
     1.7394          0     1.8277     1.9648     0.5401     2.9568
     1.0267     1.8277          0     0.2228     1.3717     1.1377
     1.2442     1.9648     0.2228          0     1.4790     1.0581
     1.5501     0.5401     1.3717     1.4790          0     2.5092
     1.6883     2.9568     1.1377     1.0581     2.5092          0
這裡需要注意的是,pdist可以使用多種引數,指定不同的距離演算法。help pdist把。
另外,當資料規模很大時,可以想象pdist產生的Y佔用記憶體將是很嚇人的,比如X有10k個數據點

,那麼X佔10k*8*2Bytes=160K,這看起來不算啥,但是pdist後的Y會有10k*10k/2*8Bytes=400M

。怕了把,所以,廢話說在前面,用MATLAB的層次聚類來處理大規模資料,大概是很不合適的。
(2) 確定好了物件間的差異度(距離)後,就可以用Z=linkage(Y)來產生層次聚類樹了。
>> Z=linkage(Y)
Z =
     3.0000     4.0000     0.2228
     2.0000     5.0000     0.5401
     1.0000     7.0000     1.0267
     6.0000     9.0000     1.0581
     8.0000    10.0000     1.3717
對於M個元素的X,前面說了Y是1行M*(M-1)/2的行向量,Z則是(M-1)*3的矩陣。
Z陣列的前兩列是索引下標列,最後一列是距離列。例如上例中表示在產生聚類樹的計算過程中

,第3和第4點先聚成一類,他們之間的距離是0.2228,以此類推。要注意的是,為了標記每一個

節點,需要給新產生的聚類也安排一個標識,MATLAB中會將新產生的聚類依次用M+1,M+2,....依

次來標識。比如第3和第4點聚成的類以後就用7來標識,第2和第5點聚成的類用8來標識,依次類

推。
通過linkage函式計算之後,實際上二叉樹式的聚類已經完成了。Z這個資料陣列不太好看,可以

用dendrogram(Z)來視覺化聚類樹。

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~圖2~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

可以看到,產生的聚類樹的每一層都是一個倒置的U型(或者說是個n型,~~),縱軸高度代表了

當前聚類中兩個子節點之間的距離。橫軸上標記出了各個資料點索引下標。
稍微注意以下的是,dendrogram預設最多畫30個最底層節點,當然可是設定引數改變這個限制,

比如dendrogram(Z,0)就會把所有資料點索引下標都標出來,但對於成千上萬的資料集合,這樣

的結果必然是圖形下方非常擁擠。看你的應用目的了,隨你玩~

(3)初步的聚類樹畫完後,還要做很多後期工作的,包括這樣的聚類是不是可靠,是不是代表了

實際的物件分化模式,對於具體的應用,應該怎樣認識這個完全版的聚類樹,產生具有較少分叉

的可供決策參考的分類結果呢?這都是需要考慮的。

MATLAB中提供了cluster, clusterdata, cophenet, inconsistent等相關函式。

cluster用於剪裁完全版的聚類樹,產生具有一定cutoff的可用於參考的樹。
clusterdata可以認為是pdist,linkage,cluster的綜合,當然更簡易一點。
cophenet和inconsistent用來計算某些係數,前者用於檢驗一定演算法下產生的二叉聚類樹和實際

情況的相符程度(就是檢測二叉聚類樹中各元素間的距離和pdist計算產生的實際的距離之間有

多大的相關性),inconsistent則是量化某個層次的聚類上的節點間的差異性(可用於作為

cluster的剪裁標準)。

後面這些的理解,大概需要對聚類有一個更深刻更數學的認識,我也不是很清楚,就不多說了。