关于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)

clc;
clear;

ClomStatic=[1,2,3,25,26,27,53,54,55];
len=length(ClomStatic);%求向量ClomStatic的长度

k=3; %给定的类别数目

%产生三个随机整数。随机聚类中心
p=randperm(len);
Temp=p(1:k);
Center=zeros(1,k);
for i=1:k
    Center(i)=ClomStatic(Temp(i));
end



%计算除聚类中心外的样本数据到聚类中心的距离,然后进行聚类
TempDistance=zeros(len,3);
 while 1
    
    Circulm=1;
    
    p1=1;
    p2=1;
    p3=1;
    
    JudgeEqual=zeros(1,k);
    if(Circulm~=1)
        clear Group1 Group2 Group3;   
    end
    for i=1:len
        for j=1:3
            TempDistance(i,j)=abs(ClomStatic(i)-Center(j));
        end
        [RowMin RowIndex]=min(TempDistance(i,:));
        if(RowIndex==1)
            Group1(p1)=ClomStatic(i);
            p1=p1+1;
        elseif(RowIndex==2)
            Group2(p2)=ClomStatic(i);
            p2=p2+1;
        elseif(RowIndex==3)
            Group3(p3)=ClomStatic(i);
            p3=p3+1;
        end
    end
     
        len1=length(Group1);
        len2=length(Group2);
        len3=length(Group3);
        
        
        %计算Group1,Group2,Group3的均值
        MeanGroup1=mean(Group1);
        MeanGroup2=mean(Group2);
        MeanGroup3=mean(Group3);

        
        %分别计算每一个类中距离均值近期的一个点作为新的聚类中心
        AbsGroup1=zeros(1,len1);
        for t=1:len1
            AbsGroup1(t)=floor(abs(Group1(t)-MeanGroup1));
        end
        [MaxAbsGroup1 MaxAbsGroup1Index]=min(AbsGroup1);
        NewCenter(1)=Group1(MaxAbsGroup1Index);
        clear AbsGroup1;

        AbsGroup2=zeros(1,len2);
        for t=1:len2
            AbsGroup2(t)=floor(abs(Group2(t)-MeanGroup2));
        end
        [MaxAbsGroup2 MaxAbsGroup2Index]=min(AbsGroup2);
        NewCenter(2)=Group2(MaxAbsGroup2Index);
        clear AbsGroup2;
          
        AbsGroup3=zeros(1,len3);
        for t=1:len3
            AbsGroup3(t)=floor(abs(Group3(t)-MeanGroup3));
        end
        [MaxAbsGroup3 MaxAbsGroup3Index]=min(AbsGroup3);
        NewCenter(3)=Group3(MaxAbsGroup2Index);
        clear AbsGroup3;
        
        %推断新的类和旧类的聚类中心是否不同,不同则继续聚类,否则聚类结束
        JudgeEqual=zeros(1,k);
        for i=1:k
            JudgeEqual=(NewCenter==Center);
        end
        
        S=0;
        for i=1:k
            if(JudgeEqual(i)==1)
                S=S+1;
            end
        end
        
        if(S==3)
            break;
        end
        
        Circulm=Circulm+1;
  end



聚类结果例如以下:



不直到是算法的收敛性问题还是代码本身的问题,执行过后会一直执行,此时按ctrl+c中断代码,则聚类结果就出来了.

假设有大神发现原因还望赐教小弟,多多感谢.



转载请注明作者:小刘

posted on 2017-05-26 09:18  ljbguanli  阅读(358)  评论(0编辑  收藏  举报