1. 程式人生 > >資料探勘貝葉斯(Bayes)演算法java實現 帶註釋詳解

資料探勘貝葉斯(Bayes)演算法java實現 帶註釋詳解

注:本演算法的實現僅僅適用於小規模資料集的實驗與測試,不適合用於工程應用
<span style="font-family: Arial, Helvetica, sans-serif;"> 演算法假定訓練資料各屬性列的值均是離散型別的。若是非離散型別的資料,需要首先進行資料的預處理,將非離散型的資料離散化。</span>
import java.util.HashMap;
import java.util.Map;



/**
 * 貝葉斯主體類
 * @author Rowen
 * @qq 443773264
 * @mail [email protected]
 * @blog blog.csdn.net/luowen3405
 * @date 2011.03.15
 */
public class Bayes {
	/**
	 * 將原訓練元組按類別劃分
	 * @param datas 訓練元組
	 * @return Map<類別,屬於該類別的訓練元組>
	 */
	Map<String, ArrayList<ArrayList<String>>> datasOfClass(ArrayList<ArrayList<String>> datas){
		
		//用於存放某類別       與                該類別對應的訓練資料
		Map<String, ArrayList<ArrayList<String>>> map = new HashMap<String, ArrayList<ArrayList<String>>>();

		
		for(int i = 0 ; i < datas.size() ; i++){
			//用於表示第i條訓練資料
			ArrayList<String> trainData = datas.get(i);
			//類別
			String type = null;
			//第i條資料的類別
			type = datas.get(i).get(datas.get(i).size() - 1);
			//如果不是第一次遇到type型別
			if(map.containsKey(type)){
				//將整個第i條訓練資料放入到type型別{Key}對應的{value}中
				map.get(type).add(trainData);
			}else{//如果是第一次遇到type型別
				ArrayList<ArrayList<String>> typeTrainDatas = new ArrayList<ArrayList<String>>();
				//將第i條資料放入到type型別對應的訓練集typeTrainDatas中
				typeTrainDatas.add(trainData);
				//將          型別               與                      相應訓練集加入到map中
				map.put(type,typeTrainDatas);
			}
		}
		
		return map;
	}
	/**
	 * 在訓練資料的基礎上預測測試元組的類別
	 * @param datas 訓練元組
	 * @param testT 測試元組
	 * @return 測試元組的類別
	 */
	public String predictClass(ArrayList<ArrayList<String>> datas, ArrayList<String> testT) {
		
		//拿到分好類的訓練集
		Map<String, ArrayList<ArrayList<String>>> doc = this.datasOfClass(datas);
		//分類的種類集
		Object[] classes = doc.keySet().toArray();
		double maxP = 0.00;
		int maxPIndex = -1;
		//Vnb =arg max P( Vj ) Π i P ( ai | Vj )     Vj 代表第j種分類
		for(int i = 0 ; i < doc.size() ; i ++ ){//doc.size() 表示類別數
			//得到第i種分類
			String type = classes[i].toString();
			//求P( Vj )
			//1、求訓練集中分類type的條數d.size()
			ArrayList<ArrayList<String>> d = doc.get(type);
			//2、求訓練資料的總條數 //datas.size();
			
			//3、求出P( Vi )     //pOfC表示P( Vi )  : 種類為type的訓練元組的組數/訓練元組的組數   Vi表示第i種分類
			double pOfC = DecimalCalculate.div(d.size(), datas.size(), 3);
			//一條測試資料   testT
			//Π i P ( aj | Vi )  = p(a0|vi)*p(a1|vi)*p(a2|vi)*...*p()
			for(int j = 0 ; j < testT.size() ; j++){
				
				//pv是p(aj|vi)
				double pv = pOfV(d,testT.get(j),j);
				pOfC = DecimalCalculate.mul(pOfC, pv);
			}
			
			if(pOfC > maxP){
				maxP = pOfC;
				maxPIndex = i;
			}
		}
		return classes[maxPIndex].toString();
		
	}
	
