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