劉繼華,王豐錦,孔 潔
(1.呂梁學院 計算機科學與技術系,山西 呂梁 033000;2.北京航空航天大學 計算機學院,北京 100191; 3.清華同方股份有限公司,北京 100083;4.北京電子科技技術職業學院 電信工程學院,北京 100176)
早期的軟件故障傾向性[1-3]預測方法是基于統計的,當前引入了機器學習技術,包括數據挖掘、樸素貝葉斯算法、支持向量機、深度神經網絡和模糊邏輯等。雖然使用這些技術對軟件故障進行了研究,但對故障數據集進行處理時,缺少對數據的降維預處理,導致算法的計算復雜性過高[4,5]。軟件工程中最常用的降維方法是主成分分析(PCA)方法。例如,文獻[6]在利用PCA方法對軟件故障數據進行降維基礎上,設計了一種兩階段的故障預測技術等。然而,PCA的一個缺點是,與原始輸入變量相反,派生維度可能沒有直觀的解釋。另一種常用降維方法是偏最小二乘法(PLS)。文獻[7]利用最小二乘算法對軟件故障數據進行降維,并提出一種基于時序的故障檢測與故障排除的軟件可靠性模型。文獻[8]利用最小二乘算法對軟件故障數據進行降維,并對復雜軟件系統故障分布單元進行統計分析等。PLS在降維領域得到了廣泛應用,但PLS的實現過程是基于非線性迭代的,通常需對原始樣本數據進行假設或轉換,以便使用傳統的估計方法。在實際情況下,原始樣本數據可能受到操作環境、測試策略和資源分配等多方面因素的影響。因此,在實際問題中很難滿足這些假設。
與傳統算法相比,本文創新點在于:①對于軟件故障數據,引入了粒子群數據降維算法,提高數據的執行效率,并且受到測試過程影響更小;②為提高數據降維效果,提出一種束縛態粒子群算法,取代傳統的粒子群算法,利用波函數代替原始粒子群算法的位置和速度,提高了數據降維效果。
DNN[9]是基于在輸出和輸入兩級網絡層之間加入多個隱藏的網絡學習單元而形成的學習算法結構。隱層在節點規模上要少于編碼器輸入層和解碼器輸出層。為對DNNs網絡進行訓練,引入二階優化方法,從而實現深度神經網絡訓練。深度神經網絡結構如圖1(a)所示。

圖1 DNN結構和算法框架
本文使用的是雙隱層網絡的深度神經網絡。將場理論引入到傳統粒子群優化算法,該算法是可實現全局收斂性保證的搜索方法。因此,利用BPSO算法進行算法降維處理。采用混合深度神經網絡和粒子群算法,本文提出了一種有效的軟件缺陷預測方法。預測方法如圖1(b)算法框架所示。
目前的研究大多使用軟件指標來識別故障傾向性模塊,研究表明軟件指標對于預測故障傾向類是非常有用的。在本文中,使用的指標是McCabe,Butler,Halstead準則等[10,11]。選擇的指標有代碼行,循環復雜度,基本復雜度、設計復雜度等。表1列出了這些指標的描述。在本文的實驗中,每個軟件模塊由21個指標軟件故障進行傾向性表示。

表1 選取的指標
對于DNN算法,給定一個數據集(x(i),y(i))(i=1,2,…,q),其中x(i)∈Rd,是軟件指標值的向量,它量化了第i類的指標值,q是數據樣本的總數。輸出神經元的第i類期望的輸出值是y(i),其值為“1”對應的斷點傾向和“0”對應的非斷點傾向性。在訓練深度神經網絡時,將每個輸入歸一化化為相同的區間數。這有助于改善培訓過程的行為,確保每個初始輸入同等重要。我們注意到,軟件指標的上界通常在其取值范圍內是無限的。為了規范化,需要獲得軟件指標值范圍的上下界。對于特定的數據集和軟件指標,我們可以根據數據集獲得每個指標的值。在這些數據集中,給出了每個指標的值,因此很容易獲得最大值和最小值。
在本文中,對于每一個軟件指標,令min(x(j))和max(x(j))分別為數據集的最小和最大軟件指標值。然后可得尺度參數X(j)為
(1)
因此,每個記錄的值被映射到封閉的區間0,1。利用(X(i),y(i))(i=1,2,…,q)規范化數據集,歸一化指標向量為X(i)∈Rd。
粒子群算法每個粒子根據自己和鄰居節點的飛行經驗,不時地調整搜索空間中的位置。它是以隨機方式進行種群的初始化,該算法搜索滿足某些性能的最優解。潛在的解決方案稱為粒子,通過多維搜索空間飛行,如圖2所示。

