本發(fā)明屬于軟件缺陷預(yù)測(cè)技術(shù)領(lǐng)域,特別是涉及一種基于半監(jiān)督聚類數(shù)據(jù)篩選的跨項(xiàng)目缺陷預(yù)測(cè)方法。
背景技術(shù):
(1)軟件缺陷預(yù)測(cè)技術(shù)
軟件已經(jīng)成為影響國(guó)民經(jīng)濟(jì)、軍事、政治乃至社會(huì)生活的重要因素。高可靠和復(fù)雜的軟件系統(tǒng)依賴于其采用的軟件的可靠性。軟件的缺陷是導(dǎo)致相關(guān)系統(tǒng)出錯(cuò)、失效、崩潰甚至機(jī)毀人亡的潛在根源。所謂缺陷,到目前為止,學(xué)術(shù)界,產(chǎn)業(yè)界有很多相關(guān)的術(shù)語(yǔ)和定義,比如故障、缺陷、bug、錯(cuò)誤、失誤、失效、失敗等。根據(jù)iso9000對(duì)缺陷的定義為:滿足與預(yù)期或者規(guī)定用途有關(guān)的要求,缺陷是軟件中已經(jīng)存在的一個(gè)部分,可以通過(guò)修改軟件而消除。然而軟件技術(shù)發(fā)展至今,任何檢驗(yàn)、驗(yàn)證手段都不可能發(fā)現(xiàn)并排除所有的缺陷,軟件作為一種無(wú)形的產(chǎn)物,雖然不會(huì)磨損用壞,卻隨時(shí)可能因?yàn)槲覀儾灰撞橹脑虺霈F(xiàn)故障甚至失效。事實(shí)上,從第一個(gè)軟件誕生,就伴隨出現(xiàn)軟件缺陷的檢測(cè)和預(yù)測(cè)技術(shù)。檢測(cè)技術(shù)在于發(fā)現(xiàn)缺陷,而預(yù)測(cè)技術(shù)則在于預(yù)測(cè)還未發(fā)現(xiàn)的缺陷。
20世紀(jì)70年代,出現(xiàn)了利用統(tǒng)計(jì)學(xué)習(xí)技術(shù),根據(jù)歷史數(shù)據(jù)以及已經(jīng)發(fā)現(xiàn)的缺陷等軟件度量數(shù)據(jù)預(yù)測(cè)軟件系統(tǒng)的缺陷數(shù)目及類型。缺陷預(yù)測(cè)技術(shù)的目的在于統(tǒng)計(jì)計(jì)算機(jī)軟件系統(tǒng)的缺陷數(shù),以決定系統(tǒng)是否可以交付使用。缺陷預(yù)測(cè)技術(shù)為軟件質(zhì)量的提高和保證起著非常重要的作用,同時(shí)也促進(jìn)了軟件工程技術(shù)向前大大的發(fā)展了一步。
軟件缺陷預(yù)測(cè)過(guò)程的第一步是收集和標(biāo)注軟件實(shí)例。一個(gè)軟件實(shí)例能夠被標(biāo)記為有缺陷和無(wú)缺陷。第二步,抽取軟件實(shí)例的度量屬性。到目前為止,研究人員從不同的角度提出了許多軟件度量屬性,而與軟件缺陷預(yù)測(cè)密切相關(guān)的度量屬性主要有代碼度量、mccabe度量和halstead度量三種。代碼度量是最直接、應(yīng)用最普遍的度量屬性。通過(guò)對(duì)程序進(jìn)行簡(jiǎn)單的計(jì)數(shù),我們可以得到相關(guān)代碼的度量值。它包含總行數(shù)(loc)、空白行數(shù)目(locb)、注釋行數(shù)目(locc)、代碼行數(shù)目(loce)和代碼和注釋總數(shù)目(locec)。(文獻(xiàn):[1]包曉露,王小娟,賈有良、申來(lái)安。軟件測(cè)試基礎(chǔ):方法與度量[m].北京:人民郵電出版社,2007:74-76.)。軟件復(fù)雜性通過(guò)程序結(jié)構(gòu)的復(fù)雜性表現(xiàn)出來(lái),而程序結(jié)構(gòu)的復(fù)雜性主要值的是實(shí)例內(nèi)部程序的復(fù)雜性。macabe度量的正是實(shí)例內(nèi)部程序的復(fù)雜性。它由三種度量組成,分別為環(huán)形復(fù)雜度(cyclomaticcomplexity)、基本復(fù)雜度(essentialcomplexity)和設(shè)計(jì)復(fù)雜度(dessigncomplexity)。halstead度量不僅度量了程序長(zhǎng)度,還描述了程序的最小實(shí)現(xiàn)和實(shí)際實(shí)現(xiàn)之間的關(guān)系,并據(jù)此闡述程序語(yǔ)言的等級(jí)高低。halstead度量方法充分考慮了程序中出現(xiàn)的算子和操作數(shù),它包括軟件長(zhǎng)度(n)、容量(v)、級(jí)別(l)、難度(d)、工作量(e)、時(shí)間(t)、誤差估計(jì)(b)、程序消息(i)等度量。第三步,建立缺陷預(yù)測(cè)模型,缺陷預(yù)測(cè)模型本質(zhì)上屬于模式識(shí)別的范疇。而缺陷預(yù)測(cè)模型的建立過(guò)程就是通過(guò)一定的機(jī)器學(xué)習(xí)算法來(lái)搭建模型結(jié)構(gòu)并確定度量屬性之間依賴強(qiáng)度的過(guò)程,即為模型的結(jié)構(gòu)學(xué)習(xí)和參數(shù)學(xué)習(xí)過(guò)程。第四步,通過(guò)模型預(yù)測(cè)結(jié)果,由于建立好的缺陷預(yù)測(cè)模型可以通過(guò)自身模型結(jié)構(gòu)和模型參數(shù)來(lái)量化描述度量屬性與預(yù)測(cè)結(jié)果之間的因果關(guān)系,這樣給定一個(gè)軟件實(shí)例的度量屬性數(shù)據(jù)集,使用訓(xùn)練好的預(yù)測(cè)模型就可以得到該實(shí)例是否存在缺陷,即完成軟件缺陷預(yù)測(cè)的過(guò)程。
(2)跨項(xiàng)目軟件缺陷預(yù)測(cè)技術(shù)
到目前為止,許多高效的軟件缺陷預(yù)測(cè)方法已經(jīng)被提出,通常利用軟件實(shí)例的歷史數(shù)據(jù)并運(yùn)用統(tǒng)計(jì)分析、機(jī)器學(xué)習(xí)以及機(jī)器學(xué)習(xí)聯(lián)合統(tǒng)計(jì)分析等技術(shù)來(lái)進(jìn)行預(yù)測(cè)。但它們通常僅限于本項(xiàng)目的缺陷預(yù)測(cè)。當(dāng)有足夠的歷史數(shù)據(jù)可用來(lái)建立缺陷預(yù)測(cè)模型時(shí),本項(xiàng)目的缺陷預(yù)測(cè)效果很好。但對(duì)于一些新的項(xiàng)目來(lái)說(shuō),項(xiàng)目?jī)?nèi)的歷史數(shù)據(jù)是非常有限且不具有高可信度的,所以本項(xiàng)目缺陷預(yù)測(cè)很難順利進(jìn)行??珥?xiàng)目軟件缺陷預(yù)測(cè)是解決項(xiàng)目初期缺乏歷史數(shù)據(jù)來(lái)構(gòu)建模型的有效途徑。它通過(guò)利用一個(gè)或多個(gè)已有的其他項(xiàng)目(稱之為跨項(xiàng)目)數(shù)據(jù)來(lái)訓(xùn)練預(yù)測(cè)模型,然后將模型應(yīng)用到本項(xiàng)目,從而解決本項(xiàng)目沒有足夠的歷史數(shù)據(jù)來(lái)訓(xùn)練模型的問(wèn)題。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明提供的技術(shù)方案是一種基于半監(jiān)督聚類數(shù)據(jù)篩選的跨項(xiàng)目缺陷預(yù)測(cè)方法,包括以下步驟:
步驟1,挖掘本項(xiàng)目軟件歷史倉(cāng)庫(kù),從中抽取出有用的軟件模塊。軟件模塊粒度可根據(jù)實(shí)際應(yīng)用場(chǎng)景,可設(shè)置為文件、包、類或函數(shù)等。標(biāo)注所有的本項(xiàng)目軟件模塊是否有缺陷,標(biāo)記有缺陷的軟件模塊的類標(biāo)號(hào)為y,標(biāo)記無(wú)缺陷的軟件模塊的類標(biāo)號(hào)為n;
步驟2,抽取本項(xiàng)目現(xiàn)有的待預(yù)測(cè)的軟件模塊。這些待預(yù)測(cè)的本項(xiàng)目軟件模塊標(biāo)記為“?”;
步驟3,提取本項(xiàng)目軟件模塊的度量屬性,提取了20個(gè)度量屬性:加權(quán)方法數(shù)(wmc),繼承樹深度(dit),孩子數(shù)(noc),對(duì)象類之間的耦合度(cbo),類的響應(yīng)(rfc),內(nèi)聚缺乏度(lcom),傳入耦合(ca),傳出耦合(ce),公開方法數(shù)(npm),代碼行數(shù)(loc),數(shù)據(jù)訪問(wèn)度量(dam),聚合度量(moa),功能抽象度量(mfa),方法間的內(nèi)聚度(cam),繼承耦合(ic),方法間耦合(cbm),平均方法復(fù)雜度(amc),最大mccabe環(huán)形復(fù)雜度(max_cc),平均mccabe環(huán)形復(fù)雜度(avg_cc);
步驟4,由于在一個(gè)項(xiàng)目剛進(jìn)行開發(fā)時(shí),本項(xiàng)目歷史軟件模塊數(shù)據(jù)很少,不能訓(xùn)練本項(xiàng)目缺陷預(yù)測(cè)模型。因此需要借用跨項(xiàng)目歷史軟件模塊數(shù)據(jù)。從跨項(xiàng)目軟件歷史倉(cāng)庫(kù)中抽取有用的軟件模塊,將有缺陷的軟件模塊標(biāo)記為y,無(wú)缺陷的軟件模塊標(biāo)記為n;
步驟5,提取跨項(xiàng)目所有軟件模塊與步驟3中相同的20個(gè)度量屬性;
步驟6,對(duì)所有跨項(xiàng)目軟件模塊數(shù)據(jù)和所有本項(xiàng)目軟件模塊數(shù)據(jù)執(zhí)行半監(jiān)督聚類,獲得篩選后的跨項(xiàng)目軟件模塊數(shù)據(jù)。執(zhí)行以下子步驟,
步驟6.1,標(biāo)記所有跨項(xiàng)目軟件模塊和所有本項(xiàng)目軟件模塊未為訪問(wèn),隨機(jī)選擇一個(gè)未被訪問(wèn)的已被標(biāo)記為y或n的本項(xiàng)目歷史軟件模塊,將其邊界權(quán)值賦為0,并將其余未被訪問(wèn)所有本項(xiàng)目軟件模塊和所有跨項(xiàng)目軟件模塊的邊界權(quán)值賦為無(wú)窮。邊界權(quán)值定義了兩個(gè)實(shí)例密度相連的最小半徑值;
步驟6.2,循環(huán)選擇未被訪問(wèn)的已被標(biāo)記為y或n的本項(xiàng)目歷史軟件模塊創(chuàng)建簇,并逐漸擴(kuò)充簇,直至所有的已被標(biāo)記為y或n的本項(xiàng)目歷史軟件模塊均有其所屬簇。每次循環(huán)中,選擇邊界權(quán)值最小的軟件模塊加入簇,一旦在當(dāng)前簇中出現(xiàn)類標(biāo)號(hào)不同的本項(xiàng)目歷史軟件模塊,表明兩個(gè)需要被分離的簇即將被連接,此時(shí)停止對(duì)簇的擴(kuò)充,將當(dāng)前簇中所有軟件模塊標(biāo)記為已訪問(wèn),并重新選擇下一個(gè)未被訪問(wèn)的已被標(biāo)記為y或n的本項(xiàng)目歷史軟件模塊創(chuàng)建簇;利用邊界權(quán)值計(jì)算公式更新所有未被訪問(wèn)的軟件模塊的邊界權(quán)值,以推動(dòng)循環(huán);當(dāng)所有已被標(biāo)記為y或n的本項(xiàng)目歷史軟件模塊均有所屬簇,半監(jiān)督聚類過(guò)程結(jié)束;
步驟6.3,獲得篩選后的跨項(xiàng)目軟件模塊。在步驟6.2中產(chǎn)生的每個(gè)簇中一定會(huì)包含已被標(biāo)記為y或n的本項(xiàng)目歷史軟件模塊,有可能包含已被標(biāo)記為y或n的跨項(xiàng)目歷史軟件模塊,有可能包含標(biāo)記為“?”的待預(yù)測(cè)本項(xiàng)目軟件模塊。選擇所有生成的簇中與本項(xiàng)目歷史軟件模塊類標(biāo)號(hào)相同的所有跨項(xiàng)目歷史軟件模塊即為篩選后的跨項(xiàng)目軟件模塊數(shù)據(jù);
步驟7,對(duì)通過(guò)半監(jiān)督聚類算法篩選出的跨項(xiàng)目軟件模塊數(shù)據(jù)和本項(xiàng)目歷史軟件模塊數(shù)據(jù)混合形成混合訓(xùn)練集d,訓(xùn)練出樸素貝葉斯預(yù)測(cè)模型。由于軟件模塊屬于有缺陷的類(y)和無(wú)缺陷的類(n)的先驗(yàn)概率未知,則假定兩個(gè)類是等概率的,因此訓(xùn)練樸素貝葉斯算法模型只需對(duì)混合訓(xùn)練集d計(jì)算類標(biāo)號(hào)為y的軟件模塊在每個(gè)特征ak上的均值μky和標(biāo)準(zhǔn)差σky,計(jì)算類標(biāo)號(hào)為n的軟件模塊在每個(gè)特征ak上的均值μkn和標(biāo)準(zhǔn)差σkn;
步驟8,用訓(xùn)練得到的預(yù)測(cè)模型預(yù)測(cè)待預(yù)測(cè)的本項(xiàng)目軟件模塊x;
步驟8.1,計(jì)算待預(yù)測(cè)本項(xiàng)目軟件模塊x有缺陷的后驗(yàn)概率:
計(jì)算待預(yù)測(cè)本項(xiàng)目軟件模塊x無(wú)缺陷的后驗(yàn)概率:
步驟8.2,判定待預(yù)測(cè)的本項(xiàng)目軟件模塊是否有缺陷。如果p(x|n)>p(x|y),樸素貝葉斯分類方法判斷其類標(biāo)號(hào)為n,即該軟件模塊為無(wú)缺陷的軟件模塊。如果p(x|n)<p(x|y),樸素貝葉斯分類方法判斷其類標(biāo)記為y,即該軟件模塊為有缺陷的軟件模塊。
相對(duì)于國(guó)內(nèi)外已有的跨項(xiàng)目軟件缺陷預(yù)測(cè)方法,本發(fā)明針對(duì)跨項(xiàng)目軟件缺陷預(yù)測(cè)中大量不相關(guān)的跨項(xiàng)目軟件模塊數(shù)據(jù)損害了跨項(xiàng)目軟件缺陷預(yù)測(cè)模型性能的問(wèn)題,提出了一種基于半監(jiān)督聚類數(shù)據(jù)篩選的跨項(xiàng)目缺陷預(yù)測(cè)方法。首先,該方法結(jié)合全部本項(xiàng)目歷史軟件模塊、全部跨項(xiàng)目歷史軟件模塊和全部待預(yù)測(cè)的本項(xiàng)目軟件模塊;然后,利用半監(jiān)督聚類算法對(duì)這些模塊數(shù)據(jù)進(jìn)行聚類發(fā)現(xiàn)子簇;隨后,收集所有生成的簇中與本項(xiàng)目歷史軟件模塊類標(biāo)號(hào)相同的所有的跨項(xiàng)目歷史軟件模塊即為篩選后的跨項(xiàng)目軟件模塊數(shù)據(jù);最后基于篩選后的跨項(xiàng)目軟件模塊數(shù)據(jù)和所有的本項(xiàng)目歷史軟件模塊數(shù)據(jù)利用樸素貝葉斯分類算法建立跨項(xiàng)目缺陷預(yù)測(cè)模型,預(yù)測(cè)待預(yù)測(cè)的本項(xiàng)目軟件模塊數(shù)據(jù)。因此本發(fā)明具有如下優(yōu)點(diǎn):能夠利用半監(jiān)督聚類算法篩選出真正和本項(xiàng)目模塊數(shù)據(jù)相似的跨項(xiàng)目軟件模塊數(shù)據(jù),使跨項(xiàng)目軟件預(yù)測(cè)模型避免受到不相關(guān)跨項(xiàng)目軟件模塊數(shù)據(jù)的影響,充分利用跨項(xiàng)目歷史軟件模塊信息和本項(xiàng)目歷史軟件模塊信息,增強(qiáng)了跨項(xiàng)目軟件缺陷預(yù)測(cè)模型的性能。
附圖說(shuō)明
圖1本發(fā)明實(shí)施例的基于半監(jiān)督聚類數(shù)據(jù)篩選的跨項(xiàng)目缺陷預(yù)測(cè)流程圖。
圖2本發(fā)明實(shí)施例的本項(xiàng)目實(shí)例和跨項(xiàng)目實(shí)例在20維空間上的分布圖。
圖3本發(fā)明實(shí)施例的本項(xiàng)目實(shí)例和跨項(xiàng)目實(shí)例聚類結(jié)果圖。
具體實(shí)施方式
本發(fā)明設(shè)計(jì)的基于半監(jiān)督聚類數(shù)據(jù)篩選的跨項(xiàng)目缺陷預(yù)測(cè)方法流程實(shí)施例具體實(shí)現(xiàn)過(guò)程如下:
步驟1,挖掘本項(xiàng)目軟件歷史倉(cāng)庫(kù),從中抽取出有用的軟件模塊。軟件模塊粒度可根據(jù)實(shí)際應(yīng)用場(chǎng)景,可設(shè)置為文件、包、類或函數(shù)等。標(biāo)注所有的本項(xiàng)目軟件模塊是否有缺陷,標(biāo)記有缺陷的軟件模塊的類標(biāo)號(hào)為y,標(biāo)記無(wú)缺陷的軟件模塊的類標(biāo)號(hào)為n。
步驟2,抽取本項(xiàng)目現(xiàn)有的待預(yù)測(cè)的軟件模塊。這些待預(yù)測(cè)的本項(xiàng)目軟件模塊標(biāo)記為“?”。
步驟3,提取本項(xiàng)目軟件模塊的度量屬性,提取了20個(gè)度量屬性:加權(quán)方法數(shù)(wmc),繼承樹深度(dit),孩子數(shù)(noc),對(duì)象類之間的耦合度(cbo),類的響應(yīng)(rfc),內(nèi)聚缺乏度(lcom),傳入耦合(ca),傳出耦合(ce),公開方法數(shù)(npm),代碼行數(shù)(loc),數(shù)據(jù)訪問(wèn)度量(dam),聚合度量(moa),功能抽象度量(mfa),方法間的內(nèi)聚度(cam),繼承耦合(ic),方法間耦合(cbm),平均方法復(fù)雜度(amc),最大mccabe環(huán)形復(fù)雜度(max_cc),平均mccabe環(huán)形復(fù)雜度(avg_cc)。
在經(jīng)過(guò)了步驟1-3后,本實(shí)施例假設(shè)在提取度量屬性和標(biāo)記類標(biāo)號(hào)后形成了8個(gè)本項(xiàng)目模塊數(shù)據(jù):
x1={13,2,0,18,112,76,3,17,1,0.88,1000,1,1,0.4,0.3,1,1,75.8,10,5.2,n},
x2={10,3,0,11,17,33,3,11,9,0.56,79,1,0,0.67,0.267,1,1,6.7,3,1.1,y},
x3={13,1,0,66,13,78,66,1,13,2,13,0,0,0,0.369,0,0,0,1,1,y},
x4={17,1,0,84,17,136,80,7,17,2,17,0,0,0,0.222,0,0,0,1,1,y},
x5={0,1,0,27,0,0,26,1,0,2,0,0,0,0,0,0,0,0,0,0,?},
x6={2,3,0,3,7,1,0,3,1,2,24,0,0,0.833333333,0.667,1,1,11,1,0.5,?},
x7={5,3,0,8,31,2,1,8,3,0.5,122,1,1,0.8,0.4,0,0,23,3,1.2,?},
x8={26,1,1,10,47,0,5,5,24,0.08,236,1,1,0,0.258,0,0,8.038,2,1,n}
步驟4,由于在一個(gè)項(xiàng)目剛進(jìn)行開發(fā)時(shí),本項(xiàng)目歷史軟件模塊數(shù)據(jù)很少,不能訓(xùn)練本項(xiàng)目缺陷預(yù)測(cè)模型。因此需要借用跨項(xiàng)目歷史軟件模塊數(shù)據(jù)。從跨項(xiàng)目軟件歷史倉(cāng)庫(kù)中抽取有用的軟件模塊,將有缺陷的軟件模塊標(biāo)記為y,無(wú)缺陷的軟件模塊標(biāo)記為n。
步驟5,提取跨項(xiàng)目所有軟件模塊與步驟3中相同的20個(gè)度量屬性。
在經(jīng)過(guò)了步驟4-5后,本實(shí)施例假設(shè)在提取度量屬性和標(biāo)記類標(biāo)號(hào)后形成了14個(gè)跨項(xiàng)目軟件模塊數(shù)據(jù):
x9={3,1,0,8,14,3,3,5,3,2,85,0,0,0,0.5,0,0,27.33333333,9,3.3333,y},
x10={13,1,0,1,17,64,0,1,12,0.917,117,1,0,0,0.462,0,0,7.462,3,1.38,n},
x11={4,1,0,4,4,6,2,2,4,2,4,0,0,0,1,0,0,0,1,1,n},
x12={10,1,0,6,31,1,0,6,9,0.5,156,1,1,0,0.355555556,0,0,14.4,1,0.8,y},
x13={7,1,0,6,19,7,0,6,6,0.75,117.0,1,2,0,0.367,0,0,15.143,3,1.1429,n},
x14={38,1,0,30,155,485,0,30,34,0.9,1564,1,7,0,0.14,0,0,39.6,7,1.5,y},
x15={25,1,0,13,74,0,0,13,23,0.444,901,1,2,0,0.2,0,0,34.92,1,0.92,y},
x16={13,1,0,19,56,54,0,19,11,0.9,224,1,4,0,0.17,0,0,15.54,4,1.1538,y},
x17={7,4,4,48,12,19,47,1,6,0.94,44,0.33,0,0.867,0.458,0,0,4.86,1,0.29,n},
x18={7,1,0,4,7,21,2,2,7,2,7,0,0,0,0.357142857,0,0,0,1,1,y},
x19={4,1,0,2,4,6,2,0,4,2,4,0,0,0,0.875,0,0,0,1,1,n},
x20={35,1,0,29,12,0,373,0,29,31,0.9,1250,1,5,0,0.17,0,0,34.1,5,1.2,y},
x21={8,1,0,16,21,14,13,3,8,0.81,111,1,0,0,0.35,1,1,12.5,7,1.875,y},
x22={11,1,0,8,18,13,7,1,11,0.775,130,1,1,0,0.29,1,1,10.45,7,1.36,n},
這22個(gè)本項(xiàng)目軟件模塊數(shù)據(jù)和跨項(xiàng)目軟件模塊數(shù)據(jù)可以形成如圖2所示的在20維空間上的分布圖。約定:“○”表示類標(biāo)號(hào)為y的跨項(xiàng)目軟件模塊,“●”表示類標(biāo)號(hào)為n的跨項(xiàng)目軟件模塊,“△”表示類標(biāo)號(hào)為y的本項(xiàng)目軟件模塊,
步驟6,對(duì)所有跨項(xiàng)目軟件模塊數(shù)據(jù)和所有本項(xiàng)目軟件模塊數(shù)據(jù)執(zhí)行半監(jiān)督聚類,獲得篩選后的跨項(xiàng)目軟件模塊數(shù)據(jù)。執(zhí)行以下子步驟,
步驟6.1,標(biāo)記所有跨項(xiàng)目軟件模塊和所有本項(xiàng)目軟件模塊未為訪問(wèn),隨機(jī)選擇一個(gè)未被訪問(wèn)的已被標(biāo)記為y或n的本項(xiàng)目歷史軟件模塊,將其邊界權(quán)值賦為0,并將其余未被訪問(wèn)所有本項(xiàng)目軟件模塊和所有跨項(xiàng)目軟件模塊的邊界權(quán)值賦為無(wú)窮。邊界權(quán)值定義了兩個(gè)實(shí)例密度相連的最小半徑值。
步驟6.2,循環(huán)選擇未被訪問(wèn)的已被標(biāo)記為y或n的本項(xiàng)目歷史軟件模塊創(chuàng)建簇,并逐漸擴(kuò)充簇,直至所有的已被標(biāo)記為y或n的本項(xiàng)目歷史軟件模塊均有其所屬簇。每次循環(huán)中,選擇邊界權(quán)值最小的軟件模塊加入簇,一旦在當(dāng)前簇中出現(xiàn)類標(biāo)號(hào)不同的本項(xiàng)目歷史軟件模塊,表明兩個(gè)需要被分離的簇即將被連接,此時(shí)停止對(duì)簇的擴(kuò)充,將當(dāng)前簇中所有軟件模塊標(biāo)記為已訪問(wèn),并重新選擇下一個(gè)未被訪問(wèn)的已被標(biāo)記為y或n的本項(xiàng)目歷史軟件模塊創(chuàng)建簇;利用邊界權(quán)值計(jì)算公式更新所有未被訪問(wèn)的軟件模塊的邊界權(quán)值,以推動(dòng)循環(huán);當(dāng)所有已被標(biāo)記為y或n的本項(xiàng)目歷史軟件模塊均有所屬簇,半監(jiān)督聚類過(guò)程結(jié)束。在本實(shí)施例中,首先,x3由于邊界權(quán)值為0被加入簇c1,以x3為中心,更新剩余的未被訪問(wèn)的軟件模塊的邊界權(quán)值,繼續(xù)選取邊界權(quán)值最小的模塊加入簇c1,此時(shí)x13被加入簇c1,以x13為中心,再次更新剩余的未被訪問(wèn)的軟件模塊的邊界權(quán)值,重復(fù)尋找邊界權(quán)值最小的軟件模塊加入簇c1,并以新加入簇的軟件模塊為中心更新剩余軟件模塊的邊界權(quán)值,于是x7,x9,x12,x14也被加入簇c1。直至選擇到x8,由于其類標(biāo)號(hào)與x3不同,停止對(duì)簇c1的擴(kuò)充。同以上步驟,重新創(chuàng)建新的簇。最終,如圖3,我們創(chuàng)建了3個(gè)簇c1,c2,c3。
步驟6.3,獲得篩選后的跨項(xiàng)目軟件模塊。在步驟6.2中產(chǎn)生的每個(gè)簇中一定會(huì)包含已被標(biāo)記為y或n的本項(xiàng)目歷史軟件模塊,有可能包含已被標(biāo)記為y或n的跨項(xiàng)目歷史軟件模塊,有可能包含標(biāo)記為“?”的待預(yù)測(cè)本項(xiàng)目軟件模塊。選擇所有生成的簇中與本項(xiàng)目歷史軟件模塊類標(biāo)號(hào)相同的所有跨項(xiàng)目歷史軟件模塊即為篩選后的跨項(xiàng)目軟件模塊數(shù)據(jù)。本實(shí)施例中所有的本項(xiàng)目軟件模塊數(shù)據(jù)和所有的跨項(xiàng)目軟件模塊數(shù)據(jù)最終被聚類為三個(gè)簇,即c1={x3,x7,x9,x12,x13,x14},c2={x1,x8,x10,x11,x17},c3={x2,x4,x6,x15,x16,x20,x21,x22}。在簇c1中,跨項(xiàng)目軟件模塊x9,x12,x14由于與本公司歷史軟件模塊x3的類標(biāo)號(hào)相同,被選入最終的訓(xùn)練集中,而跨項(xiàng)目軟件模塊x13由于與本公司歷史軟件模塊x3的類標(biāo)號(hào)不同而被拋棄不予采用。簇c2、c3的數(shù)據(jù)篩選同c1。因此最終的跨項(xiàng)目軟件模塊訓(xùn)練集包含模塊x9,x10,x11,x12,x14,x15,x16,x17,x20,x21。
步驟7,對(duì)通過(guò)半監(jiān)督聚類算法篩選出的跨項(xiàng)目軟件模塊數(shù)據(jù)和本項(xiàng)目歷史軟件模塊數(shù)據(jù)混合形成混合訓(xùn)練集d,訓(xùn)練出樸素貝葉斯預(yù)測(cè)模型。由于軟件模塊屬于有缺陷的類(y)和無(wú)缺陷的類(n)的先驗(yàn)概率未知,則假定兩個(gè)類是等概率的,因此訓(xùn)練樸素貝葉斯算法模型只需對(duì)混合訓(xùn)練集d計(jì)算類標(biāo)號(hào)為y的軟件模塊在每個(gè)特征ak上的均值μky和標(biāo)準(zhǔn)差σky,計(jì)算類標(biāo)號(hào)為n的軟件模塊在每個(gè)特征ak上的均值μkn和標(biāo)準(zhǔn)差σkn。本實(shí)施例中d={x1,x2,x3,x4,x8,x9,x10,x11,x12,x14,x15,x16,x17,x20,x21},求得類標(biāo)號(hào)為y的軟件模塊在特征a1上的均值μ1y=17.2和標(biāo)準(zhǔn)差σ1y=11.12。同理求得類標(biāo)號(hào)為n的軟件模塊在特征a1上的均值μ1n和標(biāo)準(zhǔn)差σ1n,類標(biāo)號(hào)為y的軟件模塊在特征a2上的均值μ2y和標(biāo)準(zhǔn)差σ2y,類標(biāo)號(hào)為n的軟件模塊在特征a2上的均值μ2n和標(biāo)準(zhǔn)差σ2n,…,類標(biāo)號(hào)為y的軟件模塊在特征a20上的均值μ20y和標(biāo)準(zhǔn)差σ20y,類標(biāo)號(hào)為n的軟件模塊在特征a20上的均值μ20n和標(biāo)準(zhǔn)差σ20n。
步驟8,用訓(xùn)練得到的預(yù)測(cè)模型預(yù)測(cè)待預(yù)測(cè)的本項(xiàng)目軟件模塊x。
步驟8.1,計(jì)算待預(yù)測(cè)本項(xiàng)目軟件模塊x有缺陷的后驗(yàn)概率:
計(jì)算待預(yù)測(cè)本項(xiàng)目軟件模塊x無(wú)缺陷的后驗(yàn)概率:
本實(shí)施例預(yù)測(cè)待預(yù)測(cè)本項(xiàng)目模塊x6是否有缺陷,其特征a1的值為2。按照公式計(jì)算出
步驟8.2,判定待預(yù)測(cè)的本項(xiàng)目軟件模塊是否有缺陷。如果p(x|n)>p(x|y),樸素貝葉斯分類方法判斷其類標(biāo)號(hào)為n,即該軟件模塊為無(wú)缺陷的軟件模塊。如果p(x|n)<p(x|y),樸素貝葉斯分類方法判斷其類標(biāo)記為y,即該軟件模塊為有缺陷的軟件模塊。本實(shí)施例步驟8.1中求得軟件模塊x6的p(x6|y)=3.172014388856017e-32,p(x6|n)=7.084701372070163e-25,由于p(x6|n)>p(x6|y),樸素貝葉斯分類方法判斷其類標(biāo)記為n,即預(yù)測(cè)該軟件模塊為無(wú)缺陷的軟件模塊。