在數據挖掘中聚類和分類的原理被廣泛的應用.
聚類即無監督的學習.
分類即有監督的學習.
通俗一點的講就是:聚類之前是未知樣本的分類.而是根據樣本本身的相似性進行划分為相似的類簇.而分類
是已知樣本分類,則需要將樣本特征和分類特征進行匹配,進而將每個樣本歸入給出的特定的類.
由於本文是對聚類算法中的k-means算法的實現,所以接下來主要進行一些聚類算法的介紹.
聚類算法包括多種,可按如下分配:
1.划分法:基於此種思想的聚類算法包括 k-means,PAM,CLARA,CLARANS,STIRR.
2.層次法:基於此種思想的聚類算法包括BIRCH,CURE,Rock,Chamlean
3.密度法:基於此種思想的聚類算法包括DBSCAN,OPTICS,DENCluE,FDBSCAN,InCremental DBSCAN
4.網格法:基於此種思想的聚類算法包括STING,WaveCluster,OptiGrid
5.模型法:基於此種思想的聚類算法包括AutoClass,COBWEB,CLASSIT
6.神經網絡:基於思想網絡的聚類算法有兩種:其一 自組織特征映射 其二 競爭學習
而k-means是基於划分思想.所以在這里介紹一下划分聚類思想:
1.對一組樣本數據首先隨機確定K個聚類中心
2.后來通過反復的迭代改變聚類中心,使得不斷優化.而不斷優化的意思是:同一類樣本距離聚類中心越來越近,
而不同類樣本之間距離越來越遠.而最終收斂於聚類中心的位置不再移動.
既然k-means是基於這樣的划分思想,那么當然k-means的算法思想精髓和划分思想是一致的.
k-means算法如下:
1.設樣本為X{x(1),x(2)........}
2.首先在樣本中隨機選取k個聚類中心.
3.然后對除開聚類中心外的樣本點計算到每個聚類中心的距離.將樣本歸類到距離樣本中心最近的樣本點.這便實
現了最初的聚類
4.再對每個類重新計算其聚類中心.然后重新對除開聚類中心的樣本點計算到三個聚類中心的距離.將樣本歸類到距
離樣本中心最近的樣本點,這便實現了第一次優化聚類.
5.重復步驟四,直到兩次聚類中心的位置不再變化,這便完成了最終的聚類
K-means matlab實現如下:(k=3)
1 clc; 2 clear; 3 4 ClomStatic=[1,2,3,25,26,27,53,54,55]; 5 len=length(ClomStatic);%求向量ClomStatic的長度 6 7 k=3; %給定的類別數目 8 9 %產生三個隨機整數,隨機聚類中心 10 p=randperm(len); 11 Temp=p(1:k); 12 Center=zeros(1,k); 13 for i=1:k 14 Center(i)=ClomStatic(Temp(i)); 15 end 16 17 18 19 %計算除聚類中心外的樣本數據到聚類中心的距離,然后進行聚類 20 TempDistance=zeros(len,3); 21 while 1 22 23 Circulm=1; 24 25 p1=1; 26 p2=1; 27 p3=1; 28 29 JudgeEqual=zeros(1,k); 30 if(Circulm~=1) 31 clear Group1 Group2 Group3; 32 end 33 for i=1:len 34 for j=1:3 35 TempDistance(i,j)=abs(ClomStatic(i)-Center(j)); 36 end 37 [RowMin RowIndex]=min(TempDistance(i,:)); 38 if(RowIndex==1) 39 Group1(p1)=ClomStatic(i); 40 p1=p1+1; 41 elseif(RowIndex==2) 42 Group2(p2)=ClomStatic(i); 43 p2=p2+1; 44 elseif(RowIndex==3) 45 Group3(p3)=ClomStatic(i); 46 p3=p3+1; 47 end 48 end 49 50 len1=length(Group1); 51 len2=length(Group2); 52 len3=length(Group3); 53 54 55 %計算Group1,Group2,Group3的均值 56 MeanGroup1=mean(Group1); 57 MeanGroup2=mean(Group2); 58 MeanGroup3=mean(Group3); 59 60 61 %分別計算每個類中距離均值最近的一個點作為新的聚類中心 62 AbsGroup1=zeros(1,len1); 63 for t=1:len1 64 AbsGroup1(t)=floor(abs(Group1(t)-MeanGroup1)); 65 end 66 [MaxAbsGroup1 MaxAbsGroup1Index]=min(AbsGroup1); 67 NewCenter(1)=Group1(MaxAbsGroup1Index); 68 clear AbsGroup1; 69 70 AbsGroup2=zeros(1,len2); 71 for t=1:len2 72 AbsGroup2(t)=floor(abs(Group2(t)-MeanGroup2)); 73 end 74 [MaxAbsGroup2 MaxAbsGroup2Index]=min(AbsGroup2); 75 NewCenter(2)=Group2(MaxAbsGroup2Index); 76 clear AbsGroup2; 77 78 AbsGroup3=zeros(1,len3); 79 for t=1:len3 80 AbsGroup3(t)=floor(abs(Group3(t)-MeanGroup3)); 81 end 82 [MaxAbsGroup3 MaxAbsGroup3Index]=min(AbsGroup3); 83 NewCenter(3)=Group3(MaxAbsGroup2Index); 84 clear AbsGroup3; 85 86 %判斷新的類和舊類的聚類中心是否不同,不同則繼續聚類,否則聚類結束 87 JudgeEqual=zeros(1,k); 88 for i=1:k 89 JudgeEqual=(NewCenter==Center); 90 end 91 92 S=0; 93 for i=1:k 94 if(JudgeEqual(i)==1) 95 S=S+1; 96 end 97 end 98 99 if(S==3) 100 break; 101 end 102 103 Circulm=Circulm+1; 104 end
聚類結果如下: