1. 程式人生 > >關於Java實現樸素貝葉斯演算法

關於Java實現樸素貝葉斯演算法

package naiveBayesian;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
public class NativeBeyes {
	private ArrayList<ArrayList<String>> datas=new ArrayList<ArrayList<String>>();//訓練資料集
	private ArrayList<String> test=new ArrayList<String>();//測試資料集	
	private static ArrayList<ArrayList<String>> subdatas=new ArrayList<ArrayList<String>>();//同類別數據集
	public ArrayList<Double> p=new ArrayList<Double>();//不同類別對應概率
	public ArrayList<String> kinds=new ArrayList<String>();//記錄種類值
	private ArrayList<Double> p1=new ArrayList<Double>();//不同類別對給定多維向量特徵的概率
	public NativeBeyes(ArrayList<ArrayList<String>> datas,ArrayList<String> test) {
		this.datas=datas;
		this.test=test;
	}
	/*
	 * 計算類別種數計算各類別的概率
	 */
	public int sorts(ArrayList<ArrayList<String>> datas,ArrayList<String> test) {
		int a=0,b=0,c=datas.size();//類別種類計數器及首個類別計數
		while(datas.isEmpty()!=true) {
		for(int i=0;i<datas.size();i++) {
			if(datas.get(0).get(datas.get(0).size()-1).equals(datas.get(i).get(datas.get(0).size()-1))==true) {
				this.subdatas.add(datas.get(i));
				b++;
				if(b>=2) {
					datas.remove(i);
					i--;
				}
				
			}
		}
		datas.remove(0);
		p.add((double)b);
		b=0;
		a++;
		}
		for(int i=0;i<a;i++) {
			p.add(p.get(i)/c);
		}
		for(int i=0;i<a;i++) {
			p.remove(0);
		}
		numerator(test);
		return a;
	}
	//***********************************//
	/*
	 * 計算分母(denominator)的值,即相應屬性值在對應屬性集中的概率值 
	 */
	public double denominator(ArrayList<ArrayList<String>> datas,ArrayList<String> test) {
		double pp=1.0;
		int a=0;
		for(int i=0;i<test.size();i++) {
			for(int j=0;j<datas.size();j++) {
				if(datas.get(j).get(i).equals(test.get(i))==true) {
					a++;
				}
			}
			pp*=(double)a/datas.size();
			a=0;
		}
		return pp;
	}
	//************************************//
	/*
	 * 計算相應類別下不同特徵屬性值的條件概率(部分分子numerator值)
	 */	
	public void numerator(ArrayList<String> test) {
		double p=1.0;
		int b=0,c=0;
		while(this.subdatas.isEmpty()!=true) {
		for(int i=0;i<this.subdatas.size();i++) {
			if(this.subdatas.get(0).get(this.subdatas.get(0).size()-1).equals(this.subdatas.get(i).get(this.subdatas.get(0).size()-1))==true) {
				b++;
			}
			else {
				break;
			}
		}
		kinds.add(this.subdatas.get(0).get(this.subdatas.get(0).size()-1));
		for(int i=0;i<test.size();i++) {
			for(int j=0;j<b;j++) {
				if(test.get(i).equals(this.subdatas.get(j).get(i))) {
					c++;
				}
			}
			p*=(double)c/b;
			c=0;
		}
		p1.add(p);
		p=1.0;
		String str=this.subdatas.get(0).get(this.subdatas.get(0).size()-1);
		for(int i=0;i<b;i++) {
				this.subdatas.remove(0);
		}
		b=0;
		}
	}
	//******************************************//
	/*
	 * 比較得出概率最大的可能分類
	 */
	
	public int compare(ArrayList<ArrayList<String>> datas,ArrayList<String> test,int c,double q,ArrayList<Double> p,ArrayList<Double> p1) {
		double[] num=new double[c];//1
		int t=0;
		double a=0.0;
		for(int i=0;i<num.length;i++) {
			num[i]=(double)p.get(i)*p1.get(i)/q;
		}
		a=num[0];
		for(int i=0;i<num.length;i++) {
			if(a<num[i]) {
				a=num[i];
				t=i;
			}
		}
		System.out.printf("該分類可信度為:%.2f     ",num[t]);
		return t;
	}
	//********************************************//
	public String predect(ArrayList<ArrayList<String>> datas,ArrayList<String> test) throws IOException {		
			        NativeBeyes beyes=new NativeBeyes(datas,test);
			    	beyes.numerator(test);//p(類別下的條件概率)
			    	double bb=beyes.denominator(datas,test);
			    	String str2=beyes.kinds.get(beyes.compare(datas,test,beyes.sorts(datas,test),bb,beyes.p,beyes.p1));
			    	System.out.println("分類為:"+str2);
		            return str2;
	}
}
package naiveBayesian;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;