	/**
	 * 計算指定屬性列上指定值出現的概率
	 * @param d 屬於某一類的訓練元組
	 * @param value 列值
	 * @param index 屬性列索引
	 * @return 概率
	 */
	private double pOfV(ArrayList<ArrayList<String>> d, String value, int index) {
		double p = 0.0;
		int count = 0;
		int total = d.size();
		
		for(int i = 0 ; i < d.size(); i++){
			if(d.get(i).get(index).equals(value)){
				count++;
			}
		}
		p = DecimalCalculate.div(count, total, 3);
		return p;
		
	}
}
</pre><pre name="code" class="java">

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;
/**
 * 貝葉斯演算法測試類
 * @author Rowen
 * @qq 443773264
 * @mail [email protected]
 * @blog blog.csdn.net/luowen3405
 * @data 2011.03.15
 */
public class TestBayes {
<span style="white-space:pre">	</span>/**
<span style="white-space:pre">	</span> * 讀取測試元組
<span style="white-space:pre">	</span> * @return 一條測試元組
<span style="white-space:pre">	</span> * @throws IOException
<span style="white-space:pre">	</span> */
<span style="white-space:pre">	</span>public ArrayList<String> readTestData() throws IOException{
<span style="white-space:pre">		</span>ArrayList<String> candAttr = new ArrayList<String>();
<span style="white-space:pre">		</span>BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
<span style="white-space:pre">		</span>String str = "";
<span style="white-space:pre">		</span>while (!(str = reader.readLine()).equals("")) {
<span style="white-space:pre">			</span>StringTokenizer tokenizer = new StringTokenizer(str);
<span style="white-space:pre">			</span>while (tokenizer.hasMoreTokens()) {
<span style="white-space:pre">				</span>candAttr.add(tokenizer.nextToken());
<span style="white-space:pre">			</span>}
<span style="white-space:pre">		</span>}
<span style="white-space:pre">		</span>return candAttr;
<span style="white-space:pre">	</span>}
<span style="white-space:pre">	</span>
<span style="white-space:pre">	</span>/**
<span style="white-space:pre">	</span> * 讀取訓練元組
<span style="white-space:pre">	</span> * @return 訓練元組集合
<span style="white-space:pre">	</span> * @throws IOException
<span style="white-space:pre">	</span> */
<span style="white-space:pre">	</span>public ArrayList<ArrayList<String>> readData() throws IOException {
<span style="white-space:pre">		</span>ArrayList<ArrayList<String>> datas = new ArrayList<ArrayList<String>>();
<span style="white-space:pre">		</span>BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
<span style="white-space:pre">		</span>String str = "";
<span style="white-space:pre">		</span>while (!(str = reader.readLine()).equals("")) {
<span style="white-space:pre">			</span>StringTokenizer tokenizer = new StringTokenizer(str);
<span style="white-space:pre">			</span>ArrayList<String> s = new ArrayList<String>();
<span style="white-space:pre">			</span>while (tokenizer.hasMoreTokens()) {
<span style="white-space:pre">				</span>s.add(tokenizer.nextToken());
<span style="white-space:pre">			</span>}
<span style="white-space:pre">			</span>datas.add(s);
<span style="white-space:pre">		</span>}
<span style="white-space:pre">		</span>return datas;
<span style="white-space:pre">	</span>}
<span style="white-space:pre">	</span>
<span style="white-space:pre">	</span>public static void main(String[] args) {
<span style="white-space:pre">		</span>TestBayes tb = new TestBayes();
<span style="white-space:pre">		</span>ArrayList<ArrayList<String>> datas = null;
<span style="white-space:pre">		</span>ArrayList<String> testT = null;
<span style="white-space:pre">		</span>Bayes bayes = new Bayes();
<span style="white-space:pre">		</span>try {
<span style="white-space:pre">			</span>System.out.println("請輸入訓練資料");
<span style="white-space:pre">			</span>datas = tb.readData();
<span style="white-space:pre">			</span>while (true) {
<span style="white-space:pre">				</span>System.out.println("請輸入測試元組");
<span style="white-space:pre">				</span>testT = tb.readTestData();
<span style="white-space:pre">				</span>String c = bayes.predictClass(datas, testT);
<span style="white-space:pre">				</span>System.out.println("The class is: " + c);
<span style="white-space:pre">			</span>}
<span style="white-space:pre">		</span>} catch (IOException e) {
<span style="white-space:pre">			</span>e.printStackTrace();
<span style="white-space:pre">		</span>}
<span style="white-space:pre">	</span>}
}
import java.math.BigDecimal; 
public class DecimalCalculate { 

private static final int DEF_DIV_SCALE = 10; 
    
//這個類不能例項化 
private DecimalCalculate(){ 
} 
/** 
 * 提供精確的加法運算。 
 * @param v1 被加數 
 * @param v2 加數 
 * @return 兩個引數的和 
 */ 
    public static double add(double v1,double v2){ 
        BigDecimal b1 = new BigDecimal(Double.toString(v1)); 
        BigDecimal b2 = new BigDecimal(Double.toString(v2)); 
        return b1.add(b2).doubleValue(); 
    } 
    /** 
     * 提供精確的減法運算。 
     * @param v1 被減數 
     * @param v2 減數 
     * @return 兩個引數的差 
     */  
    public static double sub(double v1,double v2){ 
        BigDecimal b1 = new BigDecimal(Double.toString(v1)); 
        BigDecimal b2 = new BigDecimal(Double.toString(v2)); 
        return b1.subtract(b2).doubleValue(); 
    } 
    /** 
     * 提供精確的乘法運算。 
     * @param v1 被乘數 
     * @param v2 乘數 
     * @return 兩個引數的積 
     */ 
    public static double mul(double v1,double v2){ 
        BigDecimal b1 = new BigDecimal(Double.toString(v1)); 
        BigDecimal b2 = new BigDecimal(Double.toString(v2)); 
        return b1.multiply(b2).doubleValue(); 
    } 
    /** 
     * 提供(相對)精確的除法運算,當發生除不盡的情況時,精確到 
     * 小數點以後10位,以後的數字四捨五入。 
     * @param v1 被除數 
     * @param v2 除數 
     * @return 兩個引數的商 
     */ 
    public static double div(double v1,double v2){ 
        return div(v1,v2,DEF_DIV_SCALE); 
    } 
    /** 
     * 提供(相對)精確的除法運算,當發生除不盡的情況時,精確到 
     * 小數點以後10位,以後的數字四捨五入。 
     * @param v1 被除數 
     * @param v2 除數 
     * @return 兩個引數的商 
     */ 
    public static double div(double v1,double v2,int scale){ 
        if(scale<0){ 
            throw new IllegalArgumentException( 
                "The scale must be a positive integer or zero"); 
        } 
        BigDecimal b1 = new BigDecimal(Double.toString(v1)); 
        BigDecimal b2 = new BigDecimal(Double.toString(v2)); 
        return b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue(); 
    } 
    /** 
     * 提供精確的小數位四捨五入處理。 
     * @param v 需要四捨五入的數字 
     * @param scale 小數點後保留幾位 
     * @return 四捨五入後的結果 
     */ 
    public static double round(double v,int scale){ 
        if(scale<0){ 
            throw new IllegalArgumentException( 
                "The scale must be a positive integer or zero"); 
        } 
        BigDecimal b = new BigDecimal(Double.toString(v)); 
        BigDecimal one = new BigDecimal("1"); 
        return b.divide(one,scale,BigDecimal.ROUND_HALF_UP).doubleValue(); 
    } 
    
