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.03760.1253 0.32730.2877 0.1746-1.1465 -0.18671.1909 0.7258 >> plot(X(:,1),X(:,2),'bo') %給個圖,將來對照聚類結果把````
Y=pdist(x)
Y =
1 至 14 列
0.7728 0.4994 0.9336 0.6606 0.3346 0.6789 0.2830 0.1381 0.7942 0.9444 0.5422 0.7887 0.4075 0.8513
15 列
0.7286
````
例子中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 0.7728 0.4994 0.9336 0.6606 0.3346 0.7728 0 0.6789 0.2830 0.1381 0.7942 0.4994 0.6789 0 0.9444 0.5422 0.7887 0.9336 0.2830 0.9444 0 0.4075 0.8513 0.6606 0.1381 0.5422 0.4075 0 0.7286 0.3346 0.7942 0.7887 0.8513 0.7286 0這里需要注意的是,pdist可以使用多種參數,指定不同的距離算法。help pdist把。
另外,當數據規模很大時,可以想象pdist產生的Y占用內存將是很嚇人的,比如X有10k個數據點,那么X占10k82Bytes=160K,這看起來不算啥,但是pdist后的Y會有10k10k/28Bytes=400M。怕了把,所以,廢話說在前面,用MATLAB的層次聚類來處理大規模數據,大概是很不合適的。
確定好了對象間的差異度(距離)后,就可以用Z=linkage(Y)來產生層次聚類樹了。
對于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)來可視化聚類樹。
可以看到,產生的聚類樹的每一層都是一個倒置的U型(或者說是個n型,~~),縱軸高度代表了當前聚類中兩個子節點之間的距離。橫軸上標記出了各個數據點索引下標。
稍微注意以下的是,dendrogram默認最多畫30個最底層節點,當然可是設置參數改變這個限制,比如dendrogram(Z,0)就會把所有數據點索引下標都標出來,但對于成千上萬的數據集合,這樣的結果必然是圖形下方非常擁擠。看你的應用目的了,隨你玩~
(3)初步的聚類樹畫完后,還要做很多后期工作的,包括這樣的聚類是不是可靠,是不是代表了實際的對象分化模式,對于具體的應用,應該怎樣認識這個完全版的聚類樹,產生具有較少分叉的可供決策參考的分類結果呢?這都是需要考慮的。
MATLAB中提供了cluster, clusterdata, cophenet, inconsistent等相關函數。
cluster用于剪裁完全版的聚類樹,產生具有一定cutoff的可用于參考的樹。
clusterdata可以認為是pdist,linkage,cluster的綜合,當然更簡易一點。
cophenet和inconsistent用來計算某些系數,前者用于檢驗一定算法下產生的二叉聚類樹和實際
情況的相符程度(就是檢測二叉聚類樹中各元素間的距離和pdist計算產生的實際的距離之間有
多大的相關性),inconsistent則是量化某個層次的聚類上的節點間的差異性(可用于作為
cluster的剪裁標準)。
總結
以上是生活随笔為你收集整理的matlab 层次聚类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 自然语言处理笔记2-哈工大 关毅
- 下一篇: matlab 中imagesc的用法