FCM聚类算法介绍(共6页).doc
精选优质文档-倾情为你奉上FCM聚类算法介绍FCM算法是一种基于划分的聚类算法,它的思想就是使得被划分到同一簇的对象之间相似度最大,而不同簇之间的相似度最小。模糊C均值算法是普通C均值算法的改进,普通C均值算法对于数据的划分是硬性的,而FCM则是一种柔性的模糊划分。在介绍FCM具体算法之前我们先介绍一些模糊集合的基本知识。6.1.1 模糊集基本知识21首先说明隶属度函数的概念。隶属度函数是表示一个对象x隶属于集合A的程度的函数,通常记做A(x),其自变量范围是所有可能属于集合A的对象(即集合A所在空间中的所有点),取值范围是0,1,即0<=A(x)<=1。A(x)=1表示x完全隶属于集合A,相当于传统集合概念上的xA。一个定义在空间X=x上的隶属度函数就定义了一个模糊集合A,或者叫定义在论域X=x上的模糊子集。对于有限个对象x1,x2,xn模糊集合可以表示为: (6.1)有了模糊集合的概念,一个元素隶属于模糊集合就不是硬性的了,在聚类的问题中,可以把聚类生成的簇看成模糊集合,因此,每个样本点隶属于簇的隶属度就是0,1区间里面的值。6.1.2 K均值聚类算法(HCM)介绍K均值聚类,即众所周知的C均值聚类,已经应用到各种领域。它的核心思想如下:算法把n个向量xj(1,2,n)分为c个组Gi(i=1,2,c),并求每组的聚类中心,使得非相似性(或距离)指标的价值函数(或目标函数)达到最小。当选择欧几里德距离为组j中向量xk与相应聚类中心ci间的非相似性指标时,价值函数可定义为: (6.2)这里是组i内的价值函数。这样Ji的值依赖于Gi的几何特性和ci的位置。一般来说,可用一个通用距离函数d(xk,ci)代替组I中的向量xk,则相应的总价值函数可表示为: (6.3)为简单起见,这里用欧几里德距离作为向量的非相似性指标,且总的价值函数表示为(6.2)式。划分过的组一般用一个c×n的二维隶属矩阵U来定义。如果第j个数据点xj属于组i,则U中的元素uij为1;否则,该元素取0。一旦确定聚类中心ci,可导出如下使式(6.2)最小uij: (6.4)重申一点,如果ci是xj的最近的聚类中心,那么xj属于组i。由于一个给定数据只能属于一个组,所以隶属矩阵U具有如下性质: (6.5)且 (6.6)另一方面,如果固定uij则使(6.2)式最小的最佳聚类中心就是组I中所有向量的均值:, (6.7)这里|Gi|是Gi的规模或。为便于批模式运行,这里给出数据集xi(1,2,n)的K均值算法;该算法重复使用下列步骤,确定聚类中心ci和隶属矩阵U:步骤1:初始化聚类中心ci,i=1,c。典型的做法是从所有数据点中任取c个点。步骤2:用式(6.4)确定隶属矩阵U。步骤3:根据式(6.2)计算价值函数。如果它小于某个确定的阀值,或它相对上次价值函数质的改变量小于某个阀值,则算法停止。步骤4:根据式(6.5)修正聚类中心。返回步骤2。该算法本身是迭代的,且不能确保它收敛于最优解。K均值算法的性能依赖于聚类中心的初始位置。所以,为了使它可取,要么用一些前端方法求好的初始聚类中心;要么每次用不同的初始聚类中心,将该算法运行多次。此外,上述算法仅仅是一种具有代表性的方法;我们还可以先初始化一个任意的隶属矩阵,然后再执行迭代过程。K均值算法也可以在线方式运行。这时,通过时间平均,导出相应的聚类中心和相应的组。即对于给定的数据点x,该算法求最近的聚类中心ci,并用下面公式进行修正: (6.8)这种在线公式本质上嵌入了许多非监督学习神经元网络的学习法则。6.2.3 模糊C均值聚类 模糊C均值聚类(FCM),即众所周知的模糊ISODATA,是用隶属度确定每个数据点属于某个聚类的程度的一种聚类算法。1973年,Bezdek提出了该算法,作为早期硬C均值聚类(HCM)方法的一种改进。FCM把n个向量xi(i=1,2,n)分为c个模糊组,并求每组的聚类中心,使得非相似性指标的价值函数达到最小。FCM与HCM的主要区别在于FCM用模糊划分,使得每个给定数据点用值在0,1间的隶属度来确定其属于各个组的程度。与引入模糊划分相适应,隶属矩阵U允许有取值在0,1间的元素。不过,加上归一化规定,一个数据集的隶属度的和总等于1: (6.9)那么,FCM的价值函数(或目标函数)就是式(6.2)的一般化形式:, (6.10)这里uij介于0,1间;ci为模糊组I的聚类中心,dij=|ci-xj|为第I个聚类中心与第j个数据点间的欧几里德距离;且是一个加权指数。构造如下新的目标函数,可求得使(6.10)式达到最小值的必要条件: (6.11)这里lj,j=1到n,是(6.9)式的n个约束式的拉格朗日乘子。对所有输入参量求导,使式(6.10)达到最小的必要条件为: (6.12)和 (6.13)由上述两个必要条件,模糊C均值聚类算法是一个简单的迭代过程。在批处理方式运行时,FCM用下列步骤确定聚类中心ci和隶属矩阵U1:步骤1:用值在0,1间的随机数初始化隶属矩阵U,使其满足式(6.9)中的约束条件步骤2:用式(6.12)计算c个聚类中心ci,i=1,c。步骤3:根据式(6.10)计算价值函数。如果它小于某个确定的阀值,或它相对上次价值函数值的改变量小于某个阀值,则算法停止。步骤4:用(6.13)计算新的U矩阵。返回步骤2。上述算法也可以先初始化聚类中心,然后再执行迭代过程。由于不能确保FCM收敛于一个最优解。算法的性能依赖于初始聚类中心。因此,我们要么用另外的快速算法确定初始聚类中心,要么每次用不同的初始聚类中心启动该算法,多次运行FCM。6.2.4 FCM算法的应用通过上面的讨论,我们不难看出FCM算法需要两个参数一个是聚类数目C,另一个是参数m。一般来讲C要远远小于聚类样本的总个数,同时要保证C>1。对于m,它是一个控制算法的柔性的参数,如果m过大,则聚类效果会很次,而如果m过小则算法会接近HCM聚类算法。算法的输出是C个聚类中心点向量和C*N的一个模糊划分矩阵,这个矩阵表示的是每个样本点属于每个类的隶属度。根据这个划分矩阵按照模糊集合中的最大隶属原则就能够确定每个样本点归为哪个类。聚类中心表示的是每个类的平均特征,可以认为是这个类的代表点。从算法的推导过程中我们不难看出,算法对于满足正态分布的数据聚类效果会很好,另外,算法对孤立点是敏感的。clear all;load iris_tr;load iris_te;H=1;% m为要生成的族的数目m=3;% num(n)为第n类的记录条数for n=1:m num(n)=0;endrows,cols=size(IRIS_training_data);for I=1:rows if IRIS_training_data(I,6)=1 IRIS_training_data(I,5)=2; end if IRIS_training_data(I,7)=1 IRIS_training_data(I,5)=3; endendnew_iris=IRIS_training_data(:,1:5);% 对test进行观察式学习分类test=IRIS_training_data(:,1:4);%随机选择三条连续记录作为初始的三个类for I=1:mc(I)=floor(rand(1)*75)+1;endfor J=1:m for I=1:4 classJ(I)=test(c(J),I); endendwhile H=1 for I=1:rows for K=1:m d(K)=sqrt(classK(1)-test(I,1)2+(classK(2)-test(I,2)2+(classK(3)-test(I,3)2+(classK(4)-test(I,4)2); end y,t=min(d); num(t)=num(t)+1; test(I,5)=t; for J=1:4 last_classt=classt; classt(J)=(test(I,J)+classt(J)*num(t)/(num(t)+1); end end% 判断结束条件是否满足for K=1:m d(K)=sqrt(last_classK(1)-classK(1)2+(last_classK(2)-classK(2)2+(last_classK(3)-classK(3)2+(last_classK(4)-classK(4)2);endy,t=max(d);if y<0.0001; break;endend% 与实际的分类对比计算出预测的正确率for I=1:m class11(I)=0; class21(I)=0; class31(I)=0;endfor I=1:3:rows if test(I,5)=1 class11(1)=class11(1)+1; elseif test(I,5)=2 class11(2)=class11(2)+1; else class11(3)=class11(3)+1; end right_num,t=max(class11);endfor I=2:3:rows if test(I,5)=1 class21(1)=class21(1)+1; elseif test(I,5)=2 class21(2)=class21(2)+1; else class21(3)=class21(3)+1; endendright_num=right_num+max(class21); for I=3:3:rows if test(I,5)=1 class31(1)=class31(1)+1; elseif test(I,5)=2 class31(2)=class31(2)+1; else class31(3)=class31(3)+1; endend right_num=right_num+max(class31);right_num=(right_num/rows)*100;disp(sprintf('利用k_means给iris数据集分类的正确率为:%d%',right_num);专心-专注-专业