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 ,相当于传统集合概念上的x ∈A 。
一个定义在空间X={x}上的隶属度函数就定义了一个模糊集合A ,或者叫定义在论域X={x}上的模糊子集~A 。
对于有限个对象x 1,x 2,……,x n 模糊集合~A 可以表示为:}|)),({(~X x x x A i i i A ∈=μ (6.1)有了模糊集合的概念,一个元素隶属于模糊集合就不是硬性的了,在聚类的问题中,可以把聚类生成的簇看成模糊集合,因此,每个样本点隶属于簇的隶属度就是[0,1]区间里面的值。
6.1.2 K 均值聚类算法(HCM)介绍K 均值聚类,即众所周知的C 均值聚类,已经应用到各种领域。
它的核心思想如下:算法把n 个向量x j (1,2…,n)分为c 个组G i (i=1,2,…,c),并求每组的聚类中心,使得非相似性(或距离)指标的价值函数(或目标函数)达到最小。
当选择欧几里德距离为组j 中向量x k 与相应聚类中心c i 间的非相似性指标时,价值函数可定义为:∑∑∑=∈=-==ci Gix k i kci k c xJi J 1,21)||||( (6.2)这里∑∑=∈-=ci Gix k i kk c xJi 1,2)||||(是组i 内的价值函数。
这样J i 的值依赖于G i 的几何特性和c i的位置。
一般来说,可用一个通用距离函数d(x k ,c i )代替组I 中的向量x k ,则相应的总价值函数可表示为:∑∑∑==∈-==ci ci Gix k i kk c xJi J 11,))d(( (6.3)为简单起见,这里用欧几里德距离作为向量的非相似性指标,且总的价值函数表示为(6.2)式。
划分过的组一般用一个c ×n 的二维隶属矩阵U 来定义。
如果第j 个数据点x j 属于组i ,则U 中的元素u ij 为1;否则,该元素取0。
一旦确定聚类中心ci ,可导出如下使式(6.2)最小u ij :⎪⎩⎪⎨⎧-≤-≠=其它,如果对每个0,122kj i j ijc x c x i k u (6.4)重申一点,如果c i 是x j 的最近的聚类中心,那么x j 属于组i 。
由于一个给定数据只能属于一个组,所以隶属矩阵U 具有如下性质:n j uci ij,,111⋯=∀=∑=,(6.5)且n uci nj ij=∑∑==11(6.6)另一方面,如果固定u ij 则使(6.2)式最小的最佳聚类中心就是组I 中所有向量的均值:∑∈=ik G x k kii xG c ,1, (6.7)这里|G i |是G i 的规模或∑==n j ij i u G 1。
为便于批模式运行,这里给出数据集x i (1,2…,n )的K 均值算法;该算法重复使用下列步骤,确定聚类中心c i 和隶属矩阵U :步骤1:初始化聚类中心c i ,i=1,…,c 。
典型的做法是从所有数据点中任取c 个点。
步骤2:用式(6.4)确定隶属矩阵U 。
步骤3:根据式(6.2)计算价值函数。
如果它小于某个确定的阀值,或它相对上次价值函数质的改变量小于某个阀值,则算法停止。
步骤4:根据式(6.5)修正聚类中心。
返回步骤2。
该算法本身是迭代的,且不能确保它收敛于最优解。
K 均值算法的性能依赖于聚类中心的初始位置。
所以,为了使它可取,要么用一些前端方法求好的初始聚类中心;要么每次用不同的初始聚类中心,将该算法运行多次。
此外,上述算法仅仅是一种具有代表性的方法;我们还可以先初始化一个任意的隶属矩阵,然后再执行迭代过程。
K 均值算法也可以在线方式运行。
这时,通过时间平均,导出相应的聚类中心和相应的组。
即对于给定的数据点x ,该算法求最近的聚类中心c i ,并用下面公式进行修正:)(i i c x c -=∆η (6.8)这种在线公式本质上嵌入了许多非监督学习神经元网络的学习法则。
6.2.3 模糊C 均值聚类模糊C 均值聚类(FCM ),即众所周知的模糊ISODA TA ,是用隶属度确定每个数据点属于某个聚类的程度的一种聚类算法。
1973年,Bezdek 提出了该算法,作为早期硬C 均值聚类(HCM )方法的一种改进。
FCM 把n 个向量x i (i=1,2,…,n )分为c 个模糊组,并求每组的聚类中心,使得非相似性指标的价值函数达到最小。
FCM 与HCM 的主要区别在于FCM 用模糊划分,使得每个给定数据点用值在0,1间的隶属度来确定其属于各个组的程度。
与引入模糊划分相适应,隶属矩阵U 允许有取值在0,1间的元素。
不过,加上归一化规定,一个数据集的隶属度的和总等于1:∑==∀=ci ijn j u1,...,1,1 (6.9)那么,FCM 的价值函数(或目标函数)就是式(6.2)的一般化形式:∑∑∑====ci njij m ijci ic d uJc c U J 1211),...,,(, (6.10)这里u ij 介于0,1间;c i 为模糊组I 的聚类中心,d ij =||c i -x j ||为第I 个聚类中心与第j 个数据点间的欧几里德距离;且[)∞∈,1m 是一个加权指数。
构造如下新的目标函数,可求得使(6.10)式达到最小值的必要条件:∑∑∑∑∑∑=====-+=-+=nj ci ijjci njij mijn j ci ij j c n c ud uu c c U J c c U J 111211111)1()1(),...,,(),...,,,...,,(λλλλ (6.11)这里λj ,j=1到n ,是(6.9)式的n 个约束式的拉格朗日乘子。
对所有输入参量求导,使式(6.10)达到最小的必要条件为:∑∑===nj mijnj jm iji u x uc 11 (6.12)和∑=-⎪⎪⎭⎫ ⎝⎛=ck m kjij ij d d u 1)1/(21(6.13)由上述两个必要条件,模糊C 均值聚类算法是一个简单的迭代过程。
在批处理方式运行时,FCM 用下列步骤确定聚类中心c i 和隶属矩阵U[1]:步骤1:用值在0,1间的随机数初始化隶属矩阵U ,使其满足式(6.9)中的约束条件 步骤2:用式(6.12)计算c 个聚类中心c i ,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:mnum(n)=0;end[rows,cols]=size(IRIS_training_data);for I=1:rowsif IRIS_training_data(I,6)==1IRIS_training_data(I,5)=2;endif IRIS_training_data(I,7)==1IRIS_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:mfor I=1:4class{J}(I)=test(c(J),I);endendwhile H==1for I=1:rowsfor K=1:md(K)=sqrt((class{K}(1)-test(I,1))^2+(class{K}(2)-test(I,2))^2+(class{K}(3)-test(I,3))^2+(class{K }(4)-test(I,4))^2);end[y,t]=min(d);num(t)=num(t)+1;test(I,5)=t;for J=1:4last_class{t}=class{t};class{t}(J)=(test(I,J)+class{t}(J)*num(t))/(num(t)+1);endend% 判断结束条件是否满足for K=1:md(K)=sqrt((last_class{K}(1)-class{K}(1))^2+(last_class{K}(2)-class{K}(2))^2+(last_class{K}(3) -class{K}(3))^2+(last_class{K}(4)-class{K}(4))^2);end[y,t]=max(d);if y<0.0001;break;endend% 与实际的分类对比计算出预测的正确率for I=1:mclass11(I)=0;class21(I)=0;class31(I)=0;endfor I=1:3:rowsif test(I,5)==1class11(1)=class11(1)+1;elseif test(I,5)==2class11(2)=class11(2)+1;else class11(3)=class11(3)+1;end[right_num,t]=max(class11);endfor I=2:3:rowsif test(I,5)==1class21(1)=class21(1)+1;elseif test(I,5)==2class21(2)=class21(2)+1;else class21(3)=class21(3)+1;endright_num=right_num+max(class21);for I=3:3:rowsif test(I,5)==1class31(1)=class31(1)+1;elseif test(I,5)==2class31(2)=class31(2)+1;else class31(3)=class31(3)+1;endendright_num=right_num+max(class31);right_num=(right_num/rows)*100;disp(sprintf('利用k_means给iris数据集分类的正确率为:%d%%',right_num));。