圖2 粒子尋優過程
每個粒子i都有一個位置向量表示的位置Xi。用矢量表示的每個粒子的速度Vi。給出了質點速度和位置方程形式
Vi(t+1)=wVi(t)+c1r1(Pi,best(t)-Xi(t))+
c2r2(Pglobal(t)-Xi(t))
(2)
(3)
其中,t是當前迭代次數,w是慣性權重,c1和c2是正常數,r1和r2是區間0,1內均勻分布的隨機數。Pi, best和Pglobal分別是當期訪問粒子i的最佳位置和所有粒子位置值的最佳值,其中
(4)
式(2)中,w、c1和c2是預定義的。在迭代次數為t時,粒子i的成本值如下
(5)


(6)
當粒子找到比先前最佳位置更好的位置時,它將被存儲在存儲器中。該算法將持續進行直到找到一個滿意解決方案或迭代最大數量可滿足。

(7)
其中,參數α具有均勻特性,為膨脹收縮參數,ui、s是處于區間0,1范圍內的均勻隨機數,且有
pi(t)=φi(t)·Pi,best(t)+(1-φi(t))·Pglobal(t)
(8)
(9)
其中,φi是區間0,1內的均勻分布的隨機數,Q是所有粒子的個數,mi, best定義為種群中所有粒子的最佳位置的平均值。粒子群算法的終止準則是,如果Ct+1和C(t)之間的絕對差異連續10次小于δ,然后停止算法;否則直到最大迭代次數Gmax可滿足,其中δ是訓練閾值。BPSO算法的流程如下所示:
算法1:BPSO算法
初始化所有粒子的位置和Pi,best位置。
Do
利用式(9)計算粒子i的mi, best,i=1,2,…,Q;
選擇合適的值α
For 粒子i=1:Q
根據方程(5)計算粒子i的成本值;
根據方程(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 根據方程(7)上式更新粒子位置; Else 根據方程(7)下式更新粒子位置; Endfor 直到滿足終止條件 假設D=(S,M)是一個帶有q樣本和d指標的數據集,其中M={m1,m2,…,md},S={S1,S2,…,Sq}分別是指標和樣本集。C={c1,c2,…,ct}指的是類型集。為實現算法降維,我們按照以下操作將解X編碼成二進制字符串 f(rand (10) 其中,S·是sigmoid函數,形式為 S(x)=1/(1+e-x) (11) 在所提降維方法中,粒子i的位置用二進制(0或1)字符串表示,例如Xi=Xi1,Xi2,…,Xid。1代表一個選定的指標,而0則表示非選定的指標。在BPSO算法中,一旦確定了最終解決方案Pglobal,最佳粒子的指標Pglobal可以跟蹤其位置。我們讓選定的指標集為M1?M,則所選擇的指標值數量是l 對于所有的DNN模型,將其所有的輸入數據和預期的輸出進行歸一化處理,使其值位于區間[0,1]。在軟件故障傾向性預測方法中,深度神經網絡可實現從數據空間到“1”或“0”二進制數據空間的映射。可設計軟件故障傾向性預測算法如下: 步驟1 對輸入指標x進行歸一化處理,得到歸一化的指標X。其取值位于區間0,1。 步驟2 將預處理的數據分為兩個子集:按適當比例劃分成訓練和測試子集。 步驟3 在訓練子集上建立深度神經網絡模型,得到訓練深度神經網絡。 步驟4 基于BPSO算法從M得到一個降維子集M1,可獲得降維輸入數據集X′和簡化DNN模型。 步驟5 在訓練子集上建立簡化的DNN模型,得到新的深度神經網絡。 步驟6 在測試子集中使用新的深度神經網絡預測模塊(傾向性故障或非傾向性故障)。 步驟7 為了分析軟件故障傾向性預測方法的性能,計算預測性能指標值并獲得性能評價。 對于兩類問題的預測性能,通常利用混淆矩陣中的數據進行評估,見表2。 表2 混淆矩陣 表2中,fij表示實際類i被預測為類j的數量,其中i,j∈{0,1}。預測性能指標選取如下:定量評價預測方法的敏感性和特異性。這些指標指標可基于混淆矩陣進行計算,計算形式分別為 (12) (13) 其中,敏感性稱為故障檢測率。它被定義為正確預測為故障傾向的類數與實際故障傾向類總數的比值。特異性也稱為正確性。它被定義為正確預測非故障傾向的類數與非故障傾向預測類總數之比。 在這項研究中使用的數據集是國家航空和航天局(NASA)的4個關鍵軟件項目[12],這些是美國宇航局IV和V設施指標數據程序,隸屬于公共可訪問的儲存庫。其中,PC1和JM1兩個數據集是利用C程序語言編寫的軟件項目,一個模塊是一個功能。其余兩個數據集KC1和KC3 是利用C++和java面向對象的語言編寫的軟件項目,其模塊對應一種算法。每個數據集都包含其軟件指標和相關的獨立布爾變量:故障傾向(模塊是否有故障傾向)。根據標準McCabes規則,對于4個選取的數據集,v(G)>10的模塊識別為故障傾向。表3給出了這些數據集的一些主要特性。 表3 數據集的特性 在本文中,需要確定幾個參數: DNN的網絡輸出利用1、2表示兩個類別,DNN輸出選擇最常用的方法是贏家通吃策略。DNN的邏輯函數選取sigmoid函數,計算形式為 f(x)=1/(1+exp(-x)) (14) (2)PSO和BPSO算法:在這項研究中,需要用戶指定的PSO和BPSO算法的參數,見表4設定數據。 表4 PSO和BPSO算法參數 表4中,令參數w=0.45和c1=c2=2,α=0.55。支持向量機:正則化參數設置為1,核函數的帶寬設置為0.5。 根據上面的定理,只要α滿足不等式α 在實驗中,訓練集和測試集按3∶2的比例進行劃分。基于上述參數,利用MATLAB 7.0深度神經網絡工具箱可以得到一個訓練好的深度神經網絡。表5給出了在上述4個數據集上,PSO和BPSO算法獨立運行40次的實驗結果均值。 根據表5所示結果,基于PSO的維度降低方法,其選擇指標的平均數量要多于BPSO算法。所選指標的算法可以更有效地簡化網絡架構。基于BPSO算法的指標選擇結果見表6。 表5 不同數據集的PSO和BPSO算法性能 表6 基于BPSO算法的指標選取 根據表6結果,所選取的指標用于數據集(X′(i),y(i))的維度降低,其中i=1,2,…,q,X′(i)∈Rl,l=6,4,7和3。可得簡化DNN模型。 在訓練子集上訓練簡化深度神經網絡后,可以得到新的深度神經網絡。我們用MedCalcV11.2.0軟件獲得ROC曲線的AUC值。如圖3所示,在4個數據集的測試子集上,獨立運行30次獲得的新DNN的AUC值最大的ROC曲線。 圖3 原圖2~5的曲線合成 根據圖3,新DNN的所有AUC值均大于0.77,表明新深度神經網絡可預測軟件故障傾向模塊。由于采取的是隨機劃分訓練集和測試集,每次運行時新DNN預測結果不一定相同。為了評估新深度神經網絡的預測能力和可靠性,在給定隨機數后,在每次測試集上運行30次。圖4(a)~圖4(d)所示,分別為在PC1,JM1,KC1和KC3數據集上的AUC值分布情況。 圖4 4組數據集的AUC值分布 根據圖4(a)~圖4(d)所示結果,我們可以觀察到PC1,JM1、KCl、和KC3測試集上的AUC值分布情況,AUC值大于0.7的累計值分別為93%、70%、83.33%和100%。因此,預測結果穩定可靠。 利用4個數據集預測軟件故障傾向性的實驗結果很多,分別采用不同的預測方法。為了比較算法的預測性能,這里在表7中列出所提算法的AUC值及其AUC均值。 表7 4種數據集的預測結果對比 根據表7結果可知,在選取的預測算法中,BPSO+DNN算法在JM1、KC1和KC3上的AUC值最大,這表明該算法相對于其它算法具有更加優異的預測性能。對于數據集PC1,MLP-2,LS-SVM,C4.5和RndFor算法的AUC值均超過了0.90,其預測性能要優于BPSO+DNN算法,但是整體相差不大。這表明所提算法在性能上要優于選取的對比算法。具體分析如下: (1)所提BPSO+DNN算法的AUC值均超過了0.776,這表明,利用所提BPSO+DNN算法可實現對所有數據集軟件故障傾向的有效預測。此外,軟件度量之間存在很強的相關性,并且存在適當的軟件度集,這也表明刪除冗余度量有助于提高軟件故障傾向模型的性能。 (2)對比DNN和BPSO+DNN兩種算法,BPSO+DNN算法的AUC均值要始終高于DNN算法,這表明利用BPSO算法可以提高深度神經網絡的預測性能,去除冗余的度量,因此基于BPSO的度量選擇是很有必要的。 (3)通過對比PSO+DNN和BPSO+DNN算法,BPSO+DNN算法的AUC均值要明顯優于PSO+DNN算法,這表明PSO和BPSO算法均可實現度量指標的有效選擇,但是BPSO算法要明顯優于PSO算法。同時,根據表5結果可知,BPSO算法選取的指標數量,要少于PSO算法,這表明BPSO算法相對于PSO算法更加具有計算效率。 (4)通過對比BPSO+DNN算法和BPSO+SVM算法,BPSO+DNN算法在PC1、JM1和KC1數據集上的AUC均值要明顯優于BPSO+SVM算法,而在KC3數據集上的AUC均值兩種算法相同。這表明了SVM算法在軟件故障傾向預測上的有效性,也表明了BPSO+DNN算法的性能優勢。 表8給出DNN、PSO+DNN和BPSO+DNN這3種算法在4個數據集上的平均計算時間,每種算法獨立運行20次取均值。 表8 平均計算時間對比 根據表8計算結果可知,如果沒有采取降維措施,而是直接應用軟件缺陷預測,時間成本要高得多,這表明在降低運行時的降維效果非常顯著。此外,BPSO算法的性能比PSO算法的降維效果更優,可實現計算時間的最大降低。 本文研究了混合深度神經網絡和BPSO算法的應用開發軟件缺陷預測方法。所提出的預測方法能夠較為準確識別故障傾向性。所提出的預測方法的主要優點如下: (1)在本文中,BPSO算法是用于降低度量空間的維數,而深度神經網絡用于預測軟件模塊的故障傾向。并驗證了BPSO+DNN算法性能的有效性。 (2)所提降維算法實現簡單,這是因為粒子群算法有3個控制參數,而BPSO算法只有一個,因此更容易實現算法的控制。實驗結果表明,它是可能的,基于BPSO算法的降維技術可以簡化網絡結構,并獲得更加的預測性能。 (3)從度量空間中選取的幾個度量對于軟件模塊的故障傾向性而言,比其它非選擇度量具有更顯著的效果,這表明在軟件開發過程中,開發人員應該更多地關注選定的度量指標,而不是所有的度量指標。 (4)提出的預測方法能夠有效地預測軟件故障傾向性,因此開發人員只需集中于具有故障傾向性的軟件模塊,從而最大限度地降低軟件維護成本。2.3 降維方法
3 軟件故障傾向性預測方法
3.1 算法步驟
3.2 性能評價指標

4 實驗分析
4.1 測試數據集

4.2 參數設置


4.3 降維和預測結果分析




4.4 算法性能對比

4.5 算法計算復雜度分析


5 結束語