关于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中断代码,则聚类结果就出来了.
假设有大神发现原因还望赐教小弟,多多感谢.
转载请注明作者:小刘