    /** 
     * 提供精確的型別轉換(Float) 
     * @param v 需要被轉換的數字 
     * @return 返回轉換結果 
     */  
    public static float convertsToFloat(double v){ 
    BigDecimal b = new BigDecimal(v); 
    return b.floatValue(); 
    } 
    
    /** 
    * 提供精確的型別轉換(Int)不進行四捨五入 
    * @param v 需要被轉換的數字 
    * @return 返回轉換結果 
    */ 
<span style="white-space:pre">		</span>
/** 
* 精確對比兩個數字 
* @param v1 需要被對比的第一個數 
* @param v2 需要被對比的第二個數 
* @return 如果兩個數一樣則返回0,如果第一個數比第二個數大則返回1,反之返回-1 
*/ 
public static int compareTo(double v1,double v2){ 
BigDecimal b1 = new BigDecimal(v1); 
BigDecimal b2 = new BigDecimal(v2); 
    return b1.compareTo(b2); 
} 
} 
</pre><pre name="code" class="java">訓練資料:
youth high no fair no
youth high no excellent no
middle_aged high no fair yes
senior medium no fair yes
senior low yes fair yes
senior low yes excellent no
middle_aged low yes excellent yes
youth medium no fair no
youth low yes fair yes
senior medium yes fair yes
youth medium yes excellent yes
middle_aged medium no excellent yes
middle_aged high yes fair yes
senior medium no excellent no
</pre><pre name="code" class="java">
對原訓練資料進行測試,測試如果如下:
</pre><pre name="code" class="java">請輸入測試元組
youth high no fair
The class is: no
請輸入測試元組
youth high no excellent
The class is: no
請輸入測試元組
middle_aged high no fair
The class is: yes
請輸入測試元組
senior medium no fair
The class is: yes
請輸入測試元組
senior low yes fair
The class is: yes
請輸入測試元組
senior low yes excellent
The class is: yes
請輸入測試元組
middle_aged low yes excellent
The class is: yes
請輸入測試元組
youth medium no fair
The class is: no
請輸入測試元組
youth low yes fair
The class is: yes
請輸入測試元組
senior medium yes fair
The class is: yes
請輸入測試元組
youth medium yes excellent
The class is: yes
請輸入測試元組
middle_aged medium no excellent
The class is: yes
請輸入測試元組
middle_aged high yes fair
The class is: yes
請輸入測試元組
senior medium no excellent
The class is: no<span style="font-family:Arial, Helvetica, sans-serif;"><span style="white-space: normal;">
</span></span>

