版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 算法課程設(shè)計報告</b></p><p><b> ?。ㄋ惴ň幊虒崿F(xiàn)類)</b></p><p><b> 貝葉斯算法編程實現(xiàn)</b></p><p> 院 系 部 門: </p><p> 學(xué) 生 學(xué) 號: ********
2、* </p><p> 學(xué) 生 姓 名: ********* </p><p> 指 導(dǎo) 教 師: ***** </p><p><b> 2013年5月</b></p><p> 第一部分 貝葉斯算法研究背景、特點與發(fā)展3</p><p>
3、 1.1 貝葉斯算法研究背景3</p><p> 1.2 貝葉斯算法特點3</p><p> 1.3 貝葉斯算法發(fā)展3</p><p> 第二部分 算法分析與程序流程圖設(shè)計3</p><p> 2.1、基于對問題的分析4</p><p> 2.2、基于對問題的java算法分析4</p
4、><p> 2.2、程序流程圖設(shè)計5</p><p> 第三部分 實現(xiàn)設(shè)計語言選擇與算法編程實現(xiàn)5</p><p> 3.1、java算法實現(xiàn)5</p><p> 第四部分 程序測試與結(jié)果分析10</p><p> 4.1程序測試10</p><p> 4.2結(jié)果分析11
5、</p><p> 第五部分 總結(jié)與心得體會11</p><p> 5.1總結(jié)與心得體會11</p><p> 第六部分 參考文獻(xiàn)12</p><p> 6.1參考文獻(xiàn)(2個)12</p><p> 第一部分 貝葉斯算法研究背景、特點與發(fā)展</p><p> 1.1
6、貝葉斯算法研究背景</p><p> 貝葉斯分類算法是統(tǒng)計學(xué)分類方法,它是一類利用概率統(tǒng)計知識進(jìn)行分類的算法。在許多場合,樸素貝葉斯(Naïve Bayes,NB)分類算法可以與決策樹和神經(jīng)網(wǎng)絡(luò)分類算法相媲美,且方法簡單、分類準(zhǔn)確率高、速度快。由于貝葉斯定理假設(shè)一個屬性值對給定類的影響?yīng)毩⒂谄渌鼘傩缘闹担思僭O(shè)在實際情況中經(jīng)常是不成立的,因此其分類準(zhǔn)確率可能會下降。為此,就出現(xiàn)了許多降低獨立性假設(shè)的
7、貝葉斯分類算法,如TAN(tree augmented Bayes network)算法。</p><p> 1.2 貝葉斯算法特點</p><p> 和決策樹模型相比,樸素貝葉斯模型發(fā)源于古典數(shù)學(xué)理論,有著堅實的數(shù)學(xué)基礎(chǔ),以 及穩(wěn)定的分類效率。同時,NBC模型所需估計的參數(shù)很少,對缺失數(shù)據(jù)不太敏感,算法也比較簡單。理論上,NBC模型與其他分類方法相比具有最小的誤差率。 但是實際上并
8、非總是如此,這是因為NBC模型假設(shè)屬性之間相互獨立,這個假設(shè)在實際應(yīng)用中往往是不成立的,這給NBC模型的正確分類帶來了一定影響。在屬 性個數(shù)比較多或者屬性之間相關(guān)性較大時,NBC模型的分類效率比不上決策樹模型。而在屬性相關(guān)性較小時,NBC模型的性能最為良好。</p><p> 1.3 貝葉斯算法發(fā)展</p><p> 貝葉斯分類理論有最初的樸素貝葉斯于EM算法,灰色關(guān)系繼續(xù)發(fā)展為基于
9、改進(jìn)EM的樸素貝葉斯分類理論。</p><p> 第二部分 算法分析與程序流程圖設(shè)計</p><p> 2.1、基于對問題的分析</p><p> 對問題進(jìn)行分析,設(shè)X是類標(biāo)號未知的數(shù)據(jù)樣本,設(shè)H為某種假的,如數(shù)據(jù)養(yǎng)本X屬于某特定的類C。對與分類問題,希望確定P(H|X),即給定觀測數(shù)據(jù)樣本X,假定H成立的概率。貝葉斯定理給出了如下計算P(H|X)的簡單有效
10、的方法:</p><p> P(H|X)=P(X|H)P(H)/P(X)</p><p> 其中P(H)稱為先驗概率,P(X|H)表示假設(shè)H成立時觀查到X的概率。</p><p> P(H|X)表示后驗概率。</p><p> 每一個樣本數(shù)據(jù)用一個n維特征向量X={x1,x2,x3,…,xn}表示,分別描述具有n個屬性A1,A1,…A
11、n的樣本的n個度量。</p><p> 假定有m個類C1,C2,…,Cm,給定一個未知數(shù)據(jù)樣本X(即沒有類編號),分類器將預(yù)測X屬性與最高后驗概率的類。也就是說,樸素貝葉斯分類將未知樣本分配給Ci(1<=i<=m),當(dāng)且僅當(dāng)P(Ci|X)>P(Cj|X),j=1,2,…m,j不等于i這樣最大的P(Ci|X)對應(yīng)的類Ci稱為最大后驗假定。</p><p> 由于P(X)
12、對于所有類是常數(shù),只需要P(X|Ci)P(Ci)最大即可。注意假設(shè)不是等概率的,那么類的先驗概率可以用P(Ci)=si/s計算,其中si是類Ci的訓(xùn)練樣本數(shù),而s是訓(xùn)練樣本總數(shù)。P(X|Ci)=</p><p> 2.2、基于對問題的java算法分析</p><p> 首先需要將所有的訓(xùn)練數(shù)據(jù)讀入到ArrayList<ArrayList<String>>對象集合
13、中去,其中每一條訓(xùn)練數(shù)據(jù)對應(yīng)一個ArrayList<String>對象集合。</p><p> 同理用readTestData()將測試元組讀如ArrayList<String>對象集合中去。</p><p> 下面就需要將ArrayList<ArrayList<String>>中的每一組訓(xùn)練元組按照類別屬性分開,保存到Map<St
14、ring, ArrayList<ArrayList<String>>>對象中去</p><p> 用三重for循環(huán)來計算測試元組中每一屬性所在每一個類別中概率的之積,并返回最大積所對應(yīng)的類別名稱。</p><p> 2.2、程序流程圖設(shè)計</p><p> 第三部分 實現(xiàn)設(shè)計語言選擇與算法編程實現(xiàn)</p><
15、p> 3.1、java算法實現(xiàn)</p><p> package org.decimalcalculate;</p><p> import java.math.BigDecimal;</p><p> public class DecimalCalculate {</p><p> private static final
16、int DEF_DIV_SCALE = 10;</p><p> // 這個類不能實例化</p><p> private DecimalCalculate() {</p><p><b> }</b></p><p> public static double add(double v1, double v2)
17、 {</p><p> BigDecimal b1 = new BigDecimal(Double.toString(v1));</p><p> BigDecimal b2 = new BigDecimal(Double.toString(v2));</p><p> return b1.add(b2).doubleValue();</p>&
18、lt;p><b> }</b></p><p> public static double sub(double v1, double v2) {</p><p> BigDecimal b1 = new BigDecimal(Double.toString(v1));</p><p> BigDecimal b2 = new B
19、igDecimal(Double.toString(v2));</p><p> return b1.subtract(b2).doubleValue();</p><p><b> }</b></p><p> public static double mul(double v1, double v2) {</p><
20、;p> BigDecimal b1 = new BigDecimal(Double.toString(v1));</p><p> BigDecimal b2 = new BigDecimal(Double.toString(v2));</p><p> return b1.multiply(b2).doubleValue();</p><p><
21、b> }</b></p><p> public static double div(double v1, double v2) {</p><p> return div(v1, v2, DEF_DIV_SCALE);</p><p><b> }</b></p><p> public s
22、tatic double div(double v1, double v2, int scale) {</p><p> if (scale < 0) {</p><p> throw new IllegalArgumentException(</p><p> "The scale must be a positive integer or
23、zero");</p><p><b> }</b></p><p> BigDecimal b1 = new BigDecimal(Double.toString(v1));</p><p> BigDecimal b2 = new BigDecimal(Double.toString(v2));</p><
24、;p> return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();</p><p><b> }</b></p><p> public static double round(double v, int scale) {</p><p> if (sc
25、ale < 0) {</p><p> throw new IllegalArgumentException(</p><p> "The scale must be a positive integer or zero");</p><p><b> }</b></p><p> Bi
26、gDecimal b = new BigDecimal(Double.toString(v));</p><p> BigDecimal one = new BigDecimal("1");</p><p> return b.divide(one, scale, BigDecimal.ROUND_HALF_UP).doubleValue();</p>
27、<p><b> }</b></p><p> public static float convertsToFloat(double v) {</p><p> BigDecimal b = new BigDecimal(v);</p><p> return b.floatValue();</p><p
28、><b> }</b></p><p> public static int convertsToInt(double v) {</p><p> BigDecimal b = new BigDecimal(v);</p><p> return b.intValue();</p><p><b>
29、; }</b></p><p> public static long convertsToLong(double v) {</p><p> BigDecimal b = new BigDecimal(v);</p><p> return b.longValue();</p><p><b> }</
30、b></p><p> public static double returnMax(double v1, double v2) {</p><p> BigDecimal b1 = new BigDecimal(v1);</p><p> BigDecimal b2 = new BigDecimal(v2);</p><p>
31、 return b1.max(b2).doubleValue();</p><p><b> }</b></p><p> public static double returnMin(double v1, double v2) {</p><p> BigDecimal b1 = new BigDecimal(v1);</p>
32、;<p> BigDecimal b2 = new BigDecimal(v2);</p><p> return b1.min(b2).doubleValue();</p><p><b> }</b></p><p> public static int compareTo(double v1, double v2)
33、{</p><p> BigDecimal b1 = new BigDecimal(v1);</p><p> BigDecimal b2 = new BigDecimal(v2);</p><p> return b1.compareTo(b2);</p><p><b> }</b></p>&
34、lt;p><b> }</b></p><p> package org.decimalcalculate;</p><p> import java.io.BufferedReader;</p><p> import java.io.IOException;</p><p> import java.
35、io.InputStreamReader;</p><p> import java.util.ArrayList;</p><p> import java.util.StringTokenizer;</p><p> import org.bayes.*;</p><p> public class TestBayes {<
36、/p><p> public ArrayList<String> readTestData() throws IOException {</p><p> ArrayList<String> candAttr = new ArrayList<String>();</p><p> BufferedReader reader =
37、new BufferedReader(new InputStreamReader(</p><p> System.in));</p><p> String str = "";</p><p> while (!(str = reader.readLine()).equals("")) {</p><
38、;p> StringTokenizer tokenizer = new StringTokenizer(str);</p><p> while (tokenizer.hasMoreTokens()) {</p><p> candAttr.add(tokenizer.nextToken());</p><p><b> }</b>
39、;</p><p><b> }</b></p><p> return candAttr;</p><p><b> }</b></p><p> public ArrayList<ArrayList<String>> readTupleData() throws
40、IOException {</p><p> ArrayList<ArrayList<String>> datas = new ArrayList<ArrayList<String>>();</p><p> BufferedReader reader = new BufferedReader(new InputStreamReader(
41、</p><p> System.in));</p><p> String str = "";</p><p> while (!(str = reader.readLine()).equals("")) {</p><p> StringTokenizer tokenizer = new S
42、tringTokenizer(str);</p><p> ArrayList<String> s = new ArrayList<String>();</p><p> while (tokenizer.hasMoreTokens()) {</p><p> s.add(tokenizer.nextToken());</p>
43、;<p><b> }</b></p><p> datas.add(s);</p><p><b> }</b></p><p> return datas;</p><p><b> }</b></p><p> publi
44、c static void main(String[] args) {</p><p> TestBayes tb = new TestBayes();</p><p> ArrayList<ArrayList<String>> datas = null;</p><p> ArrayList<String> testT =
45、 null;</p><p> Bayes bayes = new Bayes();</p><p><b> try {</b></p><p> System.out.println("請輸入訓(xùn)練數(shù)據(jù)集:");</p><p> datas = tb.readTupleData();<
46、;/p><p> while (true) {</p><p> System.out.println("請輸入測試元組:");</p><p> testT = tb.readTestData();</p><p> String c = bayes.calculateProbabilityOfClass(datas
47、, testT);</p><p> System.out.println("The class is: " + c);</p><p><b> }</b></p><p> } catch (IOException e) {</p><p> e.printStackTrace();<
48、;/p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> package org.bayes;</p><p> import java.util.ArrayList;<
49、;/p><p> import java.util.HashMap;</p><p> import java.util.Map;</p><p> import org.decimalcalculate.*;</p><p> public class Bayes {</p><p> Map<Strin
50、g, ArrayList<ArrayList<String>>> accordingDateOfClassToSort(</p><p> ArrayList<ArrayList<String>> datas) {</p><p> Map<String, ArrayList<ArrayList<String>
51、;>> map = new HashMap<String, ArrayList<ArrayList<String>>>();</p><p> ArrayList<String> t = null;</p><p> String c = "";</p><p> for (int
52、 i = 0; i < datas.size(); i++) {</p><p> t = datas.get(i);</p><p> c = t.get(t.size() - 1);</p><p> if (map.containsKey(c)) {</p><p> map.get(c).add(t);</p>
53、;<p><b> } else {</b></p><p> ArrayList<ArrayList<String>> nt = new ArrayList<ArrayList<String>>();</p><p> nt.add(t);</p><p> map.put
54、(c, nt);</p><p><b> }</b></p><p><b> }</b></p><p> return map;</p><p><b> }</b></p><p> public String calculatePro
55、babilityOfClass(</p><p> ArrayList<ArrayList<String>> datas, ArrayList<String> testT) {</p><p> Map<String, ArrayList<ArrayList<String>>> doc = this</p&g
56、t;<p> .accordingDateOfClassToSort(datas);</p><p> Object classes[] = doc.keySet().toArray();</p><p> double maxP = 0.00;</p><p> int maxPIndex = -1;</p><p>
57、 for (int i = 0; i < doc.size(); i++) {</p><p> String c = classes[i].toString();</p><p> ArrayList<ArrayList<String>> d = doc.get(c);</p><p> double pOfC = Decim
58、alCalculate.div(d.size(), datas.size(), 3);</p><p> for (int j = 0; j < testT.size(); j++) {</p><p> double pv = this.pOfV(d, testT.get(j), j);</p><p> pOfC = DecimalCalculate
59、.mul(pOfC, pv);</p><p><b> }</b></p><p> if (pOfC > maxP) {</p><p> maxP = pOfC;</p><p> maxPIndex = i;</p><p><b> }</b><
60、;/p><p><b> }</b></p><p> return classes[maxPIndex].toString();</p><p><b> }</b></p><p><b> /**</b></p><p> private d
61、ouble pOfV(ArrayList<ArrayList<String>> d, String value, int index) {</p><p> double p = 0.00;</p><p> int count = 0;</p><p> int total = d.size();</p><p&g
62、t; ArrayList<String> t = null;</p><p> for (int i = 0; i < total; i++) {</p><p> if (d.get(i).get(index).equals(value)) {</p><p><b> count++;</b></p>
63、<p><b> }</b></p><p><b> }</b></p><p> p = DecimalCalculate.div(count, total, 3);</p><p><b> return p;</b></p><p><b>
64、; }</b></p><p><b> }</b></p><p> 第四部分 程序測試與結(jié)果分析</p><p><b> 4.1程序測試</b></p><p><b> 4.2結(jié)果分析</b></p><p> 該截圖是
65、在測試算法時過程的截圖。運行無誤</p><p> 第五部分 總結(jié)與心得體會</p><p> 5.1總結(jié)與心得體會</p><p> 該算法是貝葉斯算法,使用java語言通過對象集合保存數(shù)據(jù)再通過三重for循環(huán)實現(xiàn)的簡單樸素貝葉斯算法,該算法只是適應(yīng)于一般的情況。不足之處在于沒有進(jìn)行輸入驗證,如果輸入非法字符就會產(chǎn)生異常使程序死掉,如下圖:</p&g
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 生物信息學(xué)課程設(shè)計--生物信息遺傳算法編程實現(xiàn)
- 利用貝葉斯統(tǒng)計建立生物信息學(xué)模型.pdf
- 生物信息學(xué)課程信息
- 生物信息學(xué)
- 生物信息學(xué)中的算法問題
- 生物信息學(xué)課件
- 生物信息學(xué)導(dǎo)論
- 生物信息學(xué)教案
- 生物信息學(xué)概論
- 生物信息學(xué)序列分析
- 生物信息學(xué) 期末復(fù)習(xí)
- 生物信息學(xué)考試大綱
- 生物信息學(xué)作業(yè)實驗
- 生物信息學(xué)多序列比對算法研究.pdf
- 生物信息學(xué)選擇題
- 生物信息學(xué)中的模式發(fā)現(xiàn)算法研究.pdf
- 生物信息學(xué)復(fù)習(xí)題
- 生物信息學(xué)及其發(fā)展歷史
- 生物信息學(xué) 復(fù)習(xí)題
- 生物信息學(xué)實驗報告
評論
0/150
提交評論