public class Mian {

	public static void main(String[] args) throws IOException {
		ArrayList<ArrayList<String>> datas=new ArrayList<ArrayList<String>>();//訓練資料集
		ArrayList<String> answer=new ArrayList<String>();
		String str=null;
		int count=0,c=0;
		FileInputStream fis = new FileInputStream("C:\\Users\\zfw\\Desktop\\java專案\\datas.txt"); 
        InputStreamReader isr = new InputStreamReader(fis, "UTF-8"); 
        BufferedReader br = new BufferedReader(isr); 
        while((str=br.readLine())!=null) {
        	String[] strs=str.split(",");
        	ArrayList<String> array=new ArrayList<String>();
        	for(int i=0;i<strs.length;i++)
        		array.add(strs[i]);
        	datas.add(array);
        }
        br.close();		
        FileInputStream fis2 = new FileInputStream("C:\\Users\\zfw\\Desktop\\java專案\\test.txt"); 
        InputStreamReader isr2 = new InputStreamReader(fis2, "UTF-8"); 
        BufferedReader br2 = new BufferedReader(isr2); 
        while((str=br2.readLine())!=null) {
        	c++;
        	String[] strs=str.split(",");
        	ArrayList<String> test=new ArrayList<String>();
        	for(int i=0;i<strs.length-1;i++)
        		test.add(strs[i]);
        	NativeBeyes beyes=new NativeBeyes(datas,test);
        	if(beyes.predect(datas,test).equals(strs[strs.length-1])) {
        		count++;
        	}
    		FileInputStream fis1 = new FileInputStream("C:\\Users\\zfw\\Desktop\\java專案\\datas.txt"); 
            InputStreamReader isr1 = new InputStreamReader(fis1, "UTF-8"); 
            BufferedReader br1 = new BufferedReader(isr1); 
            while((str=br1.readLine())!=null) {
            	String[] strs1=str.split(",");
            	ArrayList<String> array=new ArrayList<String>();
            	for(int i=0;i<strs1.length;i++)
            		array.add(strs1[i]);
            	datas.add(array);
            }
            br1.close();	
        }
        br2.close();     
        System.out.printf("正確率為:%.2f",(double)count/datas.size()*100);
        System.out.println("%");
	}
}

關於對樸素貝葉斯演算法的理解可參考:

相關推薦

關於Java實現樸素演算法

package naiveBayesian; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStr

Python實現樸素演算法 --- 過濾垃圾郵件

# -*- coding:utf-8 -*- import numpy as np import random import re __author__ = 'yangxin' """ 過濾垃圾郵件 """ class FilterSpam(object): #

Python實現樸素演算法 --- 遮蔽社群留言板的侮辱性言論

# -*- coding:utf-8 -*- import numpy as np __author__ = 'yangxin' """ 貝葉斯公式 p(xy)=p(x|y)p(y)=p(y|x)p(x) p(x|y)=p(y|x)p(x)/p(y) """ """ 遮蔽社

Java實現樸素分類器

實驗描述: 對指定資料集進行分類問題的分析,選擇適當的分類演算法,編寫程式實現,提交程式和結果報告 資料集: balance-scale.data(見附件一) ,已有資料集構建貝葉斯分類器。 資料包括四個屬性:五個屬性值 第一個屬性值表示樣本的類別號,其他四個屬性為四個不同

樸素演算法Java 實現

對於樸素貝葉斯演算法相信做資料探勘和推薦系統的小夥們都耳熟能詳了,演算法原理我就不囉嗦了。我主要想通過java程式碼實現樸素貝葉斯演算法,思想: 1. 用javabean +Arraylist 對於訓練資料儲存 2. 對於樣本資料訓練 具體的程式碼如下:package NB

樸素演算法優化與 sklearn 實現

