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的剪裁標準)。
後面這些的理解,大概需要對聚類有一個更深刻更數學的認識,我也不是很清楚,就不多說了。