继上两篇文章介绍聚类中基于划分思想的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