1. 引言 上一篇日誌中,我們主要介紹了貝葉斯演算法,並提供了 python 實踐: 樸素貝葉斯演算法的推導與實踐 但執行上一篇日誌中的示例,我們發現出現了下面的結果: ['love', 'my', 'dalmation'] 屬於非侮辱類 ['stu

機器學習——樸素演算法Python實現

簡介 這裡參考《統計學習方法》李航編進行學習總結。詳細演算法介紹參見書籍,這裡只說明關鍵內容。 即 條件獨立下:p{X=x|Y=y}=p{X1=x1|Y=y} * p{X2=x2|Y=y} *...* p{Xn=xn|Y=y} (4.4)等價於p{Y=ck|X=x

樸素演算法的python實現

import numpy as np import re #詞表到向量的轉換函式 def loadDataSet(): postingList = [['my', 'dog', 'has', 'flea', 'problems', 'help', 'please']

機器學習之樸素演算法與程式碼實現

                                    樸素貝葉斯演算法與程式碼實現 演算法原理 樸素貝葉斯是經典的機器學習演算法之一,也是為數不多的基於概率論的分類演算法。樸素貝葉斯原理簡單,也很容易實現,多用於文字分類,比如垃圾郵件過濾。 該演算法的優點在於簡單易懂、學習效率高、在某些領

樸素演算法python實現

樸素貝葉斯是一種十分簡單的分類演算法,稱其樸素是因為其思想基礎的簡單性,就文字分類而言,他認為詞袋中的兩兩詞之間的關係是相互獨立的,即一個物件的特徵向量中的每個維度都是互相獨立的。這是樸素貝葉斯理論的思想基礎。 樸素貝葉斯分類的正式定義: 設x={}為一個待分類項,而每個a為x的一個特徵屬性有類別集合C={

樸素演算法實現分類以及Matlab實現

開始 其實在學習機器學習的一些演算法,最近也一直在看這方面的東西,並且嘗試著使用Matlab進行一些演算法的實現。這幾天一直在看得就是貝葉斯演算法實現一個分類問題。大概經過了一下這個過程: 看書→演算法公式推演→網上查詢資料→進一步理解→蒐集資料集開始嘗

樸素演算法——實現新聞分類(Sklearn實現

1、樸素貝葉斯實現新聞分類的步驟 (1)提供文字檔案,即資料集下載 (2)準備資料          將資料集劃分為訓練集和測試集;使用jieba模組進行分詞,詞頻統計,停用詞過濾,文字特徵提取,將文字資料向量化 (3)分析資料:使用matplotlib模組分

邏輯迴歸和樸素演算法實現二值分類(matlab程式碼)

資料簡介:共有306組資料,每組資料有三個屬性(x1,x2,x2),屬於0類或者1類。 資料序號末尾為1的是測試集,有31組;其他的作為訓練集,有275組。 clear clc load('

樸素演算法實現分類問題(三類)matlab程式碼

資料簡介 本訓練資料共有625個訓練樣例,每個樣例有4個屬性x1,x2,x3,x4,每個屬性值可以取值{1,2,3,4,5}。 資料集中的每個樣例都有標籤"L","B"或"R"。 我們在這裡序號末尾為1的樣本當作測試集,共有63個,其他的作為訓練集,共有562個。 下

《統計學習方法》+樸素演算法+C++程式碼(簡單)實現

        首先,學習樸素貝葉斯演算法得了解一些基本知識,比如全概率公式和貝葉斯公式,這些知識隨便找一本書或者在網上都能夠獲得。在此,這裡僅關注貝葉斯演算法本身,以及其具體的實現(以例4.1的例子為參考)。     貝葉斯演算法:     程式設計實現以上演算法,

樸素演算法之python實現 統計學習方法例4.2實戰

 本人在自學李航老師的統計學習方法,在學習樸素貝葉斯章節時,其中概念非常好理解,但是準備想把課本中的例題實戰一下時卻犯了難,有點無從下手的感覺,主要是因為怎麼去合理的去寫,提高程式碼的適應性以及重複利用率。  在網上找了蠻多部落格,大部分都是是判斷情感詞等,其中有篇部落

樸素演算法(Naive Bayes)演算法的python實現 含原始碼

演算法原理不在贅述,請參考: 將程式碼儲存為.py格式,預設使用的資料是程式碼檔案所在目錄下data目錄下的 bayes_train.txt 和bayes_test.txt 兩個檔案分別作為訓練樣例和測試樣例。以上引數可以在原始碼中修改,也可以使用命令列引數傳入,參考以

樸素演算法及Python的簡單實現

     貝葉斯演算法起源於古典數學理論,是一種分類演算法的總稱。它以貝葉斯定理為基礎,假設某待分類的樣本滿足某種概率分佈,並且可以根據已觀察到的樣本資料對該樣本進行概率計算,以得出最優的分類決策。通過計算已觀察到的樣本資料估計某待分類樣本的先驗概率,利用貝葉斯公式計算出其後

樸素演算法 Python實現

本程式碼實現了樸素貝葉斯分類器(假設了條件獨立的版本),常用於垃圾郵件分類,進行了拉普拉斯平滑關於樸素貝葉斯演算法原理可以參考部落格中原理部分的博文。#!/usr/bin/python # -*- coding: utf-8 -*- from math import log

用PHP實現機器學習:樸素演算法

$classifier = new Classifier(); $classifier->learn('Symfony is the best', Type::POSITIVE); $classifier->learn('PhpStorm is great', Type::POSITIVE);