相關推薦

資料(Bayes)演算法java實現 註釋

注:本演算法的實現僅僅適用於小規模資料集的實驗與測試,不適合用於工程應用<span style="font-family: Arial, Helvetica, sans-serif;"> 演算法假定訓練資料各屬性列的值均是離散型別的。若是非離散型別的資料,需要

《機器學習實戰》學習筆記---樸素(Bayes)演算法

作為一名機器學習小白,將自己的學習經歷寫下來,一方面為了總結和回顧,另一方面希望能得到各路大神的批評指正,若能給他人帶來便利就更好不過了。 演算法優缺點: (1)優點:在資料較少的情況下,依然有效,可以處理多分類問題; (2)缺點:對輸入資料的準備方

樸素分類演算法python實現

1 #==================================== 2 # 輸入: 3 # 空 4 # 輸出: 5 # postingList: 文件列表 6 # classVec: 分類標籤列表 7 #===

文字分類演算法之--分類演算法實現Java版本

package com.vista;import com.vista.ChineseSpliter;import com.vista.ClassConditionalProbability;import com.vista.PriorProbability;import com.vista.Trainin

樸素分類演算法-----java

classvalue的概率:     unacc         acc         good    vgood 0.73333335    0.23037037    0.017037038    0.01925926     -------------------------------------

機器學習與資料-K最近鄰(KNN)演算法實現java和python版)

KNN演算法基礎思想前面文章可以參考,這裡主要講解java和python的兩種簡單實現,也主要是理解簡單的思想。 python版本: 這裡實現一個手寫識別演算法,這裡只簡單識別0~9熟悉,在上篇文章中也展示了手寫識別的應用,可以參考:機器學習與資料探勘-logistic迴

氣泡排序演算法 Java 實現過程及

 氣泡排序(Bubble Sort)是一種簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢“浮”

資料領域十大經典演算法之—樸素演算法(超詳細附程式碼)

簡介 NaïveBayes演算法,又叫樸素貝葉斯演算法,樸素:特徵條件獨立;貝葉斯:基於貝葉斯定理。屬於監督學習的生成模型,實現簡單,沒有迭代,並有堅實的數學理論(即貝葉斯定理)作為支撐。在大量樣本下會有較好的表現,不適用於輸入向量的特徵條件有關聯的場景。 基本思想 (1)

資料十大演算法(九):樸素 python和sklearn實現

第三個演算法終於算是稍有了解了,其實當你結合資料瞭解了它的實現原理後,你會發現確實很樸素。這裡對樸素貝葉斯演算法做一個介紹和總結,包括(原理、一個程式碼示例、sklearn實現),皆為親自實踐後的感悟,下面進入正文。 原理: 首先我們需要了解概率論的一些簡單知識:

