Matlab 聚類實現

轉自:http://cache.qihoo.com/wenda.php?do=snap&act=fetchHtmlsnap&m=4e30d558b4f3f59e1350ec81c05323c5&surl=http%3A%2F%2Flipsonyoung.blogbus.com%2Flogs%2F33055546.html&kw=MATLAb

MATLAB提供了兩種方法進行聚類分析:

1、利用clusterdata 函數對數據樣本進行一次聚類,這個方法簡潔方便,其特點是使用範圍較窄,不能由用戶根據自身需要來設定參數,更改距離計算方法;

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

下邊詳細介紹兩種方法:

1、一次聚類

Clusterdata函數可以視爲pdistlinkagecluster的綜合,一般比較簡單。

clusterdata函數:

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

                      等價於Y=pdist(X,’euclid’); Z=linkage(Y,’single’); T=cluster(Z,cutoff) 

2、分步聚類

1)求出變量之間的相似性

pdist函數計算出相似矩陣,有多種方法可以求距離,若此前數據還未無量綱化,則可用zscore函數對其標準化

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

 說明:XM*N矩陣,爲由M個樣本組成,每個樣本有N個字段的數據集

        metirc取值爲:euclidean’:歐氏距離(默認)‘seuclidean’:標準化歐氏距離;‘mahalanobis’:馬氏距離

pdist生成一個M*(M-1)/2個元素的行向量,分別表示M個樣本兩兩間的距離。這樣可以縮小保存空間,不過,對於讀者來說卻是不好操作,因此,若想簡單直觀的表示,可以用squareform函數將其轉化爲方陣,其中x(i,j)表示第i個樣本與第j個樣本之的距離,對角線均爲0.

2)用linkage函數來產生聚類樹

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

說明:Ypdist函數返回的M*(M-1)/2個元素的行向量,

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

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

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

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

返回的Z爲一個(M-1)*3的矩陣,其中前兩列爲索引標識,表示哪兩個序號的樣本可以聚爲同一類,第三列爲這兩個樣本之間的距離。另外,除了M個樣本以外,對於每次新產生的類,依次用M+1M+2來標識。

爲了表示Z矩陣,我們可以用更直觀的聚類數來展示,方法爲:dendrogram(Z), 產生的聚類數是一個n型樹,最下邊表示樣本,然後一級一級往上聚類,最終成爲最頂端的一類。縱軸高度代表距離列。

         另外,還可以設置聚類數最下端的樣本數,默認爲30,可以根據修改dendrogram(Z,n)參數n來實現,1<n<Mdendrogram(Z,0)則表n=M的情況,顯示所有葉節點。

3)用cophenetic函數評價聚類信息

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

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

cophene檢驗一定算法下產生的二叉聚類樹和實際情況的相符程度,就是檢測二叉聚類樹中各元素間的距離和pdist計算產生的實際的距離之間有多大的相關性,另外也可以用inconsistent表示量化某個層次的聚類上的節點間的差異性。

4)最後,用cluster進行聚類,返回聚類列。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章