一、理論
聚類就是把東西聚在一起,那一定有一定的規則,相似等,后面會給出。聚類與分類的不同就是,聚類所要求的划分的類是未知的。聚類是這么定義的:將數據分類到不同的類或者簇這樣的一個過程,所以同一個簇中的對象有很大的相似性,而不同簇之間的對象很大的相異性。按照個體或樣品(individuals, objects or subjects)的特征將它們分類,使同一類別內的個體具有盡可能高的同質性(homogeneity),而類別之間則應具有盡可能高的異質性(heterogeneity)。
傳統的聚類有:系統聚類法,分解法,加入法,動態聚類法,有序樣品聚類,有重疊聚類和模糊聚類。其中,我們很熟悉的就是K-均值、K-中心點等算法,經典以后可以單獨來說這個
兩種相似性度量:距離和相似系數
- 采用描述個體對(變量對)之間的接近程度的指標,例如“距離”,“距離”越小的個體(變量)越具有相似性。
- 采用表示相似程度的指標,例如“相關系數”,“相關系數”越大的個體(變量)越具有相似性。
再多說一點距離:用來度量樣品之間的相似性,聚類——距離指標D(distance)的方法非常多:按照數據的不同性質,可選用不同的距離指標。歐氏距離(Euclidean distance)、歐氏距離的平方(SquaredEuclidean distance)、曼哈頓距離(Block)、切比雪夫距離(Chebychev distance)、卡方距離(Chi-aquaremeasure) 等;相似性也有不少,主要是皮爾遜相關系數。
方法一:系統聚類法的基本思想:令n個樣品自成一類,計算出相似性測度,此時類間距離與樣品間距離是等價的,把測度最小的兩個類合並;然后按照某種聚類方法計算類間的距離,再按最小距離准則並類;這樣每次減少一類,持續下去直到所有樣品都歸為一類為止。聚類過程可做成聚類譜系圖(Hierarchical diagram)。這里的距離有很多例如最短距離法
l最短距離法(singlelinkage) l最長距離法(completelinkage) l中間距離法(medianmethod) l可變距離法(flexiblemedian) l重心法(centroid) l類平均法(average) l可變類平均法(flexibleaverage) lWard最小方差法(Ward’sminimum variance)
注意:最長距離法,可變類平均法,離差平方和,注意這些都是有單調性的,中間距離法和重心性不具有單調性。這里的相似性:用來度量變量之間對相似性,r的絕對值接近1,就表示相關或者相似。
步驟:
s1.構造n個類,每個類包含且只包含一個樣品。 s2.計算n個樣品兩兩間的距離,構成距離矩陣,記作D0。 s3.合並距離最近的兩類為一新類。 s4.計算新類與當前各類的距離。若類的個數等於1,轉到步驟(5),否則回到步驟(3)。 s5.畫聚類圖。 s6.決定類的個數,及各類包含的樣品數,並對類作出解釋。
二、實現
Matlab提供系列函數用於聚類分析,歸納起來具體方法有如下三種
方法一:直接聚類,利用clusterdata函數對樣本數據進行一次聚類,其缺點為可供用戶選擇的面較窄,不能更改距離的計算方法,該方法的使用者無需了解聚類的原理和過程,但是聚類效果受限制。
方法二:層次聚類,該方法較為靈活,需要進行細節了解聚類原理,具體需要進行如下過程處理
(1)找到數據集合中變量兩兩之間的相似性和非相似性,用pdist函數計算變量之間的距離;
(2)用 linkage函數定義變量之間的連接;
(3)用 cophenetic函數評價聚類信息;
(4)用cluster函數創建聚類。
方法三:划分聚類,包括K均值聚類和K中心聚類,同樣需要系列步驟完成該過程,要求使用者對聚類原理和過程有較清晰的認識。
Matlab中的相關函數和相關聚類方法
pdist函數
用格式:Y=pdist(X,’metric’) 說明:用 ‘metric’指定的方法計算 X 數據矩陣中對象之間的距離。 X:一個m×n的矩陣,它是由m個對象組成的數據集,每個對象的大小為n(即n個特征值)。 metric’取值如下: ‘euclidean’:歐氏距離(默認);
‘seuclidean’:標准化歐氏距離; ‘mahalanobis’:馬氏距離;
‘cityblock’:布洛克距離; ‘minkowski’:明可夫斯基距離; ‘cosine’: ‘correlation’: ‘jaccard’:‘chebychev’:Chebychev距離。
squareform 函數
Z = squareform(Y,..)
對於M個點的數據集X,pdist之后的Y將是具有M*(M-1)/2個元素的行向量。Y這樣的顯示雖然節省了內存空間,但對用戶來說不是很易懂,如果需要對這些距離進行特定操作的話,也不太好索引。MATLAB中可以用squareform把Y轉換成方陣形式,方陣中<i,j>位置的數值就是X中第i和第j點之間的距離,顯然這個方陣應該是個對角元素為0的對稱陣。
linkage函數
Z=linkage(Y,‘method’) 輸入值說明:Y為pdist函數返回的M*(M-1)/2個元素的行向量,用‘method’參數指定的算法計算系統聚類樹。 method:可取值如下: ‘single’:最短距離法(默認); ‘complete’:最長距離法; ‘average’:未加權平均距離法; ‘weighted’: 加權平均法; ‘centroid’:質心距離法; ‘median’:加權質心距離法; ‘ward’:內平方距離法(最小方差算法) 返回值說明:Z為一個包含聚類樹信息的(m-1)×3的矩陣,其中前兩列為索引標識,表示哪兩個序號的樣本可以聚為同一類,第三列為這兩個樣本之間的距離。另外,除了M個樣本以外,對於每次新產生的類,依次用M+1、M+2、…來標識。
dendrogram函數
調用格式:[H,T,…]=dendrogram(Z,p,…) 說明:生成只有頂部p個節點的冰柱圖(譜系圖)。 為了表示Z矩陣,我們可以用更直觀的聚類數來展示,方法為:dendrogram(Z), 產生的聚類數是一個n型樹,最下邊表示樣本,然后一級一級往上聚類,最終成為最頂端的一類。縱軸高度代表距離列。 另外,還可以設置聚類數最下端的樣本數,默認為30,可以根據修改dendrogram(Z,n)參數n來實現,1<n<M。dendrogram(Z,0)則表n=M的情況,顯示所有葉節點。
cophenet函數
c=cophenet(Z,Y) 說明:利用pdist函數生成的Y和linkage函數生成的Z計算cophenet相關系數。 cophene檢驗一定算法下產生的二叉聚類樹和實際情況的相符程度,就是檢測二叉聚類樹中各元素間的距離和pdist計算產生的實際的距離之間有多大的相關性,另外也可以用inconsistent表示量化某個層次的聚類上的節點間的差異性。
cluster 函數
調用格式:T=cluster(Z,…) 說明:根據linkage函數的輸出Z 創建分類。
clusterdata 函數
調用格式:T=clusterdata(X,…) 說明:根據數據創建分類。 When 0 < CUTOFF < 2, T = CLUSTERDATA(X,CUTOFF) is equivalent to: Y = pdist(X, 'euclid'); Z = linkage(Y, 'single'); T = cluster(Z, 'cutoff', CUTOFF); When CUTOFF is an integer >= 2, T = CLUSTERDATA(X,CUTOFF) isequivalent to: Y = pdist(X,'euclid'); Z = linkage(Y,'single'); T = cluster(Z,'maxclust',CUTOFF)
Inconsistent函數
S_i是除了葉節點外,所有深度低於(M+i)不超過DEPTH的節點(包括M+i節點自身) 而Inconsistent計算的是S_i的距離的平均值,Then Y(i,1) = mean(Z(S_i,3)), the mean height of nodes in S_i Y(i,2) = std(Z(S_i,3)), the standard deviation of node heights in S_i Y(i,3) = length(S_i), the number of nodes in S_i Y(i,4) = (Z(i,3) - Y(i,1))/Y(i,2), the inconsistent value The default value for DEPTH is 2.
計算深度會影響不一致系數的計算結果,計算深度比較大時,不一致系數的增量能反映出當前步引入的新樣品與該類中心(涉及該類中所有樣品)的距離遠近,計算深度比較小時,不一致系數的增量僅能反映出當前步引入的新樣品與上幾步聚類中涉及的樣品的中心的距離遠近。
方法一:一次聚類法(直接使用clusterdata函數)
x1=randn(10,1); x2=randn(10,1)+10; x3=randn(10,1)+20; x=[x1;x2;x3]; y=randn(30,1); T=clusterdata([x,y],3) temp1=find(T==1) plot(x(temp1),y(temp1),'rd','markersize',10,'markerfacecolor','r') hold on temp1=find(T==2) plot(x(temp1),y(temp1),'yd','markersize',10,'markerfacecolor','y') temp1=find(T==3) plot(x(temp1),y(temp1),'kd','markersize',10,'markerfacecolor','k') legend('cluster 1','cluster 2','cluster 3')
結果如下圖:
方法二和方法三設計流程:分步聚類
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);