1. 程式人生 > >樸素貝葉斯的JAVA實現

樸素貝葉斯的JAVA實現

現放程式碼,後加註釋

package com.gk.dmMethod;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import
com.sun.corba.se.impl.encoding.OSFCodeSetRegistry.Entry; /** *樸素貝葉斯:要預測的必須是分類屬性 * * *1.設定訓練集檔案,指定要預測屬性[預設最後一個為預測屬性] *2.生成模型 *3.設定測試集檔案,[判斷檔案是否符合要求,有無缺失] *4.預測,指定輸出[預設Console,輸出] * * */ public class NaiveBayesian{ private boolean isSetTrainSet; private boolean isModelGenerted; private boolean
isSetTestSet; private String trainSet; private String testSet; private int num = -1; private int total_trainNum = 0; Map<String, Double> mapProba = new HashMap<String,Double>(); public NaiveBayesian(){ isSetTestSet = false; isModelGenerted = false
; isSetTestSet = false; } public void setTrainSetFile(String trainSetFile) throws Exception{ setTrainSet(trainSetFile); isSetTrainSet = true; isModelGenerted = false; } /** * 只是賦值 * @param trainSet * @throws Exception */ private void setTrainSet(String trainSet)throws Exception{ this.trainSet = trainSet; } public void setTestSetFile(String testSetFile){ setTestSet(testSetFile); isSetTestSet = true; } private void setTestSet(String testSet){ this.testSet = testSet; } public void generatePredictedModel() throws IOException, Exception{ //TODO generate the model BufferedReader reader; System.out.println(trainSet); reader = new BufferedReader(new FileReader(trainSet)); String line =""; while((line= reader.readLine()) != null){ addToMap(line); } reader.close(); isModelGenerted = true; } private Map<String, ArrayList<AttributeS>> map = new HashMap<String,ArrayList<AttributeS>>(); public void getModel(){ String model =""; for(Map.Entry<String,ArrayList<AttributeS>> entry : map.entrySet()){ System.out.println(entry.getKey()); for(AttributeS attr:entry.getValue()){ System.out.println(attr); } System.out.println(); } } public void precdite()throws Exception{ if(!isModelGenerted) throw new Exception("Haven't Generaten The PredicatedModel"); if(!isSetTestSet) throw new Exception("Haven't set the Test File"); //TODO precdite; double max =0; BufferedReader reader = new BufferedReader(new FileReader(testSet));; String line = ""; while((line = reader.readLine()) != null){ String[] tokens = line.split(" "); //Map<String, ArrayList<AttributeS>> map = new HashMap<String,ArrayList<AttributeS>>(); // System.out.println(Arrays.toString(tokens)); // System.out.println(); int sum =0; for(Map.Entry<String,ArrayList<AttributeS>> entry:map.entrySet()){ sum +=entry.getValue().size(); double temp = 1; double temp_1; for(int i =0;i<tokens.length;i++){ temp_1 = entry.getValue().get(i).getP(tokens[i]); System.out.print(temp_1 + " * "); temp *= entry.getValue().get(i).getP(tokens[i]); } System.out.println(); System.out.println(mapProba.get(entry.getKey())); mapProba.put(entry.getKey(),temp * mapProba.get(entry.getKey()) / total_trainNum); } // System.out.println("sum:" + sum); // for(Map.Entry<String,ArrayList<AttributeS>> entry:map.entrySet()){ //// mapProba.put(entry.getKey(),); // double temp = entry.getValue().size() * 1.0 / sum; // System.out.println("============" + temp); // mapProba.put(entry.getKey(),mapProba.get(entry.getKey()) *temp ); // } // System.out.println(line); // System.out.println("==================="); for(Map.Entry<String,Double> entry:mapProba.entrySet()){ System.out.println(entry.getKey() + " :\t"+entry.getValue()); } System.out.println("==================="); System.out.println(); } } private void addToMap(String line) throws Exception{ // System.err.println("add to map : " + line); String[] temp = line.split(" "); if(num == -1) num = temp.length; if(num != temp.length) throw new Exception("the file has some error :" + line); int tempNum = num-1; int i =0; ArrayList<AttributeS> list =null; total_trainNum++; if(!mapProba.containsKey(temp[tempNum])) mapProba.put(temp[tempNum],(double) 1); else mapProba.put(temp[tempNum],mapProba.get(temp[tempNum]) + 1); if(!map.containsKey(temp[tempNum])) { list = new ArrayList<AttributeS>(); for(i = 0;i < tempNum;i++){ try{ Integer.parseInt(temp[i]); list.add(new NumericalAttr()); }catch(Exception e){ list.add(new CategoricalAttr()); } } map.put(temp[tempNum], list); }// end if list = map.get(temp[tempNum]); for(i =0;i<tempNum;i++){ list.get(i).add(temp[i]); map.put(temp[tempNum],list); } } } /*採用懶人設計模式,第一次呼叫的時候再例項化*/ abstract class AttributeS{ abstract void add(String attr) throws Exception; abstract double getP(String attribute) throws Exception; } class CategoricalAttr extends AttributeS{ int sum =0; Map<String,Integer> map = new HashMap<String,Integer>(); void add(String attr){ sum++; if(!map.containsKey(attr)) map.put(attr,1); else map.put(attr,map.get(attr)+1); } double getP(String attribute) throws Exception{ double result = 0; try{ result = map.get(attribute) * 1.0 / sum; }catch(Exception e){ throw new Exception("Can't find the attribute : " + attribute); } return result; } @Override public String toString() { for(Map.Entry<String,Integer> entry:map.entrySet()){ System.out.print("<" + entry.getKey() + "," + entry.getValue()+">,"); } return ""; } } class NumericalAttr extends AttributeS{ int sum; int n; double average; double vaiance;//方差 double vaiance_standard;//標準差 double temp_xi =0; List<Integer> list = new ArrayList<Integer>(); boolean isComputed = false; void add(String attr) throws Exception{ if(isComputed) throw new Exception("the model has been Computed"); try{ Integer temp = Integer.parseInt(attr); list.add(temp); temp_xi += temp * temp; sum+=temp; }catch(Exception e){ throw new Exception("Some error in attribute"); } } double getP(String attribute){ //TODO if(isComputed){ compute(); isComputed = true; } int temp = Integer.parseInt(attribute); return Math.log(-(Math.pow((temp - average),2)) / (2 * vaiance)) / (vaiance_standard * Math.sqrt(2 * Math.PI)); } private void compute(){ average = sum * 1.0/ list.size(); vaiance = average * average * list.size() + temp_xi - 2 * sum * average; vaiance_standard = Math.sqrt(vaiance); } @Override public String toString() { return list.toString(); } }

相關推薦

&lt;Machine Learning in Action &gt;之二 樸素 C#實現文章分類

options 直升機 water 飛機 math mes 視頻 write mod def trainNB0(trainMatrix,trainCategory): numTrainDocs = len(trainMatrix) numWords =

機器學習實戰——樸素Python實現記錄

問題:regEx= re.compile('\\W*') 屬於列印錯誤。 正確:     regEx = re.compile('\W*') regEx = re.compile('\W*') 關於'\W' 和'\w'區別,可參考部落格:https://

情感分析背後的樸素實現基於評論語料庫的影評情感分析(附程式碼)

一.情感分析的介紹       一句話概括情感分析:判斷出一句評價/點評/影評的正/負傾向性;       情感分析是一個二分類的問題,一種是可以直接判斷正負,一種是可以判斷情感偏向正負性的一個打分; 二,詞袋模型(向量空間模型) 2.1情感分析的流程    中文分

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

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

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

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

一步步教你輕鬆學樸素模型實現篇2

導讀:樸素貝葉斯模型是機器學習常用的模型演算法之一,其在文字分類方面簡單易行,且取得不錯的分類效果。所以很受歡迎,對於樸素貝葉斯的學習,本文首先介紹理論知識即樸素貝葉斯相關概念和公式推導,為了加深理解,採用一個維基百科上面性別分類例子進行形式化描述。然後通過程式設計實現樸素貝葉斯分類演算法,並在遮蔽社

邏輯迴歸和樸素演算法實現二值分類(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個。 下

學習筆記——Kaggle_Digit Recognizer (樸素 Python實現

本文是個人學習筆記,該篇主要學習樸素貝葉斯演算法概念,並應用sklearn.naive_bayes演算法包解決Kaggle入門級Digit Recognizer。 貝葉斯定理 對於貝葉斯定理的瞭解和學習大部分都是從概率論開始的,但實際貝葉斯

樸素 python 實現

百度文庫 文庫2 機器學習實戰的樸素貝葉斯的程式碼太複雜 """ Created on Thu Aug 10 15:08:59 2017 @author: luogan """ #coding=gbk #Naive Bayes #Calculate

樸素Python實現

貝葉斯定理:                                    from math import * from numpy import * import random 建立資料集和標籤 def loadData(): postingList

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

引文:前面提到的K最近鄰演算法和決策樹演算法,資料例項最終被明確的劃分到某個分類中,下面介紹一種不能完全確定資料例項應該劃分到哪個類別,或者說只能給資料例項屬於給定分類的概率。 基於貝葉斯決策理論的分類方法之樸素貝葉斯 優點:在資料較少的情況下仍然有效

西瓜書上樸素實現,完全按照書上的步驟

注:西瓜書上的資料有錯誤如P152的5/8=0.375,所以程式碼的計算是正確的。如果讀者想要“拉普拉斯修正“的原始碼請訪問https://download.csdn.net/download/song91425/10385345 。 所謂的拉普拉斯就是避免出現概率為0的情況

《統計學習方法》——樸素程式碼實現

### 樸素貝葉斯分類原理 對於給定的訓練資料集,首先基於特徵條件獨立假設學習輸入/輸出的聯合概率分佈;然後基於此模型,對給定的輸入$x$,利用貝葉斯定理求出後驗概率最大的輸出$y$。 **特徵獨立性假設**:在利用貝葉斯定理進行預測時,我們需要求解條件概率$P(x|y_k)=P(x_1,x_2,...,x

JAVA實現樸素分類演算法

       之前部落格提到的KNN演算法以及決策樹演算法都是要求分類器給出“該資料例項屬於哪一類”這類問題的明確答案,正因為如此,才出現了使用決策樹分類時,有時無法判定某一測試例項屬於哪一類別。使用樸素貝葉斯演算法則可以避免這個問題,它給出了這個例項屬於某一類別的概率值,

樸素演算法Java 實現

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

關於Java實現樸素演算法

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

樸素JAVA實現

現放程式碼,後加註釋 package com.gk.dmMethod; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileRea

Java實現樸素分類器

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

Naive Bayes 樸素JAVA程式碼實現

1.關於貝葉斯分類 bayes 是一種統計學分類方法,它基於貝葉斯定理,它假定一個屬性值對給定類的影響獨立於其它屬性點的值。該假定稱作類條件獨立。做次假定是為了簡化所需計算,並在此意義下稱為“樸素的”。 bayes分類的演算法大致如下: (1)對於屬性值是離散的,並且目