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的選取有很大關系,視具體數據而定。
