基于VB与MatrixVB的模糊C均值方法实现
2009-05-12刘超李茂宽王伟华
刘 超 李茂宽 王伟华
摘 要:针对Visual Basic数值计算能力和图像处理能力的不足,不利于系统开发,介绍了模糊C均值法的原理及其基于VB和MatrixVB的实现;该方法将Matlab的强大计算功能与VB的Windows用户界面开发方面优势结合起来,充分发挥各自优势,缩短了软件的开发周期。软件测试结果表明,该计算方法正确,软件界面友好,计算速度快,系统资源消耗少,操作简便易行,能满足数据分类的要求。
关键词:Visual Basic;MatrixVB;模糊C均值;模式识别
中图分类号:TQ15.9;TP311 文献标识码:B 文章编号:1004 373X(2009)02 102 02
Realization of Fuzzy C-Means Based on Visual Basic and MatrixVB
LIU Chao1,LI Maokuan2,WANG Weihua3
(1.PLA General Staff Meteorological and Hydrological Department,Beijing,100081,China;
2.Naval Aeronautical and Astronautical University,Yantai,264001,China;3.Unit 61828 of PLA,Kashi,844200,China)
Abstract:According to the situation that Visual Basic is insufficient in numerical computation,image processing ability and is weak in algorithm development.The theory of fuzzy C-means and the realization of fuzzy C-means by incorporating VBand MatrixVB are introduced.The incorporated advances of Matlab′s powerful calculation function and Visual Basic′s friendly graphic user interface shorten the period of software development by taking the advantages of both.It has been demonstrated by the instance that the calculating procedure is accurate.The software interface is friendly.Beside this,resource expenditure of computer is low and calculating speed is quick,the software is convenient to use.It can fulfill the data clustering problem well.
Keywords:Visual Basic;MatrixVB;fuzzy C-means;pattern recognition
0 引 言
聚类是将一组给定的未知类标号的样本分成内在的多个类别,使得同一类中的样本具有较高的相似度,而不同类中的样本差别大。聚类分析的目的是揭示和刻画数据的内在结构,其内容涉及统计学、生物学、以及机器学习等研究领域,并在模式识别、数据分析和挖掘、图像处理等领域获得了广泛的应用[1]。模糊C均值(Fuzzy C-Means,FCM)算法是一种基于划分的聚类算法,它的思想就是使得被划分到同一类的对象之间相似度最大,而不同类之间的相似度最小。模糊C均值算法是普通C均值算法的改进,普通C均值算法对于数据的划分是硬性的,而FCM则是一种柔性的模糊划分。
目前大多数针对模式识别的软件都是基于Matlab,模糊C均值就已经集成在Matlab语言中。Matlab是集数值分析、矩阵运算、信号处理和图形显示于一体的高性能数学软件,但Matlab也存在其自身的局限性:一般基于Matlab的应用程序不能脱离Matlab集成环境工作,而且编写界面的功能相对较弱,Matlab本身是一种解释性的语言,运行速度非常慢,大大降低了程序的效率。因此,将Matlab与VB有效地集成在一起,实现应用系统的无缝集成,对于有效缩短开发周期,优化系统性能是十分有意义的。介绍用VB与MatrixVB的混编来实现模糊C均值聚类方法。
1 关于MatrixVB 的简介
MatrixVB[2] 是Mathworks 公司针对VB 提供的一个Matlab 组件库(Component Object Model Library) ,它提供了600 多个函数,包括基本的数学运算和功能强大的信号处理、线性代数、串运算及图形图像处理功能等,用来弥补VB 内建函数的不足,主要是针对数学函数而言,它具有Matlab绘图的强大功能,让VB 能很轻易地画出一些数学函数图形,为VB 提供了强大的功能扩展,让程序员更容易地去开发计算应用方面的程序代码。在VB中使用该数学工具包可以避免重复性劳动,可以减少开发人员实现算法和界面设计方面的困难。
2 模糊C均值原理及其实现
模糊C均值(FCM),是用隶属度确定每个数据点属于某个聚类的程度的一种聚类算法。由Bezdek[3]提出了该算法,作为早期硬C均值聚类(HCM)方法的一种改进。
FCM把n个向量x璱(i=1,2,…,n)分为c个模糊组,并求每组的聚类中心,使得非相似性指标的价值函数达到最小。FCM与HCM的主要区别在于FCM用模糊划分,使得每个给定数据点用值在[0,1]间的隶属度来确定其属于各个组的程度。与引入模糊划分相适应,隶属矩阵U允许有取值在[0,1]间的元素。不过,加上归一化规定,一个数据集的隶属度和总等于1:
∑ci=1u璱j=1,衘=1,2,…,n(1)
则FCM的价值函数(或目标函数)就是一般化形式:
J(U,c1,c2,…,c璫)=∑ci=1J璱=∑ci=1∑njum璱jd2璱j(2)
式中,c璱为模糊组i的聚类中心;d璱j=||c璱-x璲||为第i个聚类中心与第j个数据点间的欧几里德距离;且m是一个加权指数。构造如下新的目标函数,可求得使式(2)达到最小值的必要条件:
(U,c1 ,c2,…,c璫 ,λ1,λ2,…,λ璶 )=
J(U,c1,c2,…,c璫 ) + ∑nj = 1λ璲 (∑ci = 1u璱j -1)=
∑ci = 1∑njum璱jd2璱j + ∑nj = 1(∑ci = 1u璱j -1)(3)
式中,λ璲,j=1,2,…,n是式(1)的n个约束式拉格朗日乘子。对所有输入参量求导,使式(2)达到最小的必要条件为:
c璱=∑nj=1um璱jx璲/∑nj=1um璱j(4)
和:
u璱j=1/∑ck=1d璱jd璳kj2/(m-1)(5)
根据上述两个必要条件,模糊C均值聚类算法是一个简单的迭代过程。在批处理方式运行时,FCM用下列步骤确定聚类中心c璱和隶属矩阵U :
步骤1 用值在0,1间的随机数初始化隶属矩阵U,使其满足式(1)中的约束条件。
步骤 2 用式(4)计算c个聚类中心c璱,i=1,2,…,c。
步骤3 用式(2)计算价值函数。如果它小于某个确定的阈值,或它相对上次价值函数值的改变量小于某个阈值,则算法停止。
步骤4 用式(5)计算新的U矩阵。返回步骤2。
通过上面的讨论,不难看出FCM算法需要两个参数,一个是聚类数目C;另一个是参数m。以下利用VB和MatrixVB实现上述算法。首先读入待分类的数据,数据分布如图1所示,是200组二维数据。设置参数:将数据分为3类,初始化隶属度矩阵U,m=2。程序如下所示:
Cluster_N = 3
data_N = 200
Data = vbload("c:\data.mat")‘读入数据并显示
ax = vbaxes(Form1.hWnd)
aa = Data(linspace(1,200,200),1)
bb = Data(linspace(1,200,200),2)
Call scatter(aa,bb,".")
U = randM(Cluster_N,data_N) ‘初始化隶属矩阵
tmp = Sum(U)
tmp = mtimes(ones(Cluster_N,1),tmp)
U = rdivide(U,tmp)
dist = zeros(3,200) ‘初始距离矩阵
算法的输出是C个聚类中心点向量和大小为C×N的一个模糊划分矩阵,这个矩阵表示的是每个样本点属于每个类的隶属度。根据这个划分矩阵,按照模糊集合中的最大隶属原则就能够确定每个样本点归为哪个类。聚类中心表示的是每个类的平均特征,可以认为是这个类的代表点。以下是迭代求取聚类中心和隶属度矩阵的程序:
mf = power(U,2)
center = rdivide(mtimes(mf,Data),
transpose(mtimes(ones(2,1),Sum(transpose(mf)))))
For j = 1 To 200
For i = 1 To 3
a1 = center(i,linspace(1,2,2))
a2 = Data(j,linspace(1,2,2))
dist(i,j) = Sum(power(minus(a1,a2),2))
Next i
Next j
obj_fuc = Sum(Sum(times(power(dist,2),mf)))
tmp = power(dist,-2)
U = rdivide(tmp,mtimes(ones(3,1),Sum(tmp)))
图2是对未知类别的待分类数据进行模糊C均值聚类的最终结果,不同的图形表示不同的类别。
图1 待分类数据
图2 分类后数据
3 结 语
在此介绍VB与MatrixVB混合编程的模糊C均值方法实现,程序在 Windows XPProfessional 版上用MatrixVB4.5和Visual Basic6.0中文版实现,具有效率高,占用系统资源少等优点。文中给出了部分基本代码,可以根据自己的需要进行扩充,并应用于分类处理。这种编程方式既节省了时间,又提高了软件的性能,对于优化系统,缩短软件开发周期很有意义。
参考文献
[1]边肇祺,张学工.模式识别[M].2版.北京:清华大学出版社,2000.
[2]MathWorks.Inc.MatrixVB User′s Guide[Z].2000.
[3]Bezdek J C.Pattern Recognition with Objective Function Algorithms [M].New York:Plenum Press,1981.
[4]王跃强,王纪龙,王云才.VB 程序中实现调用Matlab 的方法[J].计算机应用,2002,2(21):95-96.
[5]何强,何英.Matlab 扩展编程[M].北京:清华大学出版社,2002.
[6]刘炳文.精通Visual Basic6.0中文版[M].北京:电子工业出版社,1999.
[7]黄锡泉.VB与Matlab 无缝接口编程[J].微计算机应用,2005,26(2):238-239.
[8]董樑,李光军,贺仲雄.复杂系统的集对模式识别方法.现代电子技术,2007(2):68-70.
作者简介 刘 超 男,1981年出生,山东青岛人,硕士研究生。研究方向为计算机仿真。
李茂宽 男,1979年出生,山东即墨人,博士研究生。研究方向为图像处理与模式识别。
王伟华 男,1974年出生,河南人。研究方向为计算机仿真。