数据挖掘之clara算法原理及实例(代码中有bug)

继上两篇文章介绍聚类中基于划分思想的k-means算法和k-mediod算法

本文将继续介绍另外一种基于划分思想的k-mediod算法-----clara算法





clara算法可以说是对k-mediod算法的一种改进,就如同k-mediod算法对k-means算法的改进一样.

clara(clustering large application)算法是应用大规模数据的聚类.而其核心算法还是利用k-mediod算法.

只是这种算法弥补了k-mediod算法只能应用于小规模数据的缺陷.






clara算法的核心是,先对大规模数据进行多次采样,每次采样样本进行med-diod聚类,然后将多次

采样的样本聚类中心进行比较,选出最优的聚类中心.当然clara算法也有一定的缺陷,因为它依赖于

抽样次数,每次样本数据是否均匀分布,以及抽样样本的大小.尽管这样,clara算法还是为我们提供了

一种进行大规模数据聚类的方法.






clara算法的具体描述如下:

1.对大规模数据进行多次采样得到采样样本

2.对每次采样的样本进行k-mediod聚类,得到多组聚类中心

3.求出每组聚类中心到其他所有点距离和.

4.找出这几组距离和的最小值.距离和最小的那组就是最优的聚类中心.

5.然后将大规模数据按照距离聚类到这组最优聚类中心



matlab仿真代码如下:

  1 clc;
  2 clear;
  3 
  4 load Data3.mat;
  5 
  6 k=3; %给定的类别数目
  7 
  8 time=5;%time为抽样的次数
  9 number=30;%number为抽样本个数
 10 for T=1:time
 11     ClomStaticSample=zeros(1,number);
 12     ClomStaticSample=randsample(ClomStatic,number);   %ClomStaticSample就是样本数据
 13                                                       %接下来对样本数据使用kmediod算法进行聚类
 14                                                       
 15     %产生三个随机整数,随机聚类中心
 16     p=randperm(number);
 17     Temp=p(1:k);
 18     Center=zeros(1,k);
 19     for j=1:k
 20         Center(j)=ClomStaticSample(Temp(j));
 21     end
 22     [ClomStaticSample]=sort(ClomStaticSample);
 23     
 24     TempDistance=zeros(number,3);           %暂存差值
 25     
 26      while 1
 27         Circulm=1;                          %循环控制
 28 
 29         p1=1;
 30         p2=1;
 31         p3=1;
 32 
 33         if(Circulm~=1)
 34             clear Group1 Group2 Group3;   
 35         end
 36         for i=1:number
 37             for j=1:3
 38                 TempDistance(i,j)=abs(ClomStaticSample(i)-Center(j));
 39             end
 40             [RowMin RowIndex]=min(TempDistance(i,:));
 41             if(RowIndex(1)==1)
 42                 Group1(p1)=ClomStaticSample(i);
 43                 p1=p1+1;
 44             elseif(RowIndex(1)==2)
 45                 Group2(p2)=ClomStaticSample(i);
 46                 p2=p2+1;
 47             elseif(RowIndex(1)==3)
 48                 Group3(p3)=ClomStaticSample(i);
 49                 p3=p3+1;
 50             end
 51         end
 52 
 53             len1=length(Group1);
 54             len2=length(Group2);
 55             len3=length(Group3);
 56             
 57 
 58                   %分别计算每个类中除开类中心的点到其他所有点的距离和E,E最小时为该类新的聚类中心.
 59                   E=zeros(1,len1-1);
 60                   q1=1;
 61                   for j=1:len1
 62                       for i=1:number
 63                         if(Group1(j)~=Center(1)&&i~=j)
 64                             E(q1)=floor(abs(Group1(j)-ClomStaticSample(i)));
 65                             q1=q1+1;
 66                         end
 67                       end
 68                   end
 69                   NewCenter(1)=min(E);
 70 
 71                  E=zeros(1,len2-1);
 72                   q2=1;
 73                   for j=1:len2
 74                       for i=1:number
 75                         if(Group2(j)~=Center(2)&&i~=j)
 76                             E(q2)=floor(abs(Group2(j)-ClomStaticSample(i)));
 77                             q2=q2+1;
 78                         end
 79                       end
 80                   end
 81                   NewCenter(2)=min(E);
 82 
 83                   E=zeros(1,len3-1);
 84                   q3=1;
 85                   for j=1:len3
 86                       for i=1:number
 87                         if(Group3(j)~=Center(3)&&i~=j)
 88                             E(q3)=floor(abs(Group3(j)-ClomStaticSample(i)));
 89                             q3=q3+1;
 90                         end
 91                       end
 92                   end
 93                   NewCenter(3)=min(E);
 94 
 95             %判断新的类和旧类的聚类中心是否不同,不同则继续聚类,否则聚类结束
 96             JudgeEqual=zeros(1,k);
 97             for i=1:k
 98                 JudgeEqual=(NewCenter==Center);
 99             end
100 
101             S=0;
102             for i=1:k
103                 if(JudgeEqual(i)==1)
104                     S=S+1;
105                 end
106             end
107 
108             if(S==3)
109                 break;
110             end
111 
112             Circulm=Circulm+1;
113      end
114      CenterSum5=zeros(time,k);           %保存每次抽样后kmediod聚类中心的结果值.
115      CenterSum5(i,1)=Center(1);
116      CenterSum5(i,2)=Center(2);
117      CenterSum5(i,3)=Center(3);
118 end
119 
120 
121 %计算每次聚类中心点到其他所有点的距离和的最小值即为最优聚类中心
122 Sum=zeros(1,time);
123 for i=1:time
124     for j=1:k
125         for r=1:number-1
126             if( CenterSum5(i,j)~=ClomStaticSample(r))
127             Sum(i)=Sum(i)+CenterSum5(i,j)-ClomStaticSample(r);
128             end
129         end
130     end
131 end
132 
133 [SumOrder CenterEnd]=sort(Sum);%最优聚类中心即为Center(CenterEnd);
134 
135 
136 %对大数据进行最终的聚类(按照选择出来的最优聚类中心)
137         q1=1;
138         q2=1;
139         q3=1;
140         for i=1:length(ClomStatic)
141             for j=1:3
142                 EndTempDistance(i,j)=abs(ClomStatic(i)-CenterSum5(CenterEnd,j));
143             end
144             [RowMin RowIndex]=min(EndTempDistance(i,:));
145             if(RowIndex(1)==1)
146                 EndGroup1(q1)=ClomStatic(i);
147                 q1=q1+1;
148             elseif(RowIndex(1)==2)
149                 EndGroup2(q2)=ClomStatic(i);
150                 q2=q2+1;
151             elseif(RowIndex(1)==3)
152                 EndGroup3(q3)=ClomStatic(i);
153                 q3=q3+1;
154             end
155         end
原文地址:https://www.cnblogs.com/vpoet/p/4659733.html