canopy聚類算法的MATLAB程序
凱魯嘎吉 - 博客園 http://www.cnblogs.com/kailugaji/
1. canopy聚類算法簡介
Canopy聚類算法是一個將對象分組到類的簡單、快速、精確地方法。每個對象用多維特征空間里的一個點來表示。這個算法使用一個快速近似距離度量和兩個距離閾值T1>T2來處理。基本的算法是,從一個點集合開始並且隨機刪除一個,創建一個包含這個點的Canopy,並在剩余的點集合上迭代。對於每個點,如果它的距離第一個點的距離小於T1,然后這個點就加入這個聚集中。除此之外,如果這個距離<T2,然后將這個點從這個集合中刪除。這樣非常靠近原點的點將避免所有的未來處理,不可以再做其它Canopy的中心。這個算法循環到初始集合為空為止,聚集一個集合的Canopies,每個可以包含一個或者多個點。每個點可以包含在多於一個的Canopy中。
Canopy算法其實本身也可以用於聚類,但它的結果可以為之后代價較高聚類提供幫助,其用在數據預處理上要比單純拿來聚類更有幫助。Canopy聚類經常被用作更加嚴格的聚類技術的初始步驟,像是K均值聚類。建立canopies之后,可以刪除那些包含數據點數目較少的canopy,往往這些canopy是包含孤立點的。
Canopy算法的步驟如下:
(1) 將所有數據放進list中,選擇兩個距離,T1,T2,T1>T2
(2)While(list不為空)
{
隨機選擇一個節點做canopy的中心;並從list刪除該點;
遍歷list:
對於任何一條記錄,計算其到各個canopy的距離;
如果距離<T2,則給此數據打上強標記,並從list刪除這條記錄;
如果距離<T1,則給此數據打上弱標記;
如果到任何canopy中心的距離都>T1,那么將這條記錄作為一個新的canopy的中心,並從list中刪除這個元素;
}
需要注意的是參數的調整:
當T1過大時,會使許多點屬於多個Canopy,可能會造成各個簇的中心點間距離較近,各簇間區別不明顯;
當T2過大時,增加強標記數據點的數量,會減少簇個個數;T2過小,會增加簇的個數,同時增加計算時間;
2. MATLAB程序
clear clc %%%%%%%%%%%%%%% 加載數據 %%%%%%%%%%%%%%%%%% X = dlmread('iris.data'); [~,X_dim]=size(X); X=X(:,1:X_dim-1); [num,dim] = size(X); N=100; k=zeros(N,1); for t=1:N %%%%%%%%%%%%%%% 抽樣 %%%%%%%%%%%%%%%%%% sample=round(num/10); rand_array=randperm(num); X_part=X(rand_array(1:sample),:); D=pdist(X_part); miu=mean(D); sigma=std(D); T2=miu+5*sigma; K_max=20; %%%%%%%%%canopy 自動划分聚類中心和個數%%%%%%%%% k(t) = 0; YB=[X zeros(num,1)]; Centr=zeros(K_max,dim); while size(YB,1) && (k(t)<K_max) k(t)=k(t)+1; Centr(k(t),:)=YB(1,1:dim); YB(1,:)=[]; %在選取第一個點為聚類點並刪除 L=size(YB,1); if L dist1=(YB(:,1:dim)-ones(L,1)*Centr(k(t),1:dim)).^2; %計算歐式距離 dist2=sum(dist1,2); end for i=1:L-1 if(dist2(i)<T2) %<T2說明是該類,在矩陣中刪除 YB(i,dim+1)=1; end end YB(YB(:,dim+1)==1,:)=[]; %刪除已歸類的元素 end end tabulate(k(:))
數據見:MATLAB實例:PCA降維中的iris數據集,保存為:iris.data,最后一列是類標簽。
3. 結果
Value Count Percent 1 0 0.00% 2 0 0.00% 3 99 99.00% 4 0 0.00% 5 1 1.00%
K=3為最終結果。注意:實驗結果與T2的選取有很大關系,視具體數據而定。