提高面向对象型软件中类阶层质量预测准确度的方法
技术领域
本发明涉及的是一种软件开发技术领域的方法,具体地说,涉及的是一种提高面向对象型软件中类阶层(Class Hierarchy)质量预测准确度的方法。
背景技术
软件质量预测系统所采用的软件质量模型需合理反映各软件模块的属性特征和功能效用,其有效描述软件模块特征空间的概率分布的程度决定了软件质量预测的性能(准确率、可靠性等)。对于大型工业软件而言,尽早地发现和定位软件中可能存在的错误,可以节省人力成本,缩短软件开发时间,提高产品质量和客户满意度。通常的软件质量预测都是基于软件度量的,通过训练和学习来自于较早或相似版本软件的数据集,建立起软件质量预测机制,从而对开发中的软件来进行质量预测和错误定位。软件模块通常被分为易出错和不易出错两个类别进行训练学习。对于实际中的大型工业软件,例如使用在通信领域的百万行级别的代码,通常采用计算比较复杂,精确度较高的多元统计分析或者是比较先进的学习方法。
经对现有技术的文献检索发现,L.Briand等人在《Journal of Systems andSoftware》Vol.51,pp.245-273,2000发表的“Exploring the relationshipsbetween design measures and software quality in object-oriented systems”(《系统与软件期刊》,“探索在面向对象系统中设计度量和软件质量的关系”)应用了主成分分析和数理回归,将软件度量值与软件的错误趋势进行了相关性分析。实验包括各度量相互间和自身内部各种度量的主成分分析,并运用规模度量建造预测模型分析和预测了由马里兰大学计算机系学生开发的软件质量与软件度量之间的相关性。
而更早有T.M.Khoshgoftaar等人在1995年的《IEEE Transactions onNeural Networks》Vol.8,No.4,pp.902-909上发表了的“Application ofneural networks to software quality modeling of a very largetelecommunications systems”(《IEEE神经网络学报》,“应用支持向量机预测有缺陷倾向的软件模块”)。该文将每个函数所涉及的文件视为一个软件模块,采用9种软件度量,将所有软件模块转化为对应的特征向量,然后使用神经网络进行训练并预测了某大型通信软件的质量,这是一次将神经网络类的学习方法运用到软件质量预测领域的突破。近来,另有K.0.Elish等人在《Journalof Systems and Software》Vol.81,No.5,pp.649-660,2008上发表了“Predicting defect-prone software modules using support vectormachines”(《系统与软件期刊》,“应用支持向量机预测有缺陷倾向的软件模块”)。他们使用了RBF(径向基函数)和支持向量机学习分析了来自于NASA的一些大型航天软件的软件质量,该文将软件中的每个逻辑类视为一个基本的软件模块,分析预测每个软件模块发生错误的概率。
上述的软件质量预测方法都是将软件按照一定的大小和等级进行固定的模块化,进行软件度量和特征提取后,采取某种数理统计或者学习的方法进行训练和预测,这样的训练方法能够达到一定的预测目的,并有不少的实际应用,但仍然存有一定的局限性:首先软件模块化过程中,如果划分过小,将导致不同的模块之间差异很小,难以进行区分和定位;划分过大,将导致软件质量预测定位过于宽泛,达不到预测的目的。目前对于面向对象型软件的模块化方法比较少,仅存在函数、方法、类等少数几种依据,存在定位过小过细的问题,在软件开发初期,这样的预测比较费力而且效果不好。其次面向对象型软件的继承特征在将软件模块化成各类或更小模块的过程中,有很大一部分的结构化信息损失掉了,这样导致最后的软件质量预测的准确率难以提高。
发明内容
本发明针对现有技术的上述不足,提出了一种提高面向对象型软件中类阶层质量预测准确度的方法,使其可以采用先进的分层核和支持向量机技术,应用于面向对象型软件系统的类阶层的模块,提高软件质量预测的准确率。
本发明是通过以下技术方案实现的,本发明利用软件度量集,将面向对象型软件中的类转化为相应的特征向量,并通过树形数据结构将一个类阶层中的所有类封装到一个树形结构的知识表示形式当中。此树形结构包含此类阶层所有类的特征向量以及它们之间的结构信息和继承关系。然后使用分层核的改进型支持向量机预测机制。
本发明包括如下步骤:
第一步,提取面向对象型软件模块特征:采用树形结构的知识表示方法,将软件中的每一个类映射封装为树形结构的一个节点。每一个节点包含由特征提取而来的属性-数值向量和结构化信息。其中属性-数值向量是通过软件度量提取而来,向量中的每一位代表使用某一个软件度量对一个类进行测量所得到的值。而结构化信息则包含此节点的父结点和子节点的信息,表明此节点在类阶层中的位置。结构化信息的来源是在面向对象型软件中所特有的继承关系。例如如果一个类A继承了另外一个类B的某些代码和方法,则称A为B的子类,反过来,B也是A的父类,在类阶层中,A和B就是对应的子节点和父结点。
第二步,建立类阶层聚类操作的树形数据结构:面向对象型软件的逻辑模块类与类之间存在着继承的关系,这样的关系,通常可以通过抽象的继承树来表示。使用继承树的拓扑结构来构造类模块的树形数据结构。
第三步,类阶层的封装聚类:结合类阶层的树形数据结构,将各个类映射到对应的向量空间。由于每个类具有正标识(不易出错的类)或者负标示(易出错的类),软件质量预测的任务可转化为在向量空间里进行的分类问题。一般而言,在高维向量空间里,两类数据并不线性可分。因此需要将这些在向量空间里面不可线性区分的数据点,映射到另外一个特征空间里,使两类数据线性拆分。
第四步,选用分层核及对应产生的核矩阵来存储树形结构中的信息:采用适用于对面向对象中的类阶层进行信息保留和处理的分层核函数,处理类阶层树形数据结构,计算类阶层之间的内积。使用嵌入分层核的改进型支持向量机(SVM),并使用已有的经过完整测试的较早或者相似软件中的软件模块来构造训练数据集。
本发明采用支持向量机处理样本的时候只使用通过‘核’计算出来的两两样本间的内积,从而避免“维度灾难”的产生。所谓‘核’,就是样本在高维空间的内积。
所述分层核函数KL(X,Y)的递归定义如下,其通过分解树形结构而来:
KL(F,φ)=KL(φ,F)=0
KL(F1,F2)=KSET(lt(F1),lt(F2))×(1+KL(lr(F1),lr(F2)))+KL(lr(F1),F2)+KL(F1,lr(F2))
-KL(lr(F1),lr(F2))
其中和lr(F)返回树形结构的第一层,lt(F)返回剩下的树形结构。KSET为定义在集合上的核函数,
这里,KL(X,Y)表示分层核函数,其为两个树形结构X和Y的泛函:
如果X和Y中有一个为空集,KL(X,Y)=0
即:KL(F,φ)=KL(φ,F)=0,这里φ表示空集,F为任意树形结构。
当X和Y皆不为空集时,KL(X,Y)可以通过递归形式表示:
KL(F1,F2)=KSET(lt(F1),lt(F2))×(1+KL(lr(F1),lr(F2)))+KL(lr(F1),F2)+KL(F1,lr(F2))
-KL(lr(F1),lr(F2))
· 为定义在集合上的核函数,为两集合中两两元素内积之和,这里的Kc可以为线性核,高斯核等常用核函数
·lr(F)函数:得到树形结构F的顶层节点集合,即F中没有任何父节点的节点,返回也为一个树形结构。
·lt(F)函数:为原树形结构F除去lr(F)之后剩下的树形结构。
第五步,基于分层核的改进型支持向量机的训练:对于原始数据集,须经过预处理和数据平衡两道程序之后,才能放入到改进型支持向量机(SVM)的训练当中,训练好的改进型支持向量机就可以对未测试和开发中的软件模块进行质量预测,此软件质量预测模型的应用对象也是类阶层(Class Hierarchy)。在训练好的改进型支持向量机中输入需要进行预测的软件模块对应的树形数据结构,可以得到[-1,+1]间的输出,如果输出大于0,软件模块质量不易出错;反之,输出小于0的软件模块质量易出错,需要关注。
所述面向对象型软件模块特征提取,当面向对对象型软件中最常用的基本模块为逻辑上的一个类(Class),首先对软件中所有的类进行编号和特征提取,将其构造为对应的向量组,从而进行分析处理。这样的特征提取需要选用一组针对面向对象型软件的软件度量(例如表1所示),作为构造向量的依据,然后使用软件度量工具或软件,对软件中的每个类进行测量。例如对第i个类的测量结果为
,其中
为使用第j个软件度量对这训练集中的第i个类进行测量所得到的值。初步测得的向量组进行一定的预处理,如归一化,属性选择之后,与结构化信息一起构成了一个节点。
所述建立类阶层聚类操作的树形数据结构,当首先对同在一个继承树中的类进行聚类处理,根据继承声明的关键字private,public和protected对软件系统的源代码进行文本搜索,寻找出所有对应的父子类的二元关系。然后依据继承树中的每一个类至少与此继承树其他类中的一个具有父子继承关系,使用聚类程序将同一继承树中的类各自聚集在一起。并按照继承关系从上到下排列好,由此便构成了类阶层的树形知识表示,在实际中,为一个个树形数据结构。
本发明利用软件度量集,将面向对象型软件中的类转化为相应的特征向量,并通过树形数据结构将一个类阶层中的所有类封装到一个树形结构的知识表示形式当中。此树形结构包含此类阶层所有类的特征向量以及它们之间的结构信息和继承关系。然后使用分层核的改进型支持向量机预测机制。对于面向对象型软件系统,本发明提出了一套完整的软件质量预测模型的训练方法,用此方法训练得到的预测模型,应用广泛、紧密联合实际、准确性强、可靠性高,是保证高效率高准确率预测软件模块质量的关键。
附图说明
图1为建立类阶层聚类操作的树形数据结构示意图;
图2为使用分层核函数的软件质量预测流程示意图。
具体实施方式
下面结合附图对本发明的实施例作详细说明:本实施例在以本发明技术方案为前提下进行实施,给出了详细的实施方式和具体的操作过程,但本发明的保护范围不限于下述的实施例。
本实施例先依据传统的软件度量的方法,采用一个软件度量的集合(如表1):
表1 可以选用的软件度量
软件度量名称(缩写) | 描述 |
CBO | 对象类之间的耦合 |
CSAO | 类大小(属性和操作) |
CSA | 类大小(属性) |
CSI | 类专用索引 |
CSO | 类大小(大小) |
DIT | 在继承树中的深度 |
LOC | 代码总行数 |
LOCM | 类中方法调用变量的不一致程度 |
NAAC | 新增属性数目 |
NAIC | 继承属性数目 |
NAOC | 新增操作数目 |
NOIC | 继承操作数目 |
NPavgC | 方法中参数的平均个数 |
NSUB | 子类个数 |
Osavg | 操作的平均大小 |
PA | 私用属性利用率 |
PPPC | 公用/受保护成员百分比 |
RFC | 类反馈 |
SLOC | 源代码行数 |
TLOC | 代码总行数 |
WMC | 类中的加权方法数 |
1、提取面向对象型软件模块特征:
第i个类的测量结果 ,其中为使用第j个软件度量对这训练集中的第i个类进行测量所得到的值。得到基本的训练向量集合之后,需要将每一个属性同比缩放到[0,1]区域,其缩放方法为:
其中,
为第i个软件度量对所有类进行测量后得到的最大值。这样,就得到了每个节点对应的向量值。所有的类转化为了一个向量组,然后进行预处理和软件度量选择(见2.2)。
2、建立类阶层聚类操作的树形数据结构:
得到包含各个类的向量值和结构关系的数据节点之后,根据继承关系,将各个类的结构信息和对应的特征向量封装到各个树形结构中,如图1所示。这样,每个类阶层就被一个信息量丰富、简洁的树形数据结构所抽象表示出来,可以进行随后的训练、学习和预测了。
3、类阶层的封装聚类,操作流程简述如下:
·根据继承声明的关键字private,public和protected对软件系统的源代码进行文本搜索,寻找出所有对应的父子类的二元关系,并记录。
·根据记录的二元关系组,从任一节点a开始,寻找此节点的父节点和子节点,将其加入此集合中,直到a的所有父节点和子节点都包含在集合中。然后依次对新加入集合的节点进行与a一样的操作,将他们的父节点和子节点也加入集合,直到没有新的节点加入为止,由此完成了各类阶层的聚类。
·按照继承关系将各阶层中的类从上到下排列好,构成了类阶层的树形数据结构。
4、选用分层核及对应产生的核矩阵来存储树形结构中的信息
为了能够学习和预测用树形结构所表示的类阶层的软件质量(易出错或不易出错),需要使用一个可以处理结构化数据的核函数作为信息储藏的手段,这里使用的核函数是特别为类阶层所设计的分层核函数。其对于处理继承关系的分层结构十分有效。分层核函数KL的递归定义如下,其通过分解树形结构而来。
KL(F,φ)=KL(φ,F)=0
KL(F1,F2)=KSET(lt(F1),lt(F2))×(1+KL(lr(F1),lr(F2)))+KL(lr(F1),F2)+KL(F1,lr(F2))
-KL(lr(F1),lr(F2))
其中lt(F)和lr(F)分别返回剩下的树形结构的第一层。而KSET为定义在集合上的核函数,
5、基于分层核的改进型支持向量机的训练,如图2所示,包括如下几个步骤:
1.1.构造训练集:
训练集的构造如前所述,即将所有的在软件中的类和类阶层,通过树形结构的知识表示方法,转化为学习和训练的对象。此步骤包含特征映射和将类阶层进行封装聚类。最终得到并在改进型支持向量机中使用的是各类阶层的树形数据结构。
1.2.预处理,软件度量选择的操作:
并非起初选择的每一个软件度量都能够在学习和训练中起到作用,有时候甚至会带来负面的效果,影响到最后预测的准确率。我们在开始选择软件度量的时候也尽可能多使用一些软件度量,这样可以更多地反映软件模块的特性。因此对于使用的软件度量需要进行归一化和选择,归一化的过程在前面的知识表示中已经提及,此处不再重复。软件度量的选择主要有2种方式:第一种是在度量取得初步结果之后,如果大部分的类在某一软件度量下测得的属性值为0,则此软件度量测量值可以从特征向量中删除,以免产生过多的噪声。第二种是在训练结束之后,如果支持向量机输出的系数在某一属性上的加权和为零,也可以将其删除。
1.3.平衡训练集:
通常软件质量预测模型将软件模块分为两类,一类为易出错的模块(负类),另一类为不易出错的模块(正类)。由于在易出错的软件模块在整个软件工程中的比例应该较小的一部分,因此,训练过程中必须保证易出错模块的比例不至于太少,可以对正类样本进行抽样或者扩增负类样本的方法来保持训练集众正负样本,即正的类阶层和负的类阶层之间的平衡。一般而言,较少类的百分比不应小于20%。
1.4.训练、预测机制的构建:
本实施例所采用的是一种改进型支持向量机,训练好的改进型支持向量机会将软件模块定义为区分易出错或者不易出错的软件模块(本发明中为类阶层),可以采用二分类的支持向量机,其数学形式如下的最优化问题:
通过求解上述的最优化问题,即可求出相应的各支持向量的系数,从而得到对于每一个类阶层的判断函数:
经过训练后得到的改进型支持向量机并不是最优的,这是由于初始参考模板和算法中的一些参数设置会影响训练的结果。通过选择分层核中的具体参数和对软件度量进行选择,可以得到更为优化的模型。在训练好的改进型支持向量机中输入需要进行预测的软件模块对应的树形数据结构,得到[-1,+1]间的输出,如果输出大于0,软件模块质量不易出错;反之,输出小于0的软件模块质量易出错。
本实施例基于分层核函数的训练方法与传统的训练方法进行了比较,以系统正确预测率作为性能的评价指标,实验结果见表1。从表1中识别率的明显提高可以发现,本实施例的方法具有较高的性能。
表1 基于分层核函数的训练方法与传统方法的对比(全集)
以上实验的对象为一20万行代码级别的工业通信软件,由C++语言编写。主要的功能是实现在SDH系统中的数据交换。本软件共包含420个类,合成之后共175个类阶层,其平均的层数为1.57。由于整个软件数据集是一个非平衡的数据集。质量预测模型的表现还要经过平衡数据集的检验,为此,另构造有一个相对平衡的数据子集,实验结果见表2。
表2 基于分层核函数的训练方法与传统方法的对比(平衡子集)
本实施例分别对来自于此软件的数据全集和子集进行训练和预测,采用多子集区分训练的方法可以使得预测模型有较高的准确率并且避免过拟合的情况出现,实验结果如表1和表2所示。从中实验结果可以得到如下结论:使用分层核函数训练后,得到的软件质量预测模型,与传统的基于支持向量机的模型相比,系统正确分类率有明显提高,对全集的识别率达到87.71%,对于平衡子集的正确预测率达到了89.10%。并且在此训练方法建立的质量预测模型在一类二类错误的控制上也有不错的表现,尤其当数据趋于平衡的时候,尤为明显(表2)。