• 续前篇---数据挖掘之聚类算法k-mediod(PAM)原理及实现


    上一篇博文中介绍了聚类算法中的kmeans算法.无可非议kmeans由于其算法简单加之分类效率较高

    已经广泛应用于聚类应用中.

    然而kmeans并非十全十美的.其对于数据中的噪声和孤立点的聚类带来的误差也是让人头疼的.




    于是一种基于Kmeans的改进算法kmediod应运而生.kmediod和Kmeans算法核心思想大同小异,但是最大

    的不同是在修正聚类中心的时候,kmediod是计算类簇中除开聚类中心的每点到其他所有点的聚类的最小值

    来优化新的聚类中心.正是这一差别使得kmediod弥补了kmeans算法的缺点.kmediod对噪声和孤立点不敏感.

    但是事情都具有两面性.这种聚类准确性的提高是牺牲聚类时间来实现的.不难看出.kmediod需要不断的找出每

    个点到其他所有点的距离的最小值来修正聚类中心,这大大加大聚类收敛的时间.所有Kmediod对于大规模数据

    聚类就显得力不从心,只能适应较小规模的数值聚类.




    接下来我再对kmediod的算法描述一遍:

    1.设样本为X{x(1),x(2)........}

    2.首先在样本中随机选取k个聚类中心.

    3.然后对除开聚类中心外的样本点计算到每个聚类中心的距离.将样本归类到距离样本中心最近的样本点.这便

       实现了最初的聚类

    4.再对每个类中除类中心的点外的其他样本点计算到其他所有点的距离和的最小值.将该最小值点作为新的聚类

       中心便实现了一次聚类优化.

     5.重复步骤四,直到两次聚类中心的位置不再变化,这便完成了最终的聚类

    注:步骤4正体现了kmeans和kmediod的核心差异



     

    k-mediod的matlab实现代码如下:

      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               %分别计算每个类中除开类中心的点到其他所有点的距离和E,E最小时为该类新的聚类中心.
     61               E=zeros(1,len1-1);
     62               q1=1;
     63               for j=1:len1
     64                   for i=1:len
     65                     if(Group1(j)~=Center(1)&&i~=j)
     66                         E(q1)=floor(abs(Group1(j)-ClomStatic(i)));
     67                         q1=q1+1;
     68                     end
     69                   end
     70               end
     71               NewCenter(1)=min(E);
     72               
     73              E=zeros(1,len2-1);
     74               q2=1;
     75               for j=1:len2
     76                   for i=1:len
     77                     if(Group2(j)~=Center(2)&&i~=j)
     78                         E(q2)=floor(abs(Group2(j)-ClomStatic(i)));
     79                         q2=q2+1;
     80                     end
     81                   end
     82               end
     83               NewCenter(2)=min(E);
     84               
     85               E=zeros(1,len3-1);
     86               q3=1;
     87               for j=1:len3
     88                   for i=1:len
     89                     if(Group3(j)~=Center(3)&&i~=j)
     90                         E(q3)=floor(abs(Group3(j)-ClomStatic(i)));
     91                         q3=q3+1;
     92                     end
     93                   end
     94               end
     95               NewCenter(3)=min(E);
     96         
     97         %判断新的类和旧类的聚类中心是否不同,不同则继续聚类,否则聚类结束
     98         JudgeEqual=zeros(1,k);
     99         for i=1:k
    100             JudgeEqual=(NewCenter==Center);
    101         end
    102         
    103         S=0;
    104         for i=1:k
    105             if(JudgeEqual(i)==1)
    106                 S=S+1;
    107             end
    108         end
    109         
    110         if(S==3)
    111             break;
    112         end
    113         
    114         Circulm=Circulm+1;
    115   end

    结果如下:





     

  • 相关阅读:
    Tomcat自动部署
    java环境配置
    django-crispy-forms入门指南
    hibernate级联删除
    bzoj1659: [Usaco2006 Mar]Lights Out 关灯
    bzoj1658: [Usaco2006 Mar]Water Slides 滑水
    bzoj5470 / P4578 [FJOI2018]所罗门王的宝藏(差分约束)
    P2864 [USACO06JAN]树林The Grove
    bzoj1651 / P2859 [USACO06FEB]摊位预订Stall Reservations
    bzoj1647 / P1985 [USACO07OPEN]翻转棋
  • 原文地址:https://www.cnblogs.com/vpoet/p/4659734.html
Copyright © 2020-2023  润新知