zoukankan      html  css  js  c++  java
  • 数据挖掘之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
  • 相关阅读:
    C语言博客作业03--函数
    C博客作业02--循环结构
    C博客作业01--分支、顺序结构
    我的第一篇博客
    迭代购物车Dao&&GUI
    Java购物车大作业01
    DS-查找
    DS-图
    DS--树
    DS博客作业02--栈和队列
  • 原文地址:https://www.cnblogs.com/vpoet/p/4659733.html
Copyright © 2011-2022 走看看