劉繼華,王豐錦,孔 潔
(1.呂梁學(xué)院 計(jì)算機(jī)科學(xué)與技術(shù)系,山西 呂梁 033000;2.北京航空航天大學(xué) 計(jì)算機(jī)學(xué)院,北京 100191; 3.清華同方股份有限公司,北京 100083;4.北京電子科技技術(shù)職業(yè)學(xué)院 電信工程學(xué)院,北京 100176)
早期的軟件故障傾向性[1-3]預(yù)測(cè)方法是基于統(tǒng)計(jì)的,當(dāng)前引入了機(jī)器學(xué)習(xí)技術(shù),包括數(shù)據(jù)挖掘、樸素貝葉斯算法、支持向量機(jī)、深度神經(jīng)網(wǎng)絡(luò)和模糊邏輯等。雖然使用這些技術(shù)對(duì)軟件故障進(jìn)行了研究,但對(duì)故障數(shù)據(jù)集進(jìn)行處理時(shí),缺少對(duì)數(shù)據(jù)的降維預(yù)處理,導(dǎo)致算法的計(jì)算復(fù)雜性過高[4,5]。軟件工程中最常用的降維方法是主成分分析(PCA)方法。例如,文獻(xiàn)[6]在利用PCA方法對(duì)軟件故障數(shù)據(jù)進(jìn)行降維基礎(chǔ)上,設(shè)計(jì)了一種兩階段的故障預(yù)測(cè)技術(shù)等。然而,PCA的一個(gè)缺點(diǎn)是,與原始輸入變量相反,派生維度可能沒有直觀的解釋。另一種常用降維方法是偏最小二乘法(PLS)。文獻(xiàn)[7]利用最小二乘算法對(duì)軟件故障數(shù)據(jù)進(jìn)行降維,并提出一種基于時(shí)序的故障檢測(cè)與故障排除的軟件可靠性模型。文獻(xiàn)[8]利用最小二乘算法對(duì)軟件故障數(shù)據(jù)進(jìn)行降維,并對(duì)復(fù)雜軟件系統(tǒng)故障分布單元進(jìn)行統(tǒng)計(jì)分析等。PLS在降維領(lǐng)域得到了廣泛應(yīng)用,但PLS的實(shí)現(xiàn)過程是基于非線性迭代的,通常需對(duì)原始樣本數(shù)據(jù)進(jìn)行假設(shè)或轉(zhuǎn)換,以便使用傳統(tǒng)的估計(jì)方法。在實(shí)際情況下,原始樣本數(shù)據(jù)可能受到操作環(huán)境、測(cè)試策略和資源分配等多方面因素的影響。因此,在實(shí)際問題中很難滿足這些假設(shè)。
與傳統(tǒng)算法相比,本文創(chuàng)新點(diǎn)在于:①對(duì)于軟件故障數(shù)據(jù),引入了粒子群數(shù)據(jù)降維算法,提高數(shù)據(jù)的執(zhí)行效率,并且受到測(cè)試過程影響更?。虎跒樘岣邤?shù)據(jù)降維效果,提出一種束縛態(tài)粒子群算法,取代傳統(tǒng)的粒子群算法,利用波函數(shù)代替原始粒子群算法的位置和速度,提高了數(shù)據(jù)降維效果。
DNN[9]是基于在輸出和輸入兩級(jí)網(wǎng)絡(luò)層之間加入多個(gè)隱藏的網(wǎng)絡(luò)學(xué)習(xí)單元而形成的學(xué)習(xí)算法結(jié)構(gòu)。隱層在節(jié)點(diǎn)規(guī)模上要少于編碼器輸入層和解碼器輸出層。為對(duì)DNNs網(wǎng)絡(luò)進(jìn)行訓(xùn)練,引入二階優(yōu)化方法,從而實(shí)現(xiàn)深度神經(jīng)網(wǎng)絡(luò)訓(xùn)練。深度神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)如圖1(a)所示。
圖1 DNN結(jié)構(gòu)和算法框架
本文使用的是雙隱層網(wǎng)絡(luò)的深度神經(jīng)網(wǎng)絡(luò)。將場(chǎng)理論引入到傳統(tǒng)粒子群優(yōu)化算法,該算法是可實(shí)現(xiàn)全局收斂性保證的搜索方法。因此,利用BPSO算法進(jìn)行算法降維處理。采用混合深度神經(jīng)網(wǎng)絡(luò)和粒子群算法,本文提出了一種有效的軟件缺陷預(yù)測(cè)方法。預(yù)測(cè)方法如圖1(b)算法框架所示。
目前的研究大多使用軟件指標(biāo)來識(shí)別故障傾向性模塊,研究表明軟件指標(biāo)對(duì)于預(yù)測(cè)故障傾向類是非常有用的。在本文中,使用的指標(biāo)是McCabe,Butler,Halstead準(zhǔn)則等[10,11]。選擇的指標(biāo)有代碼行,循環(huán)復(fù)雜度,基本復(fù)雜度、設(shè)計(jì)復(fù)雜度等。表1列出了這些指標(biāo)的描述。在本文的實(shí)驗(yàn)中,每個(gè)軟件模塊由21個(gè)指標(biāo)軟件故障進(jìn)行傾向性表示。
表1 選取的指標(biāo)
對(duì)于DNN算法,給定一個(gè)數(shù)據(jù)集(x(i),y(i))(i=1,2,…,q),其中x(i)∈Rd,是軟件指標(biāo)值的向量,它量化了第i類的指標(biāo)值,q是數(shù)據(jù)樣本的總數(shù)。輸出神經(jīng)元的第i類期望的輸出值是y(i),其值為“1”對(duì)應(yīng)的斷點(diǎn)傾向和“0”對(duì)應(yīng)的非斷點(diǎn)傾向性。在訓(xùn)練深度神經(jīng)網(wǎng)絡(luò)時(shí),將每個(gè)輸入歸一化化為相同的區(qū)間數(shù)。這有助于改善培訓(xùn)過程的行為,確保每個(gè)初始輸入同等重要。我們注意到,軟件指標(biāo)的上界通常在其取值范圍內(nèi)是無(wú)限的。為了規(guī)范化,需要獲得軟件指標(biāo)值范圍的上下界。對(duì)于特定的數(shù)據(jù)集和軟件指標(biāo),我們可以根據(jù)數(shù)據(jù)集獲得每個(gè)指標(biāo)的值。在這些數(shù)據(jù)集中,給出了每個(gè)指標(biāo)的值,因此很容易獲得最大值和最小值。
在本文中,對(duì)于每一個(gè)軟件指標(biāo),令min(x(j))和max(x(j))分別為數(shù)據(jù)集的最小和最大軟件指標(biāo)值。然后可得尺度參數(shù)X(j)為
(1)
因此,每個(gè)記錄的值被映射到封閉的區(qū)間0,1。利用(X(i),y(i))(i=1,2,…,q)規(guī)范化數(shù)據(jù)集,歸一化指標(biāo)向量為X(i)∈Rd。
粒子群算法每個(gè)粒子根據(jù)自己和鄰居節(jié)點(diǎn)的飛行經(jīng)驗(yàn),不時(shí)地調(diào)整搜索空間中的位置。它是以隨機(jī)方式進(jìn)行種群的初始化,該算法搜索滿足某些性能的最優(yōu)解。潛在的解決方案稱為粒子,通過多維搜索空間飛行,如圖2所示。
圖2 粒子尋優(yōu)過程
每個(gè)粒子i都有一個(gè)位置向量表示的位置Xi。用矢量表示的每個(gè)粒子的速度Vi。給出了質(zhì)點(diǎn)速度和位置方程形式
Vi(t+1)=wVi(t)+c1r1(Pi,best(t)-Xi(t))+
c2r2(Pglobal(t)-Xi(t))
(2)
(3)
其中,t是當(dāng)前迭代次數(shù),w是慣性權(quán)重,c1和c2是正常數(shù),r1和r2是區(qū)間0,1內(nèi)均勻分布的隨機(jī)數(shù)。Pi, best和Pglobal分別是當(dāng)期訪問粒子i的最佳位置和所有粒子位置值的最佳值,其中
(4)
式(2)中,w、c1和c2是預(yù)定義的。在迭代次數(shù)為t時(shí),粒子i的成本值如下
(5)
(6)
當(dāng)粒子找到比先前最佳位置更好的位置時(shí),它將被存儲(chǔ)在存儲(chǔ)器中。該算法將持續(xù)進(jìn)行直到找到一個(gè)滿意解決方案或迭代最大數(shù)量可滿足。
(7)
其中,參數(shù)α具有均勻特性,為膨脹收縮參數(shù),ui、s是處于區(qū)間0,1范圍內(nèi)的均勻隨機(jī)數(shù),且有
pi(t)=φi(t)·Pi,best(t)+(1-φi(t))·Pglobal(t)
(8)
(9)
其中,φi是區(qū)間0,1內(nèi)的均勻分布的隨機(jī)數(shù),Q是所有粒子的個(gè)數(shù),mi, best定義為種群中所有粒子的最佳位置的平均值。粒子群算法的終止準(zhǔn)則是,如果Ct+1和C(t)之間的絕對(duì)差異連續(xù)10次小于δ,然后停止算法;否則直到最大迭代次數(shù)Gmax可滿足,其中δ是訓(xùn)練閾值。BPSO算法的流程如下所示:
算法1:BPSO算法
初始化所有粒子的位置和Pi,best位置。
Do
利用式(9)計(jì)算粒子i的mi, best,i=1,2,…,Q;
選擇合適的值α
For 粒子i=1:Q
根據(jù)方程(5)計(jì)算粒子i的成本值;
根據(jù)方程(6)更新Pi,best;
利用以下步驟更新Pglobal;
IfC(Pi,best(t)) Pglobal(t)=Pi,best(t); Else Pglobal(t)=Pi,best(t-1); Endif Endfor For 維度1:ddo φ=rand0,1; u=rand0,1; Ifrand0,1≥0.5 do 根據(jù)方程(7)上式更新粒子位置; Else 根據(jù)方程(7)下式更新粒子位置; Endfor 直到滿足終止條件 假設(shè)D=(S,M)是一個(gè)帶有q樣本和d指標(biāo)的數(shù)據(jù)集,其中M={m1,m2,…,md},S={S1,S2,…,Sq}分別是指標(biāo)和樣本集。C={c1,c2,…,ct}指的是類型集。為實(shí)現(xiàn)算法降維,我們按照以下操作將解X編碼成二進(jìn)制字符串 f(rand (10) 其中,S·是sigmoid函數(shù),形式為 S(x)=1/(1+e-x) (11) 在所提降維方法中,粒子i的位置用二進(jìn)制(0或1)字符串表示,例如Xi=Xi1,Xi2,…,Xid。1代表一個(gè)選定的指標(biāo),而0則表示非選定的指標(biāo)。在BPSO算法中,一旦確定了最終解決方案Pglobal,最佳粒子的指標(biāo)Pglobal可以跟蹤其位置。我們讓選定的指標(biāo)集為M1?M,則所選擇的指標(biāo)值數(shù)量是l 對(duì)于所有的DNN模型,將其所有的輸入數(shù)據(jù)和預(yù)期的輸出進(jìn)行歸一化處理,使其值位于區(qū)間[0,1]。在軟件故障傾向性預(yù)測(cè)方法中,深度神經(jīng)網(wǎng)絡(luò)可實(shí)現(xiàn)從數(shù)據(jù)空間到“1”或“0”二進(jìn)制數(shù)據(jù)空間的映射??稍O(shè)計(jì)軟件故障傾向性預(yù)測(cè)算法如下: 步驟1 對(duì)輸入指標(biāo)x進(jìn)行歸一化處理,得到歸一化的指標(biāo)X。其取值位于區(qū)間0,1。 步驟2 將預(yù)處理的數(shù)據(jù)分為兩個(gè)子集:按適當(dāng)比例劃分成訓(xùn)練和測(cè)試子集。 步驟3 在訓(xùn)練子集上建立深度神經(jīng)網(wǎng)絡(luò)模型,得到訓(xùn)練深度神經(jīng)網(wǎng)絡(luò)。 步驟4 基于BPSO算法從M得到一個(gè)降維子集M1,可獲得降維輸入數(shù)據(jù)集X′和簡(jiǎn)化DNN模型。 步驟5 在訓(xùn)練子集上建立簡(jiǎn)化的DNN模型,得到新的深度神經(jīng)網(wǎng)絡(luò)。 步驟6 在測(cè)試子集中使用新的深度神經(jīng)網(wǎng)絡(luò)預(yù)測(cè)模塊(傾向性故障或非傾向性故障)。 步驟7 為了分析軟件故障傾向性預(yù)測(cè)方法的性能,計(jì)算預(yù)測(cè)性能指標(biāo)值并獲得性能評(píng)價(jià)。 對(duì)于兩類問題的預(yù)測(cè)性能,通常利用混淆矩陣中的數(shù)據(jù)進(jìn)行評(píng)估,見表2。 表2 混淆矩陣 表2中,fij表示實(shí)際類i被預(yù)測(cè)為類j的數(shù)量,其中i,j∈{0,1}。預(yù)測(cè)性能指標(biāo)選取如下:定量評(píng)價(jià)預(yù)測(cè)方法的敏感性和特異性。這些指標(biāo)指標(biāo)可基于混淆矩陣進(jìn)行計(jì)算,計(jì)算形式分別為 (12) (13) 其中,敏感性稱為故障檢測(cè)率。它被定義為正確預(yù)測(cè)為故障傾向的類數(shù)與實(shí)際故障傾向類總數(shù)的比值。特異性也稱為正確性。它被定義為正確預(yù)測(cè)非故障傾向的類數(shù)與非故障傾向預(yù)測(cè)類總數(shù)之比。 在這項(xiàng)研究中使用的數(shù)據(jù)集是國(guó)家航空和航天局(NASA)的4個(gè)關(guān)鍵軟件項(xiàng)目[12],這些是美國(guó)宇航局IV和V設(shè)施指標(biāo)數(shù)據(jù)程序,隸屬于公共可訪問的儲(chǔ)存庫(kù)。其中,PC1和JM1兩個(gè)數(shù)據(jù)集是利用C程序語(yǔ)言編寫的軟件項(xiàng)目,一個(gè)模塊是一個(gè)功能。其余兩個(gè)數(shù)據(jù)集KC1和KC3 是利用C++和java面向?qū)ο蟮恼Z(yǔ)言編寫的軟件項(xiàng)目,其模塊對(duì)應(yīng)一種算法。每個(gè)數(shù)據(jù)集都包含其軟件指標(biāo)和相關(guān)的獨(dú)立布爾變量:故障傾向(模塊是否有故障傾向)。根據(jù)標(biāo)準(zhǔn)McCabes規(guī)則,對(duì)于4個(gè)選取的數(shù)據(jù)集,v(G)>10的模塊識(shí)別為故障傾向。表3給出了這些數(shù)據(jù)集的一些主要特性。 表3 數(shù)據(jù)集的特性 在本文中,需要確定幾個(gè)參數(shù): DNN的網(wǎng)絡(luò)輸出利用1、2表示兩個(gè)類別,DNN輸出選擇最常用的方法是贏家通吃策略。DNN的邏輯函數(shù)選取sigmoid函數(shù),計(jì)算形式為 f(x)=1/(1+exp(-x)) (14) (2)PSO和BPSO算法:在這項(xiàng)研究中,需要用戶指定的PSO和BPSO算法的參數(shù),見表4設(shè)定數(shù)據(jù)。 表4 PSO和BPSO算法參數(shù) 表4中,令參數(shù)w=0.45和c1=c2=2,α=0.55。支持向量機(jī):正則化參數(shù)設(shè)置為1,核函數(shù)的帶寬設(shè)置為0.5。 根據(jù)上面的定理,只要α滿足不等式α 在實(shí)驗(yàn)中,訓(xùn)練集和測(cè)試集按3∶2的比例進(jìn)行劃分?;谏鲜鰠?shù),利用MATLAB 7.0深度神經(jīng)網(wǎng)絡(luò)工具箱可以得到一個(gè)訓(xùn)練好的深度神經(jīng)網(wǎng)絡(luò)。表5給出了在上述4個(gè)數(shù)據(jù)集上,PSO和BPSO算法獨(dú)立運(yùn)行40次的實(shí)驗(yàn)結(jié)果均值。 根據(jù)表5所示結(jié)果,基于PSO的維度降低方法,其選擇指標(biāo)的平均數(shù)量要多于BPSO算法。所選指標(biāo)的算法可以更有效地簡(jiǎn)化網(wǎng)絡(luò)架構(gòu)?;贐PSO算法的指標(biāo)選擇結(jié)果見表6。 表5 不同數(shù)據(jù)集的PSO和BPSO算法性能 表6 基于BPSO算法的指標(biāo)選取 根據(jù)表6結(jié)果,所選取的指標(biāo)用于數(shù)據(jù)集(X′(i),y(i))的維度降低,其中i=1,2,…,q,X′(i)∈Rl,l=6,4,7和3??傻煤?jiǎn)化DNN模型。 在訓(xùn)練子集上訓(xùn)練簡(jiǎn)化深度神經(jīng)網(wǎng)絡(luò)后,可以得到新的深度神經(jīng)網(wǎng)絡(luò)。我們用MedCalcV11.2.0軟件獲得ROC曲線的AUC值。如圖3所示,在4個(gè)數(shù)據(jù)集的測(cè)試子集上,獨(dú)立運(yùn)行30次獲得的新DNN的AUC值最大的ROC曲線。 圖3 原圖2~5的曲線合成 根據(jù)圖3,新DNN的所有AUC值均大于0.77,表明新深度神經(jīng)網(wǎng)絡(luò)可預(yù)測(cè)軟件故障傾向模塊。由于采取的是隨機(jī)劃分訓(xùn)練集和測(cè)試集,每次運(yùn)行時(shí)新DNN預(yù)測(cè)結(jié)果不一定相同。為了評(píng)估新深度神經(jīng)網(wǎng)絡(luò)的預(yù)測(cè)能力和可靠性,在給定隨機(jī)數(shù)后,在每次測(cè)試集上運(yùn)行30次。圖4(a)~圖4(d)所示,分別為在PC1,JM1,KC1和KC3數(shù)據(jù)集上的AUC值分布情況。 圖4 4組數(shù)據(jù)集的AUC值分布 根據(jù)圖4(a)~圖4(d)所示結(jié)果,我們可以觀察到PC1,JM1、KCl、和KC3測(cè)試集上的AUC值分布情況,AUC值大于0.7的累計(jì)值分別為93%、70%、83.33%和100%。因此,預(yù)測(cè)結(jié)果穩(wěn)定可靠。 利用4個(gè)數(shù)據(jù)集預(yù)測(cè)軟件故障傾向性的實(shí)驗(yàn)結(jié)果很多,分別采用不同的預(yù)測(cè)方法。為了比較算法的預(yù)測(cè)性能,這里在表7中列出所提算法的AUC值及其AUC均值。 表7 4種數(shù)據(jù)集的預(yù)測(cè)結(jié)果對(duì)比 根據(jù)表7結(jié)果可知,在選取的預(yù)測(cè)算法中,BPSO+DNN算法在JM1、KC1和KC3上的AUC值最大,這表明該算法相對(duì)于其它算法具有更加優(yōu)異的預(yù)測(cè)性能。對(duì)于數(shù)據(jù)集PC1,MLP-2,LS-SVM,C4.5和RndFor算法的AUC值均超過了0.90,其預(yù)測(cè)性能要優(yōu)于BPSO+DNN算法,但是整體相差不大。這表明所提算法在性能上要優(yōu)于選取的對(duì)比算法。具體分析如下: (1)所提BPSO+DNN算法的AUC值均超過了0.776,這表明,利用所提BPSO+DNN算法可實(shí)現(xiàn)對(duì)所有數(shù)據(jù)集軟件故障傾向的有效預(yù)測(cè)。此外,軟件度量之間存在很強(qiáng)的相關(guān)性,并且存在適當(dāng)?shù)能浖燃?,這也表明刪除冗余度量有助于提高軟件故障傾向模型的性能。 (2)對(duì)比DNN和BPSO+DNN兩種算法,BPSO+DNN算法的AUC均值要始終高于DNN算法,這表明利用BPSO算法可以提高深度神經(jīng)網(wǎng)絡(luò)的預(yù)測(cè)性能,去除冗余的度量,因此基于BPSO的度量選擇是很有必要的。 (3)通過對(duì)比PSO+DNN和BPSO+DNN算法,BPSO+DNN算法的AUC均值要明顯優(yōu)于PSO+DNN算法,這表明PSO和BPSO算法均可實(shí)現(xiàn)度量指標(biāo)的有效選擇,但是BPSO算法要明顯優(yōu)于PSO算法。同時(shí),根據(jù)表5結(jié)果可知,BPSO算法選取的指標(biāo)數(shù)量,要少于PSO算法,這表明BPSO算法相對(duì)于PSO算法更加具有計(jì)算效率。 (4)通過對(duì)比BPSO+DNN算法和BPSO+SVM算法,BPSO+DNN算法在PC1、JM1和KC1數(shù)據(jù)集上的AUC均值要明顯優(yōu)于BPSO+SVM算法,而在KC3數(shù)據(jù)集上的AUC均值兩種算法相同。這表明了SVM算法在軟件故障傾向預(yù)測(cè)上的有效性,也表明了BPSO+DNN算法的性能優(yōu)勢(shì)。 表8給出DNN、PSO+DNN和BPSO+DNN這3種算法在4個(gè)數(shù)據(jù)集上的平均計(jì)算時(shí)間,每種算法獨(dú)立運(yùn)行20次取均值。 表8 平均計(jì)算時(shí)間對(duì)比 根據(jù)表8計(jì)算結(jié)果可知,如果沒有采取降維措施,而是直接應(yīng)用軟件缺陷預(yù)測(cè),時(shí)間成本要高得多,這表明在降低運(yùn)行時(shí)的降維效果非常顯著。此外,BPSO算法的性能比PSO算法的降維效果更優(yōu),可實(shí)現(xiàn)計(jì)算時(shí)間的最大降低。 本文研究了混合深度神經(jīng)網(wǎng)絡(luò)和BPSO算法的應(yīng)用開發(fā)軟件缺陷預(yù)測(cè)方法。所提出的預(yù)測(cè)方法能夠較為準(zhǔn)確識(shí)別故障傾向性。所提出的預(yù)測(cè)方法的主要優(yōu)點(diǎn)如下: (1)在本文中,BPSO算法是用于降低度量空間的維數(shù),而深度神經(jīng)網(wǎng)絡(luò)用于預(yù)測(cè)軟件模塊的故障傾向。并驗(yàn)證了BPSO+DNN算法性能的有效性。 (2)所提降維算法實(shí)現(xiàn)簡(jiǎn)單,這是因?yàn)榱W尤核惴ㄓ?個(gè)控制參數(shù),而BPSO算法只有一個(gè),因此更容易實(shí)現(xiàn)算法的控制。實(shí)驗(yàn)結(jié)果表明,它是可能的,基于BPSO算法的降維技術(shù)可以簡(jiǎn)化網(wǎng)絡(luò)結(jié)構(gòu),并獲得更加的預(yù)測(cè)性能。 (3)從度量空間中選取的幾個(gè)度量對(duì)于軟件模塊的故障傾向性而言,比其它非選擇度量具有更顯著的效果,這表明在軟件開發(fā)過程中,開發(fā)人員應(yīng)該更多地關(guān)注選定的度量指標(biāo),而不是所有的度量指標(biāo)。 (4)提出的預(yù)測(cè)方法能夠有效地預(yù)測(cè)軟件故障傾向性,因此開發(fā)人員只需集中于具有故障傾向性的軟件模塊,從而最大限度地降低軟件維護(hù)成本。2.3 降維方法
3 軟件故障傾向性預(yù)測(cè)方法
3.1 算法步驟
3.2 性能評(píng)價(jià)指標(biāo)
4 實(shí)驗(yàn)分析
4.1 測(cè)試數(shù)據(jù)集
4.2 參數(shù)設(shè)置
4.3 降維和預(yù)測(cè)結(jié)果分析
4.4 算法性能對(duì)比
4.5 算法計(jì)算復(fù)雜度分析
5 結(jié)束語(yǔ)