利用朴素貝葉斯算法進行分類-Java代碼實現


http://www.crocro.cn/post/286.html

利用朴素貝葉斯算法進行分類-Java代碼實現

Java
package cn.crocro.classifier; import java.util.ArrayList; /** * 朴素貝葉斯分類器,只能針對有限個情況的分類下面是實例代碼 * * @author 鱷魚 * */ public class NaiveBayesClassifier { /** * 進行訓練的內部數據 */ private ArrayList<FiniteStateData> datas = new ArrayList<>(); /* * * 拉普拉斯平滑數值 */ private double landa = 1; /** * 進行初始化 * * @param datas * 初始化的數據 */ public NaiveBayesClassifier(ArrayList<FiniteStateData> datas) { this.datas = datas; } /** * 默認進行初始化 */ public NaiveBayesClassifier() { } public void setLanda(double landa) { this.landa = landa; } /** * 增加數據 * * @param data * 增加一組數據 */ public void addData(FiniteStateData data) { datas.add(data); } /** * 獲取對應的類的默認概率 * * @param classNum * 想獲取的分類 * @return */ private double getClassPercent(int classNum) { int num = 0; for (FiniteStateData data : datas) { if (data.classfy == classNum) { num++; } } return (double) (num + landa) / (datas.size() + landa * FiniteStateData.getTotalClassNum()); } /** * 獲取某個維度某個值的概率 * * @param dim * 維度 * @param value * 值 * @return 概率 */ private double getValuePercent(int dim, int value, int classfy) { int num = 0; int classfyNum = 0; for (FiniteStateData singleData : datas) { if (singleData.data[dim] == value && singleData.classfy == classfy) { num++; } if (singleData.classfy == classfy) { classfyNum++; } } return (double) (num + landa) / (classfyNum + landa * FiniteStateData.getTotalDimDataNum(dim)); } /** * 獲取未知數據的內部分類概率 * * @param data * 未知數據 * @param classfy * 可能分類 * @return 概率 */ public double getClassifyPercent(int[] data, int classfy) { double total = 0; for (int oneClassfy : FiniteStateData.getClassArray()) { total += getLocalClassifyPercent(data, oneClassfy); } return getLocalClassifyPercent(data, classfy) / total; } /** * 獲取未知數據的內部分類概率 * * @param data * 未知數據 * @param classfy * 可能分類 * @return 概率 */ private double getLocalClassifyPercent(int[] data, int classfy) { double percent = getClassPercent(classfy); for (int i = 0; i < data.length; i++) { percent = percent * getValuePercent(i, data[i], classfy); } return percent; } /** * 測試 * * @param args */ public static void main(String[] args) { // 設置分類的數值可能 int[] data1 = new int[] { 1, 3, 4, 5 }; int[] data2 = new int[] { 2, 2, 2, 2 }; int[] data3 = new int[] { 2, 2, 2, 2 }; FiniteStateData finiteStateData = new FiniteStateData(data1, 1); FiniteStateData finiteStateData1 = new FiniteStateData(data2, 2); FiniteStateData finiteStateData2 = new FiniteStateData(data3, 1); NaiveBayesClassifier bayesClassifier = new NaiveBayesClassifier(); bayesClassifier.addData(finiteStateData); bayesClassifier.addData(finiteStateData1); bayesClassifier.addData(finiteStateData2); System.out.println(bayesClassifier.getClassPercent(2)); System.out.println(bayesClassifier.getValuePercent(0, 2, 1)); System.out.println(bayesClassifier.getClassifyPercent(data1, 1)); } }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM