在数据挖掘中聚类和分类的原理被广泛的应用.
聚类即无监督的学习.
分类即有监督的学习.
通俗一点的讲就是:聚类之前是未知样本的分类.而是根据样本本身的相似性进行划分为相似的类簇.
而分类是已知样本分类,则需要将样本特征和分类特征进行匹配,进而将每个样本归入给出的特定的类.
由于本文是对聚类算法中的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中断代码,则聚类结果就出来了.
如果有大神发现原因还望赐教小弟,多多感谢.
转载请注明作者:小刘