CN109857653B - 一种基于主动学习的无监督缺陷程序模块识别方法 - Google Patents
一种基于主动学习的无监督缺陷程序模块识别方法 Download PDFInfo
- Publication number
- CN109857653B CN109857653B CN201910042053.2A CN201910042053A CN109857653B CN 109857653 B CN109857653 B CN 109857653B CN 201910042053 A CN201910042053 A CN 201910042053A CN 109857653 B CN109857653 B CN 109857653B
- Authority
- CN
- China
- Prior art keywords
- defect
- data set
- program modules
- prediction data
- defect prediction
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Landscapes
- Stored Programmes (AREA)
Abstract
本发明涉及一种基于主动学习的无监督缺陷程序模块识别方法,属于软件质量保障领域。本发明包括:1)从待测项目中抽取程序模块进行度量,形成数据集D;2)采用聚类方法将D内的程序模块分为可能有缺陷和可能没有缺陷两类,分别随机选k1个模块标记,形成已标记数据集L,和未标记数据集U,基于L构建预测模型;3)判断缺陷模块数查全率是否达预期,若达到,终止标记过程,否则执行步骤4);4)使用两阶段标记方法从U中选出一定数量的程序模块进行标记并添加到L中;5)基于L构建缺陷预测模型,执行步骤3)。本发明方法可以在不存在历史标记数据集的情况下,花费较少的标记代价,检测到被测项目内的绝大部分有缺陷程序模块。
Description
技术领域
本发明属于软件质量保障领域,具体涉及一种基于主动学习的无监督缺陷程序模块识别方法。
背景技术
软件缺陷预测通过分析软件历史仓库,构建缺陷预测模型,来预先识别出被测项目内的潜在缺陷程序模块,通过将更多测试资源优先分配到这些程序模块,可以达到优化测试资源分配,提高软件产品质量的目的。软件缺陷预测模型依赖于高质量的数据集,但是在实际的软件测试场景中,需要执行软件缺陷预测的项目大部分都是新的项目。我们可以通过一些现有的工具较为容易的抽取出程序模块并对这些程序模块进行度量,然而,由于标记这些提取的程序模块需要专业领域知识,因此,这项工作十分耗时,又容易出错。
由于未标记的缺陷预测数据集较为容易搜集,而已标记的缺陷预测数据集需要花费很大的开销,主动学习方法是解决这一类问题的一种有效方法。主动学习不同于其他机器学习的地方在于采样策略的使用。采样策略的目的是在最少标记代价下获得能最大程度提高分类器的泛化性能的标记样本集。
主动学习算法的迭代过程是:在标记样例集上训练分类器,使用分类器对未标记样例进行分类判断;根据分类结果,使用采样引擎选择部分无标记样例交由专家进行标记;将标记后的样例加入已标记样例集用于分类器的下一次训练。算法的终止条件是标记代价或者分类器的泛化精度达到一定标准为止。
综上所述,为了帮助研究人员能尽可能早地标记出新项目中有缺陷的模块,并且主动学习算法是解决这一类问题比较好的技术之一,我们有必要设计出一种有效的基于主动学习的无监督缺陷程序模块识别方法。本发明由此而生。
发明内容
本发明的目的在于提供基于主动学习的无监督缺陷程序模块识别方法,一方面通过使用基于聚类的方法可以使标记人员只花费很少的代价就可以提供模型训练的初始数据集,而不需要采用传统的随机标记方法,另一方面,通过使用主动学习算法在每一轮迭代当中提升模型的性能,并且使用训练出来的模型对未标记的模块进行预测,根据预测结果帮助标记人员尽早地找出程序中的缺陷模块;具有缺陷预测模型构建时间短和模型预测性能高的优点,从而可以更为精准的预测出被测项目内的潜在缺陷程序模块,最终达到帮助标记人员花费十分少的代价就可以找出程序中绝大部分缺陷模块这一目的。
为实现上述目的,本发明提供了一种基于主动学习的无监督缺陷程序模块识别方法,包括如下步骤:
(1)挖掘待预测软件项目托管的版本控制系统和缺陷跟踪系统,从中抽取程序模块进行度量,形成缺陷预测数据集D;
(2)对缺陷预测数据集D执行基于聚类的方法,将缺陷预测数据集D内的程序模块划分到两个不同的聚类中,其中一个聚类包含的程序模块可能含有缺陷,而另一个聚类包含的程序模块可能不含有缺陷,随后从这两个聚类中分别随机选出k1个程序模块进行人工标记,从而产生初始的已标记缺陷预测数据集L和剩余的未标记缺陷预测数据集U(U=D-L),最后基于已标记缺陷预测数据集L,借助支持向量机构建缺陷预测模型ef;
(3)使用项目缺陷模块数预估方法估算出所述待预测软件项目内的缺陷程序模块数defectNum,已标记缺陷预测数据集L中已经标记出的缺陷程序模块数为Ldefective,计算Ldefective与defectNum的比值,如果比值大于所述预设阈值,则终止标记过程并返回所有已经标记出的缺陷程序模块,提交给测试人员进行缺陷的修复,如果比值小于或等于所述预设阈值,则继续执行步骤(4)。
(4)从未标记缺陷预测数据集U中,使用两阶段标记方法选出指定数量的程序模块进行标记,具体包括以下步骤:
(4-1)基于缺陷预测模型ef,从未标记缺陷预测数据集U中选出k2个最接近缺陷预测模型ef划分超平面的程序模块进行标记并将这些程序模块设置为已标记,将这些已标记程序模块添加到已标记缺陷预测数据集L中,并从未标记缺陷预测数据集U中移除这些已标记程序模块;
(4-2)使用当前缺陷预测模型对未标记缺陷预测数据集U中未标记程序模块进行预测并得到每个程序模块含有缺陷的概率值,将每个程序模块的概率值从高到低进行排序,按照顺序选择前k2个程序模块进行标记并将这些程序模块设置为已标记,将这些已标记程序模块添加到已标记缺陷预测数据集L中,并从未标记缺陷预测数据集U中移除这些已标记程序模块;
(5)确定已标记缺陷预测数据集L内有缺陷的程序模块数Numdefetive和无缺陷的程序模块数Numclean,如果Numdefetive<Numclean,采用随机欠采样方法解决数据集内存在的类别不平衡问题,即随机删除无缺陷的程序模块,直至Numdefetive=Numclean,随后基于上述预处理后的已标记缺陷预测数据集,借助支持向量机重新构建缺陷预测模型,并执行步骤(3)。
优选地,步骤(2)中的基于聚类的方法包括如下步骤:
(2-1)将缺陷预测数据集D视为矩阵normA,并计算出矩阵normA的权重邻接矩阵W,Wij代表矩阵normA中第i个模块和第j个模块的相似性,所述权重邻接矩阵W的计算公式为:W=normA×normAT,其中normAT是矩阵normA的转置矩阵;
(2-2)将W矩阵中取值小于0的元素以及主对角线上的元素的取值重新设置为0,而其他元素取值保持不变;
(2-3)计算权重邻接矩阵W的标准化拉普拉斯矩阵Lsym,其中矩阵I是和矩阵W维度相同的单位矩阵,矩阵G是所述标准化拉普拉斯矩阵Lsym对应的图的度矩阵,其计算方法为:依次将权重邻接矩阵W每一行的元素相加得到一组数值,然后将这些数值依次放在矩阵G的主对角线上,并且矩阵G的其他元素取值设置为0。矩阵为将矩阵G中主对角线的每个元素取值开根号并取倒数;
(2-4)对所述标准化拉普拉斯矩阵Lsym执行特征分解,可以得到一组特征值和对应的特征向量,随后选出第二小的特征值对应的特征向量λ;
(2-5)使用特征向量λ对缺陷预测数据集D进行聚类:首先计算随后对λ1除以它的L2范数,即令接着将λ1向量中的取值和缺陷预测数据集D中的程序模块建立对应关系;最后将λ1向量中取值大于0的元素对应的程序模块放到聚类C1中,而将取值小于或等于0的元素对应的程序模块放到聚类C2中;
(2-6)将缺陷预测数据集D中每个程序模块的特征值相加,并记为该程序模块的rs值;然后计算出C1聚类和C2聚类内包含的程序模块的rs均值,分别记为mean(rs[C1])和mean(rs[C2]),如果mean(rs[C1])>mean(rs[C2]),则聚类C1包含的程序模块可能含有缺陷,反之,则聚类C2包含的程序模块可能含有缺陷;
优选地,步骤(3)中的项目缺陷模块数预估方法包括如下步骤:
(3-1)计算出缺陷预测数据集D中每个程序模块到缺陷预测模型ef划分超平面的距离,并存储在数组Ds中,对U中所有程序模块赋给临时标签,并将这些程序模块都临时标记为无缺陷模块,将已标记缺陷预测数据集L中的标签值和未标记缺陷预测数据集U中的临时标签值存储在数组label1中,然后将变量posNum和posNumLast的取值设置为label1数组中取值为1的元素数;
(3-2)基于Ds数组和label1数组构建训练集trainingData,所述训练集trainingData包括有1个特征,所述特征对应于Ds数组,所述训练集trainingData的类特征对应于label1数组,基于所述训练集trainingData,使用Logistic回归方法构建模型es,所述Logistic回归方法的正则化系数为n1/(m-n2),其中,m为缺陷预测数据集D中的程序模块数,n1为label1数组中取值为1的元素数为n1,n2为已标记缺陷预测数据集L中的缺陷模块数;
(3-3)使用模型es对未标记缺陷预测数据集U中的程序模块进行预测,按照其含有缺陷的概率,从大到小进行排序,并存储在数组pro中,令count=0,cumulate和sample为空集,依次遍历数组pro,将pro对应模块添加到cumulate集合,并将模块对应的预测概率值累加到count变量,当count变量取值大于1时,将cumulate集合中的第一个模块取出并添加到集合sample中,同时将count变量的取值重置为0,cumulate集合重置为空集;当遍历数组pro结束后,将sample集合中的模块临时标记为有缺陷并更新label1数组,并将label1中取值为1的元素数赋值给变量posNum;如果变量posNum的取值与变量posNumLast的取值相等,则项目缺陷模块数预估方法的评估过程结束,并返回变量posNum的取值作为估算出被测项目内的缺陷程序模块数defectNum,否则将变量posNum的值赋给变量posNumLast,并执行步骤(3-2)。
本发明所提供的基于主动学习的无监督缺陷程序模块识别方法,首先借助基于聚类的方法构建出高质量的缺陷预测数据集作为初始训练集。随后借助两阶段方法选出指定数量的模块进行标记,一方面可以提高随后构建的缺陷预测模型的性能。另一方面可以尽早识别出缺陷模块并进行标记。最后该方法借助项目缺陷模块数预估方法可以自动判断何时停止模块的标记过程。在企业不存在任何历史标记数据集的时候,有助于测试人员花费较少的程序模块标记代价,就可以检测到被测项目内的绝大部分的有缺陷程序模块,从而可以有效提高开发出的软件产品质量。
附图说明
图1是本发明实施例提供的一种基于主动学习的无监督缺陷程序模块识别方法的总体流程图;
图2是本发明实施例提供的方法进行标记模块和用传统方法标记模块的效果对比图;
图3是本发明实施例提供的使用项目缺陷模块数预估方法控制标记停止是否准确的示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部实施例。基于本发明中实施例,本领域普通技术人员在没有做出创造性劳动前提下,所获得的所有其他实施例,都属于本发明保护范围。
图1为本发明实施例提供的一种基于主动学习的无监督缺陷程序模块识别方法的总体流程图。如图1所示,该方法包括如下步骤:
(1)挖掘软件项目托管的版本控制系统和缺陷跟踪系统,从中抽取程序模块,模块粒度可以根据实际的测试需求设置为包、文件或类等,随后借助软件度量工具,譬如Understand工具,对抽取出的程序模块进行自动度量,最终形成缺陷预测数据集D。
发明人以某个实际项目的缺陷预测数据集作为示例,该缺陷预测数据集部分数据如表1所示:
表1缺陷预测数据集示例
该缺陷预测数据集共考虑了61种度量指标,累计抽取了1862个程序模块,由于篇幅所限,这里仅列举了部分数据。
(2)对缺陷预测数据集D执行基于聚类的方法,该方法可以将缺陷预测数据集D内的程序模块划分到两个不同的聚类中,其中一个聚类内包含的程序模块可能含有缺陷,而另一个聚类内包含的模块可能不含有缺陷。随后从这两个聚类中分别随机选出k1个程序模块,k1的取值可以设置为5,并对这些程序模块进行人工标记,从而产生初始的已标记缺陷预测数据集L和剩余的未标记缺陷预测数据集U,U=D-L。最后基于已标记缺陷预测数据集L,借助支持向量机构建出初始缺陷预测模型。
(3)使用项目缺陷模块数预估方法来判断缺陷模块查全率是否达到预期。项目缺陷模块数预估方法可以估算出待预测软件项目内的缺陷程序模块数defectNum,数据集L中已经标记出的缺陷模块数为Ldefective,假设预设阈值为95%,如果Ldefective>95%×defectNum,则认为目前的缺陷模块查全率已经达到了预期,终止标记过程并返回所有已经标记出的缺陷模块,提交给测试人员进行缺陷的修复,否则继续执行步骤(4)。
(4)从未标记缺陷预测数据集U中,使用两阶段标记方法选出指定数量的程序模块进行标记。首先在第一阶段,基于不确定策略的主动学习方法,从未标记的模块中选出k2个模块进行标记并将这些模块设置为已标记。具体来说:基于已有的缺陷预测模型,从U中选取k2个最接近划分超平面的样本,将这些模块添加到L中,并从U中移除这些标记模块。这一阶段的目的是可以提高随后构建的缺陷预测模型的性能。随后在第二阶段,根据已有的缺陷预测模型对未标记缺陷预测数据集U中未标记程序模块进行预测并得到每个程序模块可能含有缺陷的概率值,将每个程序模块的概率值从高到低进行排序,并选择前k2个程序模块进行标记并将这些模块设置为已标记,即将这些已标记程序模块添加到已标记缺陷预测数据集L中,并从未标记缺陷预测数据集U中移除这些已标记程序模块,这一阶段的目的是可以尽早识别出缺陷模块并进行标记。
(5)分析已标记缺陷预测数据集L,假设该数据集内有缺陷的模块数和无缺陷的模块数分别为Numdefetive和Numdeclean。如果Numdefetive<Numdeclean,采用随机欠采样方法解决类别不平衡问题,即随机删除无缺陷的模块,直至Numdefetive=Numdeclean。随后基于上述预处理后的已标记缺陷预测数据集,借助支持向量机构建缺陷预测模型,并执行步骤(3)。
作为优选地实施方式,步骤(2)中的基于聚类的方法包括如下步骤:
(2-1)将缺陷预测数据集D视为矩阵normA。
假设本实验(后记为实验1)搜集到的缺陷预测数据集D如表2所示,其含有21个程序模块,V1-V5代表不同的度量元,即特征。
表2实验1缺陷预测数据集
将实验1缺陷预测数据集D视为矩阵normA,则矩阵normA可表示如下:
不难看出normA是一个21行5列的矩阵。随后计算出矩阵normA的权重邻接矩阵W,该矩阵可用于衡量不同模块之间的相似性。首先计算W=normA×normAT,其中normAT是矩阵normA的转置矩阵。Wij代表矩阵normA中第i个模块和第j个模块的相似性,其本质是用未执行标准化处理的皮尔逊相关系数来度量模块间的相似性,Wij>0表示两个模块呈正相关性,Wij=0表示两个模块不存在相关性,Wij<0表示两个模块呈负相关性。其计算结果如下所示:
不难看出W是一个21行21列的对称矩阵。由于该步骤仅需关注正相关性,因此,将W矩阵中取值小于0的元素以及主对角线上的元素的取值重新设置为0,而其他元素取值保持不变。经过这两步操作,最终得到的权重邻接矩阵W为:
(2-2)计算权重邻接矩阵W的标准化拉普拉斯矩阵Lsym,其中矩阵I是和矩阵W维度相同的单位矩阵,矩阵G是拉普拉斯矩阵对应的图的度矩阵,其计算方法为:依次将权重邻接矩阵W每一行的元素相加可得到一组数值,然后将这些数值依次放在矩阵G的主对角线上,并且矩阵G的其他元素取值设置为0。不难看出,矩阵G为一个对角矩阵。
基于上述实例,度矩阵G为:
通过计算,我们可以得到标准化的拉普拉斯矩阵Lsym为:
(2-3)对Lsym执行特征分解,可以得到一组特征值和对应的特征向量,随后选出第二小的特征值对应的特征向量λ。
基于上述实例,可以得到21个特征值和21个对应的特征向量。将这21个特征值从大到小进行排序,最终结果如表3所示。
表3 21个特征值的排序表
特征编号 | 特征值 |
1 | 1.472553999 |
2 | 1.171838118 |
3 | 1.168623378 |
4 | 1.16635478 |
5 | 1.164193245 |
6 | 1.162220597 |
7 | 1.156135954 |
8 | 1.139347245 |
9 | 1.120706241 |
10 | 1.119019249 |
11 | 1.117759394 |
12 | 1.117210451 |
13 | 1.101087628 |
14 | 1.095096936 |
15 | 1.083963163 |
16 | 1.074964396 |
17 | 1.044772732 |
18 | 0.998398882 |
19 | 0.510084909 |
20 | 0.015668703 |
21 | -4.44E-16 |
不难看出,第二小的特征值为第20号特征值,其对应的特征向量λ为:
λ=(-0.30153260 -0.29958670 … … 0.20254553 -0.30157705)T
基于上述实例,最终λ1向量为:
λ1=(-0.2943795 -0.2944304 … … 0.1584258 -0.2946058)T
λ1向量中的取值和缺陷预测数据集D中的程序模块对应如下表所示:
表4向量中的取值与缺陷预测数据集D中的程序模块对应表
程序模块编号 | λ1 |
0 | -0.29438 |
1 | -0.29443 |
2 | -0.29464 |
3 | 0.157907 |
4 | 0.164494 |
5 | 0.164203 |
6 | 0.157076 |
7 | 0.152342 |
8 | 0.159189 |
9 | -0.29453 |
10 | 0.163058 |
11 | 0.158875 |
12 | 0.143661 |
13 | -0.27838 |
14 | 0.160264 |
15 | 0.162253 |
16 | 0.163405 |
17 | -0.27124 |
18 | -0.29458 |
19 | 0.158426 |
20 | -0.29461 |
接着将λ1向量中的取值和缺陷预测数据集D中的模块建立对应关系。最后将λ1向量中取值大于0的元素对应的模块放到聚类C1中,而将取值小于或等于0的元素对应的模块放到聚类C2中。
基于上述实例,最终结果如下所示:
C1={3,4,5,6,7,8,10,11,12,14,15,16,19}
C2={0,1,2,9,13,17,18,20}
(2-5)一般来说,特征取值更大的模块,其含有缺陷的可能性也越高。基于上述假设,该步骤可以确定一个聚类,其包含的模块可能含有缺陷,而剩余的那个聚类,其包含的模块可能不含有缺陷。具体来说,首先将缺陷预测数据集D中每个模块的特征值相加,并记为该模块的rs值。随后该步骤计算出C1聚类内包含的程序模块的rs均值(即mean(rs[C1]))和C2聚类内包含的程序模块的rs均值(即mean(rs[C2])),如果mean(rs[C1])>mean(rs[C2]),则聚类C1包含的程序模块可能含有缺陷,反之,则聚类C2包含的程序模块可能含有缺陷。
基于上述实例,各个程序模块的rs值如下所示:
rs=[-3.30885500,-3.37445616,-3.45339219,2.87077798,-0.25138742,-0.31822768,5.37444500,15.69278168,2.08611058,-2.79005183,0.13978291,1.52440102,4.27497546,-1.44665396,1.16519718,0.61913795,0.04926344,-2.24527349,-3.83472649,3.31358330,-3.59489022]
其中rs[i]表示第i个模块的rs值。随后我们计算出C1聚类内程序模块的rs均值(即mean(rs[C1]))和C2聚类内程序模块的rs均值(mean(rs[C2])),如果mean(rs[C1])>mean(rs[C2]),则聚类C1包含的程序模块可能含有缺陷,反之,则聚类C2包含的程序模块可能含有缺陷。基于上述实例:
由于mean(rs[C1])>mean(rs[C2]),则C1包含的模块可能含有缺陷,C2包含的模块可能不含有缺陷。
作为优选地实施方式,步骤(3)中的项目缺陷模块数预估方法包括如下步骤:
(3-1)假设当前基于支持向量机构建出的预测模型为ef,首先该步骤计算出D中每个模块到预测模型ef划分超平面的距离,并存储在数组Ds中。其中取值大于0表示对应模块在划分超平面的上方,取值小于0表示对应模块在划分超平面的下方。对U中所有模块赋给临时标签,并将这些模块都临时标记为无缺陷模块,将L中的标签值和U中的临时标签值存储在数组label1中。然后将变量posNum和posNumLast的取值设置为label1数组中取值为1的元素数。
假设实验(记为实验2)搜集到的缺陷预测数据集D如表5所示,其含有20个程序模块,其中V1-V5代表不同的度量元,即特征;实际类型表明程序模块是否含有缺陷,标记类型需要根据是否标记来进一步细分,如果已标记,则与实际类型相同,如果未标记,则取值为-1。
表5实验2缺陷预测数据集及程序模块类型
计算出D中每个程序模块到预测模型ef划分超平面的距离,并存储在数组Ds中,如表6所示:
表6Ds数组取值
程序模块编号 | Ds |
0 | 0.309571 |
1 | 0.999839 |
2 | 1.000656 |
3 | -1.1506 |
4 | -1.00016 |
5 | -1.00033 |
6 | -0.60263 |
7 | -2.26993 |
8 | -1.04857 |
9 | 0.254925 |
10 | 0.708419 |
11 | -1.50011 |
12 | -1.43234 |
13 | 0.830767 |
14 | -1.45731 |
15 | -1.82712 |
16 | -0.57347 |
17 | -1.50385 |
18 | -0.67966 |
19 | -1.52185 |
其中取值大于0表示对应模块在划分超平面的上方,取值小于0表示对应模块在划分超平面的下方。对U中所有模块赋给临时标签,并将这些模块都临时标记为无缺陷模块,将L中的标签值和U中的临时标签值存储在数组label1中。在本例中,我们将模块7到模块9,模块11到模块13,模块15到19临时标记为0,label1数组的取值如表7所示:
表7label1数组取值
程序模块编号 | label1 |
0 | 1 |
1 | 1 |
2 | 1 |
3 | 0 |
4 | 0 |
5 | 0 |
6 | 0 |
7 | 0 |
8 | 0 |
9 | 0 |
10 | 0 |
11 | 0 |
12 | 0 |
13 | 1 |
14 | 0 |
15 | 0 |
16 | 0 |
17 | 0 |
18 | 0 |
19 | 0 |
然后将变量posNum和posNumLast的取值设置为label1数组中取值为1的元素数。基于该实例,变量posNum和posNumLast的取值均为4。
(3-2)基于Ds数组和label1数组可以构建训练集trainingData,如表8所示,该数据集仅含有1个特征,对应于Ds数组,类特征对应于label1数组。
表8 trainingData数据集
程序模块编号 | DS | label1 |
0 | 0.309571 | 1 |
1 | 0.999839 | 1 |
2 | 1.000656 | 1 |
3 | -1.1506 | 0 |
4 | -1.00016 | 0 |
5 | -1.00033 | 0 |
6 | -0.60263 | 0 |
7 | -2.26993 | 0 |
8 | -1.04857 | 0 |
9 | 0.254925 | 0 |
10 | 0.708419 | 0 |
11 | -1.50011 | 0 |
12 | -1.43234 | 0 |
13 | 0.830767 | 1 |
14 | -1.45731 | 0 |
15 | -1.82712 | 0 |
16 | -0.57347 | 0 |
17 | -1.50385 | 0 |
18 | -0.67966 | 0 |
19 | -1.52185 | 0 |
基于trainingData,使用Logistic回归方法构建模型es,假设数据集D中总共含有m个模块,label1数组中取值为1的元素数为n1,已标记数据集中的缺陷模块数为n2,则Logistic回归方法的正则化系数(正则化系数是Logistic回归方法的一个超参数,其可以控制模型的正则化程度)为n1/(m-n2)。
上述实例中,数据集D中总共有20个模块,label1数组中取值为1的元素数为4,已标记数据集中的缺陷模块数为4,则Logistic回归方法的正则化系数取值被设置为0.25(=4/(20-4))。
(3-3)使用模型es对未标记缺陷预测数据集U中的模块进行预测,并按照其含有缺陷的概率,从大到小进行排序,并存储在数组pro中。令count=0,cumulate和sample为空集。依次遍历数组pro,将pro对应模块添加到cumulate集合,并将模块对应的预测概率值累加到count变量。当count变量取值大于1时,将cumulate集合中的第一个模块取出并添加到集合sample中,同时将count变量的取值重置为0,cumulate集合重置为空集。当遍历数组pro结束后,将sample集合中的模块临时标记为有缺陷并更新label1数组,并将label1中取值为1的元素数赋值给变量posNum。如果变量posNum的取值与变量posNumLast的取值相等,则项目缺陷模块数预估方法的评估过程结束,并返回变量posNum的取值作为估算出被测项目内的缺陷程序模块数defectNum,否则将变量posNum的值赋给变量posNumLast,并执行步骤3-2。
基于该实例,使用es对D中未标记模块进行预测,并按照其含有缺陷的概率,从大到小进行排序,并存储在数组pro中,如表9所示:
表9 pro数组取值
基于该数组,当遍历完前三个模块后,发现此时count=0.547827+0.277316+0.272105=1.097248,count值大于1,cumulate集合含有10,16,6这三个模块,我们将模块10添加到sample集合,然后设置cumulate为空集,count=0,继续累加,当继续遍历6个模块后,发现:
count=0.258639+0.200379+0.150828+0.147982+0.143208+0.142797=1.043833,
这时count变量取值大于1,cumulate集合含有18,8,12,14,11,17六个模块,这是将模块18添加到sample集合,并让count=0,设置cumulate为空集,继续遍历,当遍历完pro数组后,count的值不会再大于1,最终返回sample集合中的元素(即模块10和模块18)。将sample集合中的模块临时标记为有缺陷并更新label1数组,并将label1中取值为1的元素数赋值给变量posNum。这时候posNum的取值为6。
由于本实例十分简单,迭代两轮便可满足变量posNum和变量posNumLast取值相等的条件,表10给出迭代过程中训练预测模型es的正则化系数C,sample集合,变量posNum和变量posNumLast的值,最终项目缺陷模块数预估方法估算出被测项目内的缺陷程序模块数defectNum为6。
表10迭代过程中训练预测模型es的正则化系数
迭代次数 | 正则化系数C | sample集合 | posNum | posNumLast |
1 | 0.25 | 10,18 | 6 | 4 |
2 | 0.375 | 10,18 | 6 | 6 |
最后我们基于一个实际项目Mylyn(www.eclipse.org/mylyn/)来评估本发明所提方法的有效性,我们将本发明提出的方法命名为ALHybrid_C。比较的两种基准方法是ConPure和RandomPure。其中基准方法ConPure仅使用基于聚类方法,而RandomPure仅随机选择程序模块进行标记。实际效果如图2所示,其中横坐标表示已经标记的模块比例,纵坐标是缺陷模块的查全率。从图2中我们可以看出,ALHybrid_C要好于另外两种基准方法,并且从实验数据我们可以得知,在审查了60%的模块后,ALHybrid_C可以找出91%的缺陷模块。而RandomPure方法几乎是要得到多少缺陷模块就需要标记多少程序模块,ConPure方法虽然一开始的表现略好,但是到了后面甚至还不如随机方法,由此可见,我们发明的方法比另外两种方法要行之有效。
为了使发明更具实用性,我们采用项目缺陷模块数预估方法来控制我们实验何时停止。当我们期望可以找到95%的缺陷模块时。我们希望实验可以在比较接近95%的地方停止,在使用项目缺陷模块数预估方法进行实验过后,我们画了一张实验结果图,如图3所示。从实验结果图我们可以看出,实际实验在找出96%的缺陷模块后停止迭代,这与我们期望得到的缺陷模块数只有1%的误差。由此可见,我们的发明具有良好的实用性。
上述实例只为说明本发明的技术构思及特点,其目的在于让熟悉此项技术的人能够了解本发明的内容并据以实施,并不能以此限制本发明的保护范围。根据本发明精神实质所做的等价变化或修饰,都应涵盖在本发明的保护范围之内。
Claims (3)
1.一种基于主动学习的无监督缺陷程序模块识别方法,其特征在于包括如下步骤:
(1)挖掘待预测软件项目托管的版本控制系统和缺陷跟踪系统,从中抽取程序模块进行度量,形成缺陷预测数据集D;
(2)对缺陷预测数据集D执行基于聚类的方法,将缺陷预测数据集D内的程序模块划分到两个不同的聚类中,其中一个聚类包含的程序模块可能含有缺陷,而另一个聚类包含的程序模块可能不含有缺陷,随后从这两个聚类中分别随机选出k1个程序模块进行人工标记,从而产生初始的已标记缺陷预测数据集L和剩余的未标记缺陷预测数据集U,最后基于已标记缺陷预测数据集L,借助支持向量机构建缺陷预测模型ef;
(3)使用项目缺陷模块数预估方法估算出所述待预测软件项目内的缺陷程序模块数defectNum,已标记缺陷预测数据集L中已经标记出的缺陷程序模块数为Ldefective,计算Ldefective与defectNum的比值,如果所述比值大于预设阈值,则终止标记过程并返回所有已经标记出的缺陷程序模块,提交给测试人员进行缺陷的修复,如果所述比值小于或等于所述预设阈值,则继续执行步骤(4);
(4)从未标记缺陷预测数据集U中,使用两阶段标记方法选出指定数量的程序模块进行标记,具体包括以下步骤:
(4-1)基于缺陷预测模型ef,从未标记缺陷预测数据集U中选出k2个最接近缺陷预测模型划分超平面的程序模块进行标记并将这些程序模块设置为已标记,将这些已标记程序模块添加到已标记缺陷预测数据集L中,并从未标记缺陷预测数据集U中移除这些已标记程序模块;
(4-2)使用缺陷预测模型对未标记缺陷预测数据集U中未标记程序模块进行预测并得到每个程序模块含有缺陷的概率值,将每个程序模块的所述概率值从高到低进行排序,按照顺序选择前k2个程序模块进行标记并将这些程序模块设置为已标记,将这些已标记程序模块添加到已标记缺陷预测数据集L中,并从未标记缺陷预测数据集U中移除这些已标记程序模块;
(5)确定已标记缺陷预测数据集L内有缺陷的程序模块数Numdefetive和无缺陷的程序模块数Numclean,如果Numdefetive<Numclean,采用随机欠采样方法解决数据集内存在的类别不平衡问题,即随机删除无缺陷的程序模块,直至Numdefetive=Numclean,随后基于上述随机欠采样方法处理后的已标记缺陷预测数据集,借助支持向量机重新构建缺陷预测模型ef,并执行步骤(3);否则直接基于步骤(4-2)处理得到的已标记缺陷预测数据集,借助支持向量机重新构建缺陷预测模型ef,并执行步骤(3)。
2.根据权利要求1所述的基于主动学习的无监督缺陷程序模块识别方法,其特征在于,步骤(2)中的基于聚类的方法包括如下步骤:
(2-1)将缺陷预测数据集D视为矩阵normA,并计算出矩阵normA的权重邻接矩阵W,Wij代表矩阵normA中第i个模块和第j个模块的相似性,所述权重邻接矩阵W的计算公式为:W=normA×normAT,其中normAT是矩阵normA的转置矩阵;
(2-2)将W矩阵中取值小于0的元素以及主对角线上的元素的取值重新设置为0,而其他元素取值保持不变;
(2-3)计算权重邻接矩阵W的标准化拉普拉斯矩阵Lsym,其中矩阵I是和矩阵W维度相同的单位矩阵,矩阵G是所述标准化拉普拉斯矩阵Lsym对应的图的度矩阵,其计算方法为:依次将权重邻接矩阵W每一行的元素相加得到一组数值,然后将这些数值依次放在矩阵G的主对角线上,并且矩阵G的其他元素取值设置为0,矩阵为将矩阵G中主对角线的每个元素取值开根号并取倒数;
(2-4)对所述标准化拉普拉斯矩阵Lsym执行特征分解,得到一组特征值和对应的特征向量,随后选出第二小的特征值对应的特征向量λ;
(2-5)使用特征向量λ对缺陷预测数据集D进行聚类:首先计算随后对λ1除以它的L2范数,即令接着将λ1向量中的取值和缺陷预测数据集D中的程序模块建立对应关系;最后将λ1向量中取值大于0的元素对应的程序模块放到聚类C1中,而将取值小于或等于0的元素对应的程序模块放到聚类C2中;
(2-6)将缺陷预测数据集D中每个程序模块的特征值相加,并记为该程序模块的rs值;然后计算出C1聚类和C2聚类内包含的程序模块的rs均值,分别记为mean(rs[C1])和mean(rs[C2]),如果mean(rs[C1])>mean(rs[C2]),则聚类C1包含的程序模块可能含有缺陷,反之,则聚类C2包含的程序模块可能含有缺陷。
3.根据权利要求1所述的基于主动学习的无监督缺陷程序模块识别方法,其特征在于,步骤(3)中的项目缺陷模块数预估方法包括如下步骤:
(3-1)计算出缺陷预测数据集D中每个程序模块到缺陷预测模型ef划分超平面的距离,并存储在数组Ds中,对U中所有程序模块赋给临时标签,并将这些模块都临时标记为无缺陷模块,将已标记缺陷预测数据集L中的标签值和未标记缺陷预测数据集U中的临时标签值存储在数组label1中,然后将变量posNum和posNumLast的取值设置为label1数组中取值为1的元素数;
(3-2)基于Ds数组和label1数组构建训练集trainingData,所述训练集trainingData包括有1个特征,所述特征对应于Ds数组,所述训练集trainingData的类特征对应于label1数组,基于所述训练集trainingData,使用Logistic回归方法构建模型es,所述Logistic回归方法的正则化系数为n1/(m-n2),其中,m为缺陷预测数据集D中的程序模块数,n1为label1数组中取值为1的元素数,n2为已标记缺陷预测数据集L中的缺陷模块数;
(3-3)使用模型es对未标记缺陷预测数据集U中的程序模块进行预测,按照其含有缺陷的概率,从大到小进行排序,并存储在数组pro中,令count=0,cumulate和sample为空集,依次遍历数组pro,将pro对应模块添加到cumulate集合,并将模块对应的预测概率值累加到count变量,当count变量取值大于1时,将cumulate集合中的第一个模块取出并添加到集合sample中,同时将count变量的取值重置为0,cumulate集合重置为空集;当遍历数组pro结束后,将sample集合中的模块临时标记为有缺陷并更新label1数组,并将label1中取值为1的元素数赋值给变量posNum;如果变量posNum的取值与变量posNumLast的取值相等,则项目缺陷模块数预估方法的评估过程结束,并返回变量posNum的取值作为估算出被测项目内的缺陷程序模块数defectNum,否则将变量posNum的值赋给变量posNumLast,并执行步骤(3-2)。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910042053.2A CN109857653B (zh) | 2019-01-17 | 2019-01-17 | 一种基于主动学习的无监督缺陷程序模块识别方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910042053.2A CN109857653B (zh) | 2019-01-17 | 2019-01-17 | 一种基于主动学习的无监督缺陷程序模块识别方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN109857653A CN109857653A (zh) | 2019-06-07 |
CN109857653B true CN109857653B (zh) | 2022-02-25 |
Family
ID=66895029
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910042053.2A Active CN109857653B (zh) | 2019-01-17 | 2019-01-17 | 一种基于主动学习的无监督缺陷程序模块识别方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN109857653B (zh) |
Families Citing this family (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111523685B (zh) * | 2020-04-22 | 2022-09-06 | 中国科学技术大学 | 基于主动学习的降低性能建模开销的方法 |
CN111814851B (zh) * | 2020-06-24 | 2021-07-06 | 重庆邮电大学 | 一种基于单类支持向量机的煤矿瓦斯数据标记方法 |
CN112306730B (zh) * | 2020-11-12 | 2021-11-30 | 南通大学 | 基于历史项目伪标签生成的缺陷报告严重程度预测方法 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103198052A (zh) * | 2013-04-09 | 2013-07-10 | 山东师范大学 | 一种基于支持向量机的主动学习方法 |
CN108875816A (zh) * | 2018-06-05 | 2018-11-23 | 南京邮电大学 | 融合置信度准则和多样性准则的主动学习样本选择策略 |
-
2019
- 2019-01-17 CN CN201910042053.2A patent/CN109857653B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103198052A (zh) * | 2013-04-09 | 2013-07-10 | 山东师范大学 | 一种基于支持向量机的主动学习方法 |
CN108875816A (zh) * | 2018-06-05 | 2018-11-23 | 南京邮电大学 | 融合置信度准则和多样性准则的主动学习样本选择策略 |
Non-Patent Citations (2)
Title |
---|
Active Learning for Software Defect Prediction;Guangchun LUO;《IEICE TRANS.INF&SYST》;20120630(第6期);第1680-1683页 * |
基于主动学习和加权支持向量机的工业故障识别;朱东阳等;《浙江大学学报(工学版)》;20170430;第51卷(第4期);第697-705页 * |
Also Published As
Publication number | Publication date |
---|---|
CN109857653A (zh) | 2019-06-07 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109857653B (zh) | 一种基于主动学习的无监督缺陷程序模块识别方法 | |
CN106201871B (zh) | 基于代价敏感半监督的软件缺陷预测方法 | |
CN108345544B (zh) | 一种基于复杂网络的软件缺陷分布影响因素分析方法 | |
CN108805196B (zh) | 用于图像识别的自动增量学习方法 | |
CN109598566B (zh) | 下单预测方法、装置、计算机设备和计算机可读存储介质 | |
CN107967485A (zh) | 用电计量设备故障分析方法及装置 | |
CN111967535B (zh) | 一种储粮管理场景温度传感器故障诊断方法及其诊断装置 | |
CN108398266B (zh) | 一种基于集成迁移学习的轴承故障诊断方法 | |
CN115440292B (zh) | 存储芯片的测试方法、装置、设备及存储介质 | |
CN110442523B (zh) | 一种跨项目软件缺陷预测方法 | |
CN109921938B (zh) | 一种云计算环境下故障检测方法 | |
CN110659682A (zh) | 一种基于MCWD-KSMOTE-AdaBoost-DenseNet算法的数据分类方法 | |
CN111966586A (zh) | 一种基于模块选择和权重更新的跨项目缺陷预测方法 | |
CN114968774A (zh) | 一种多源异构跨项目软件缺陷预测方法 | |
US20210397960A1 (en) | Reliability evaluation device and reliability evaluation method | |
CN117763316A (zh) | 一种基于机器学习的高维数据降维方法及降维系统 | |
CN116230586B (zh) | 晶圆制造机台单元的共性分析方法及终端 | |
CN106096635B (zh) | 基于阈值操作的代价敏感神经网络的警告分类方法 | |
CN107943916B (zh) | 一种基于在线分类的网页异常检测方法 | |
CN115797044B (zh) | 基于聚类分析的信贷风控预警方法及系统 | |
CN113127342B (zh) | 基于电网信息系统特征选择的缺陷预测方法及装置 | |
CN114139636B (zh) | 异常作业处理方法及装置 | |
CN115659271A (zh) | 传感器异常检测方法、模型训练方法、系统、设备及介质 | |
CN113704073B (zh) | 一种汽车维修记录库异常数据的检测方法 | |
CN106055483B (zh) | 基于欠采样操作的代价敏感神经网络的警告分类方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |