版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p><b> 算法課程設計報告</b></p><p><b> (算法編程實現類)</b></p><p><b> 貝葉斯算法編程實現</b></p><p> 院 系 部 門: </p><p> 學 生 學 號: ********
2、* </p><p> 學 生 姓 名: ********* </p><p> 指 導 教 師: ***** </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> 第二部分 算法分析與程序流程圖設計3</p><p> 2.1、基于對問題的分析4</p><p> 2.2、基于對問題的java算法分析4</p
4、><p> 2.2、程序流程圖設計5</p><p> 第三部分 實現設計語言選擇與算法編程實現5</p><p> 3.1、java算法實現5</p><p> 第四部分 程序測試與結果分析10</p><p> 4.1程序測試10</p><p> 4.2結果分析11
5、</p><p> 第五部分 總結與心得體會11</p><p> 5.1總結與心得體會11</p><p> 第六部分 參考文獻12</p><p> 6.1參考文獻(2個)12</p><p> 第一部分 貝葉斯算法研究背景、特點與發(fā)展</p><p> 1.1
6、貝葉斯算法研究背景</p><p> 貝葉斯分類算法是統(tǒng)計學分類方法,它是一類利用概率統(tǒng)計知識進行分類的算法。在許多場合,樸素貝葉斯(Naïve Bayes,NB)分類算法可以與決策樹和神經網絡分類算法相媲美,且方法簡單、分類準確率高、速度快。由于貝葉斯定理假設一個屬性值對給定類的影響獨立于其它屬性的值,而此假設在實際情況中經常是不成立的,因此其分類準確率可能會下降。為此,就出現了許多降低獨立性假設的
7、貝葉斯分類算法,如TAN(tree augmented Bayes network)算法。</p><p> 1.2 貝葉斯算法特點</p><p> 和決策樹模型相比,樸素貝葉斯模型發(fā)源于古典數學理論,有著堅實的數學基礎,以 及穩(wěn)定的分類效率。同時,NBC模型所需估計的參數很少,對缺失數據不太敏感,算法也比較簡單。理論上,NBC模型與其他分類方法相比具有最小的誤差率。 但是實際上并
8、非總是如此,這是因為NBC模型假設屬性之間相互獨立,這個假設在實際應用中往往是不成立的,這給NBC模型的正確分類帶來了一定影響。在屬 性個數比較多或者屬性之間相關性較大時,NBC模型的分類效率比不上決策樹模型。而在屬性相關性較小時,NBC模型的性能最為良好。</p><p> 1.3 貝葉斯算法發(fā)展</p><p> 貝葉斯分類理論有最初的樸素貝葉斯于EM算法,灰色關系繼續(xù)發(fā)展為基于
9、改進EM的樸素貝葉斯分類理論。</p><p> 第二部分 算法分析與程序流程圖設計</p><p> 2.1、基于對問題的分析</p><p> 對問題進行分析,設X是類標號未知的數據樣本,設H為某種假的,如數據養(yǎng)本X屬于某特定的類C。對與分類問題,希望確定P(H|X),即給定觀測數據樣本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)表示假設H成立時觀查到X的概率。</p><p> P(H|X)表示后驗概率。</p><p> 每一個樣本數據用一個n維特征向量X={x1,x2,x3,…,xn}表示,分別描述具有n個屬性A1,A1,…A
11、n的樣本的n個度量。</p><p> 假定有m個類C1,C2,…,Cm,給定一個未知數據樣本X(即沒有類編號),分類器將預測X屬性與最高后驗概率的類。也就是說,樸素貝葉斯分類將未知樣本分配給Ci(1<=i<=m),當且僅當P(Ci|X)>P(Cj|X),j=1,2,…m,j不等于i這樣最大的P(Ci|X)對應的類Ci稱為最大后驗假定。</p><p> 由于P(X)
12、對于所有類是常數,只需要P(X|Ci)P(Ci)最大即可。注意假設不是等概率的,那么類的先驗概率可以用P(Ci)=si/s計算,其中si是類Ci的訓練樣本數,而s是訓練樣本總數。P(X|Ci)=</p><p> 2.2、基于對問題的java算法分析</p><p> 首先需要將所有的訓練數據讀入到ArrayList<ArrayList<String>>對象集合
13、中去,其中每一條訓練數據對應一個ArrayList<String>對象集合。</p><p> 同理用readTestData()將測試元組讀如ArrayList<String>對象集合中去。</p><p> 下面就需要將ArrayList<ArrayList<String>>中的每一組訓練元組按照類別屬性分開,保存到Map<St
14、ring, ArrayList<ArrayList<String>>>對象中去</p><p> 用三重for循環(huán)來計算測試元組中每一屬性所在每一個類別中概率的之積,并返回最大積所對應的類別名稱。</p><p> 2.2、程序流程圖設計</p><p> 第三部分 實現設計語言選擇與算法編程實現</p><
15、p> 3.1、java算法實現</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("請輸入訓練數據集:");</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> 第四部分 程序測試與結果分析</p><p><b> 4.1程序測試</b></p><p><b> 4.2結果分析</b></p><p> 該截圖是
65、在測試算法時過程的截圖。運行無誤</p><p> 第五部分 總結與心得體會</p><p> 5.1總結與心得體會</p><p> 該算法是貝葉斯算法,使用java語言通過對象集合保存數據再通過三重for循環(huán)實現的簡單樸素貝葉斯算法,該算法只是適應于一般的情況。不足之處在于沒有進行輸入驗證,如果輸入非法字符就會產生異常使程序死掉,如下圖:</p&g
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
評論
0/150
提交評論