資料:基於樸素分類演算法的文字分類實踐

前言:   如果你想對一個陌生的文字進行分類處理,例如新聞、遊戲或是程式設計相關類別。那麼貝葉斯分類演算法應該正是你所要找的了。貝葉斯分類演算法是統計學中的一種分類方法,它利用概率論中的貝葉斯公式進行擴充套件。所以,這裡建議那些沒有概率功底或是對概率論已經忘記差不多的讀者可

樸素分類演算法簡單理解

樸素貝葉斯分類演算法簡單理解 貝葉斯分類是一類分類演算法的總稱,這類演算法均以貝葉斯定理為基礎,故統稱為貝葉斯分類。而樸素樸素貝葉斯分類是貝葉斯分類中最簡單,也是常見的一種分類方法。這篇文章我儘可能用直白的話語總結一下我們學習會上講到的樸素貝葉斯分類演算法,希望有利於他人理解。 1

資料之十大經典演算法

國際權威的學術組織the IEEE International Conference on Data Mining (ICDM) 2006年12月評選出了資料探勘領域的十大經典演算法:C4.5, k-Means, SVM, Apriori, EM, PageRank, AdaBoost, k

資料之AdaBoost裝袋提升演算法

python3程式碼實現在https://github.com/yantijin/Lean_DataMining上,時間匆忙,敬請之處錯誤之處,謝謝! 以下內容轉自:https://blog.csdn.net/androidlushangderen/article/details/4363511

分類與監督學習,樸素分類演算法

1.理解分類與監督學習、聚類與無監督學習。 簡述分類與聚類的聯絡與區別。 簡述什麼是監督學習與無監督學習。 區別:分類:我們是知道這個資料集是有多少種類的,然後對它們分類歸納。比如對一個學校的在校大學生進行性別分類,我們會下意識很清楚知道分為“男”,“女”。 聚類:對資料集操作時,我們是不

資料之關聯規則Apriori演算法

一、Aoriori原始演算法: 頻繁挖掘模式與關聯規則 關聯規則兩個基本的指標(假設有事務A和事務B)   1、支援度(suport):計算公式如下        2、置信度(confidence):    關聯規則的挖掘過程:   1、設定最小支援度閾值,找出所有的頻繁項集且每個出現的次數要

分類演算法例項 --根據姓名推測男女

一.從貝葉斯公式開始 貝葉斯分類其實是利用用貝葉斯公式,算出每種情況下發生的概率,再取概率較大的一個分類作為結果。我們先來看看貝葉斯公式: P(A|B) = P(B|A) P(A) / P(B) 其中P(A|B)是指在事件B發生的情況下事件A發生的概率。 在貝葉斯定理中,每個名詞都有約定俗成的名稱: P

資料領域十大經典演算法之—CART演算法(附程式碼)

簡介 CART與C4.5類似,是決策樹演算法的一種。此外,常見的決策樹演算法還有ID3,這三者的不同之處在於特徵的劃分: ID3:特徵劃分基於資訊增益 C4.5:特徵劃分基於資訊增益比 CART:特徵劃分基於基尼指數 基本思想 CART假設決策樹是二叉樹,

基於LVD、模型演算法實現的電商行業商品評論與情感分析案例

一、 專案需求 現在大家進行網購,在購物之前呢,肯定會看下相關商品的評論,看下好評和差評,然後再綜合衡量,最後才會決定是否購買相關的商品。對一個指定商品,生產商,賣家,買家認同該商品的哪些優點/不認同

資料的十大經典演算法

如果有對大資料感興趣程式設計師,可來我們的大資料交流扣qun哦:591305687裡面免費送大資料的系統教程噢! 小編也是一名從事了5年的資料演算法工程師,花了近兩個月整理了一份較適合當下學習的乾貨,以及我這5年的工作經驗,分享給每一位想學大資料的小夥伴,這裡是大資料學習者聚集地,歡迎

機器學習--樸素分類演算法學習筆記

一、基於貝葉斯決策理論的分類方法 優點:在資料較少的情況下仍然有效,可以處理多類別問題。 缺點:對於輸入資料的準備方式較為敏感。 適用資料型別:標稱型資料。 現在假設有一個數據集,它由兩類資料構