關於k-means聚類算法的matlab實現


在數據挖掘中聚類和分類的原理被廣泛的應用.

聚類即無監督的學習.

分類即有監督的學習.

通俗一點的講就是:聚類之前是未知樣本的分類.而是根據樣本本身的相似性進行划分為相似的類簇.而分類

是已知樣本分類,則需要將樣本特征和分類特征進行匹配,進而將每個樣本歸入給出的特定的類.

 

由於本文是對聚類算法中的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

聚類結果如下:


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM