matlab做聚類分析


 

Matlab提供了兩種方法進行聚類分析。

一種是利用 clusterdata函數對樣本數據進行一次聚類,其缺點為可供用戶選擇的面較窄,不能更改距離的計算方法;

另一種是分步聚類:(1)找到數據集合中變量兩兩之間的相似性和非相似性,用pdist函數計算變量之間的距離;(2)用 linkage函數定義變量之間的連接;(3)用 cophenetic函數評價聚類信息;(4)用cluster函數創建聚類。

1Matlab中相關函數介紹

1.1 pdist函數

調用格式:Y=pdist(X,’metric’)

說明:用 ‘metric’指定的方法計算 X 數據矩陣中對象之間的距離。

X:一個m×n的矩陣,它是由m個對象組成的數據集,每個對象的大小為n

metric’取值如下:

‘euclidean’:歐氏距離(默認);‘seuclidean’:標准化歐氏距離;

‘mahalanobis’:馬氏距離;‘cityblock’:布洛克距離;

‘minkowski’:明可夫斯基距離;‘cosine’

‘correlation’ ‘hamming’

‘jaccard’ ‘chebychev’Chebychev距離。

1.2 squareform函數

 調用格式:Z=squareform(Y,..)

 說明: 強制將距離矩陣從上三角形式轉化為方陣形式,或從方陣形式轉化為上三角形式。

1.3 linkage函數

調用格式:Z=linkage(Y,’method’)

 明:用‘method’參數指定的算法計算系統聚類樹。

 Ypdist函數返回的距離向量;

 method:可取值如下:

 ‘single’:最短距離法(默認); ‘complete’:最長距離法;

average’:未加權平均距離法; weighted’: 加權平均法;

‘centroid’:質心距離法; ‘median’:加權質心距離法;

‘ward’:內平方距離法(最小方差算法)

返回:Z為一個包含聚類樹信息的(m-1)×3的矩陣。

1.4 dendrogram函數

調用格式:[HT…]=dendrogram(Z,p…)

說明:生成只有頂部p個節點的冰柱圖(譜系圖)。

1.5 cophenet函數

調用格式:c=cophenetic(Z,Y)

說明:利用pdist函數生成的Ylinkage函數生成的Z計算cophenet相關系數。

1.6 cluster 函數

調用格式:T=cluster(Z,…)

說明:根據linkage函數的輸出Z 創建分類。

1.7 clusterdata函數

調用格式:T=clusterdata(X,…)

說明:根據數據創建分類。

T=clusterdata(X,cutoff)與下面的一組命令等價:

Y=pdist(X,’euclid’);

Z=linkage(Y,’single’);

T=cluster(Z,cutoff);

2. Matlab程序

2.1 一次聚類法

X=[11978 12.5 93.5 31908;…;57500 67.6 238.0 15900];

T=clusterdata(X,0.9)

2.2 分步聚類

Step1 尋找變量之間的相似性

pdist函數計算相似矩陣,有多種方法可以計算距離,進行計算之前最好先將數據用zscore函數進行標准化。

X2=zscore(X); %標准化數據

Y2=pdist(X2); %計算距離

Step2 定義變量之間的連接

Z2=linkage(Y2);

Step3 評價聚類信息

 C2=cophenet(Z2,Y2); //0.94698

Step4 創建聚類,並作出譜系圖

 T=cluster(Z2,6);

 H=dendrogram(Z2);

分類結果:{加拿大}{中國,美國,澳大利亞}{日本,印尼}{巴西}{前蘇聯}

剩余的為一類。
 
 
 
 
 

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的剪裁標准)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM