`
zhoupinheng
  • 浏览: 36144 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

java实现朴素贝叶斯算法

阅读更多

 

 

贝叶斯模型

package bayes;

import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

public class Model {
	public Set<String> categorySet = new HashSet<String>();
	public Set<String> keyWordsSet = new HashSet<String>();
	public Map<String, Long> probabilityMap = new HashMap<String, Long>();
}

 

    贝叶斯主类

package bayes;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

public class Bayes {

	/**
	 * P(B|a1,a2,a3)= cBa1 * cBa2 * cBa3 / (cB * cB) / ( cBa1 * cBa2 * cba3 / (cB * cB) + cAa1 * cAa2 * cAa3 / (cA * cA) )
	 * 
	 * @param source
	 * @param model
	 * @return
	 */
	public static Map<String, Double> getValue(String source, Model model) {

		if (model != null && model.keyWordsSet != null && model.categorySet != null && source != null) {
			Set<String> keyWordSet = new HashSet<String>();

			for (String key : model.keyWordsSet) {
				if (source.contains(key)) {
					keyWordSet.add(key);
				}
			}

			if (keyWordSet.size() > 0) {
				Map<String, Double> probabilityMap = new HashMap<String, Double>();

				double sumProbalitity = 0;
				for (String category : model.categorySet) {
					double numerator = 1;
					double denominator = 1;
					int index = 0;
					for (String keyword : keyWordSet) {
						if (index > 0) {
							denominator = denominator * getProbalityValue(model, category);
						}
						numerator = numerator * getProbalityValue(model, category + "-" + keyword);
						index = index + 1;
					}

					double probalisty = Double.valueOf(numerator / denominator);
					sumProbalitity = sumProbalitity + probalisty;
					probabilityMap.put(category, probalisty);
				}

				Map<String, Double> rtnMap = new HashMap<String, Double>();
				if (sumProbalitity > 0) {
					for (String category : model.categorySet) {
						rtnMap.put(category, Double.valueOf(probabilityMap.get(category) / sumProbalitity));
					}
				} else {
					for (String category : model.categorySet) {
						rtnMap.put(category, Double.valueOf(1.0 / model.categorySet.size()));
					}
				}

				return rtnMap;
			}

		}

		return null;
	}

	public static long getProbalityValue(Model model, String key) {
		long rtn = 0;
		if (model.probabilityMap.containsKey(key)) {
			rtn = model.probabilityMap.get(key);
		}

		return rtn;
	}

	public static Model train(String[] categorys, String[][] data, String[] keyWords) {

		if (categorys != null && data != null && data.length == categorys.length && categorys.length > 1 && keyWords != null && keyWords.length > 1) {

			Model model = new Model();
			model.categorySet.addAll(Arrays.asList(categorys));
			model.keyWordsSet.addAll(Arrays.asList(keyWords));

			for (int i = 0; i < categorys.length; i++) {
				calculateProbability(categorys[i], data[i], model);
			}

			return model;
		} else {
			System.out.println("data error!");
		}

		return null;
	}

	private static void calculateProbability(String category, String[] categoryData, Model model) {
		for (String source : categoryData) {
			addCategoryKeywordCount(category, model);
			for (String keywork : model.keyWordsSet) {
				if (source.contains(keywork)) {
					addCategoryKeywordCount(keywork, model);
					addCategoryKeywordCount(category + "-" + keywork, model);
				}
			}
		}

	}

	private static void addCategoryKeywordCount(String key, Model model) {
		Long count = null;
		count = model.probabilityMap.get(key);
		if (count != null) {
			count = count + 1;
		} else {
			count = 1L;
		}
		model.probabilityMap.put(key, count);

	}

	public static void saveModel(String fileName, Model model) {
		try (BufferedWriter writer = new BufferedWriter(new FileWriter(fileName));) {
			for (String category : model.categorySet) {
				writer.write(category);
				writer.write(",");
			}
			writer.write("\n");

			for (String keyword : model.keyWordsSet) {
				writer.write(keyword);
				writer.write(",");
			}
			writer.write("\n");

			for (String key : model.probabilityMap.keySet()) {
				writer.write(key);
				writer.write(":");
				writer.write(model.probabilityMap.get(key).toString());
				writer.write("\n");
			}
			writer.write("\n");
		} catch (Exception e) {
			System.out.println("save Model error");
		}
	}

	public static Model loadModel(String fileName) {

		Model model = new Model();

		try (BufferedReader reader = new BufferedReader(new FileReader(fileName));) {

			String categoryLine = reader.readLine();
			model.categorySet.addAll(getStringSet(categoryLine, ","));
			String keyWorksLine = reader.readLine();
			model.keyWordsSet.addAll(getStringSet(keyWorksLine, ","));
			String probalilityLine = reader.readLine();
			while (probalilityLine != null) {
				if (probalilityLine.trim().length() > 0) {
					String[] itemStr = (probalilityLine + ":").split(":");
					if (itemStr.length == 2) {
						String key = itemStr[0];
						Long probalility = Long.valueOf(itemStr[0]);
						model.probabilityMap.put(key, probalility);
					} else {
						System.out.println("Error model line:" + probalilityLine);
					}
				}

				probalilityLine = reader.readLine();
			}

		} catch (Exception e) {
			System.out.println("load model error");
		}

		return model;
	}

	public static Set<String> getStringSet(String sourceStr, String splitor) {
		Set<String> rtn = new HashSet<String>();

		if (sourceStr != null && splitor != null) {
			String[] strs = sourceStr.split(splitor);
			if (strs != null && strs.length > 0) {
				for (String str : strs) {
					if (str != null) {
						rtn.add(str.trim());
					}
				}
			}

		}

		return rtn;
	}

}

 

分享到:
评论

相关推荐

    java实现朴素贝叶斯分类算法

    2. **朴素贝叶斯假设**:朴素贝叶斯算法的核心在于“朴素”一词,即假设所有特征之间相互独立。这简化了计算过程,使得我们只需要知道每个特征独立出现的概率。 3. **数据预处理**:在Java实现中,首先需要对数据...

    朴素贝叶斯算法java实现

    总的来说,朴素贝叶斯算法在Java中的实现涉及到概率计算、数据处理和模型构建等多个环节。它以其简单、快速的特性在实际应用中占有一席之地。通过深入理解和实践,我们可以灵活地调整模型参数,优化分类性能,适应...

    NaiveBayes-java实现朴素贝叶斯算法,多分类附带训练集

    P(X|Y) = P(X,Y)/P(Y) (条件概率)-&gt;P(X,Y) = P(X|Y)P(Y)-&gt;P(X,Y) = P(Y|X)P(X)-&gt;P(X|Y) = P(Y|X)P(X)/P(Y), p(yi|X) = P(yi)p(X|yi)/P(X) 其中P(X)为常数 p(yi|X) = P(yi)p(X|yi) p(yi|X)-&gt;某特征下是某类别的...

    mapreduce 实现朴素贝叶斯算法-源码

    MapReduce是一种分布式计算模型,由...总之,通过Hadoop 2.0的MapReduce模型实现朴素贝叶斯算法,能够充分利用分布式计算的优势,处理大规模文本数据的分类问题。源码分析和理解有助于深入学习这两种技术的结合应用。

    朴素贝叶斯java代码参考

    在Java中实现朴素贝叶斯,我们需要理解以下几个核心概念: 1. **贝叶斯定理**:贝叶斯定理是概率论中的一个基本原理,它描述了在已知一些证据或先验信息的情况下,某个假设的概率如何更新。公式为:P(A|B) = P(B|A)...

    NB朴素贝叶斯算法在UCI数据集上的的java实现

    这个“NB朴素贝叶斯算法在UCI数据集上的的java实现”项目是针对UCI Machine Learning Repository中的数据集进行的,该库提供了各种真实世界的数据,用于教学、研究和算法开发。 在这个项目中,开发者使用Java语言...

    朴素贝叶斯算法分析天气的好坏

    在Java编程中,可以创建一个名为`NaiveBayesTool`的类来实现朴素贝叶斯算法。类中会包含训练数据集的路径、属性名数组、数据矩阵等成员变量,以及用于读取数据、计算概率和进行分类的方法。在实际代码中,可以使用`...

    spark+java实现朴素贝叶斯

    本项目将探讨如何使用Java与Spark相结合,实现朴素贝叶斯算法。朴素贝叶斯是一种基于概率的分类算法,它假设特征之间相互独立,并且在训练数据集的基础上计算每个类别的先验概率以及每个特征在各个类别下的条件概率...

    Naive Bays朴素贝叶斯算法在JAVA中的实现

    总之,朴素贝叶斯算法以其简单性和高效性在Java开发中得到广泛应用。理解其背后的数学原理,熟练掌握在Java中实现的方法,将有助于你在实际项目中解决分类问题。无论是使用开源库还是自定义代码,关键在于理解算法...

    朴素贝叶斯算法文本分类JAVA实现

    总之,朴素贝叶斯算法是一种实用且易于实现的文本分类方法。通过Java编程,我们可以构建自己的分类器,结合数据预处理、特征表示和模型训练,实现在特定任务上的应用。同时,理解并掌握算法背后的统计原理和假设,...

    Java实现的朴素贝叶斯算法示例

    Java实现的朴素贝叶斯算法示例主要包括两个部分:数据存储和算法实现。 数据存储部分使用JavaBean和ArrayList对训练数据进行存储。JavaBean是Java中的一个概念,表示一个简单的Java类,用于封装数据。ArrayList是...

    Java实现朴素贝叶斯分类器

    对指定数据集进行分类问题的分析,选择适当的分类算法,编写程序实现,提交程序和结果报告 数据集: balance-scale.data(见附件一) ,已有数据集构建贝叶斯分类器。 数据包括四个属性:五个属性值 第一个属性值...

    树型朴素贝叶斯算法java数据挖掘算法源码

    《树型朴素贝叶斯算法在Java中的实现与数据挖掘》 朴素贝叶斯算法,作为统计学和机器学习领域中的一种基础分类方法,因其简单高效而被广泛应用。树型朴素贝叶斯算法是朴素贝叶斯算法的一种变体,它以决策树的形式...

    朴素贝叶斯文本分类器(java实现)

    朴素贝叶斯文本分类器是一种广泛应用的机器学习算法,尤其在自然语言处理领域,用于将文本数据归类到预定义的类别中。本程序的Java实现深入探讨了这一概念,并提供了完整的工具集,包括源代码、实验报告、可执行程序...

    朴素贝叶斯算法实现分类问题(Java实现)

    朴素贝叶斯算法是一种基于概率的分类方法,其理论基础源于贝叶斯定理,而“朴素”一词则是因为该算法假设各个特征之间相互独立。这种算法在处理分类问题时,尤其是文本分类中表现得相当有效。在这个Java实现的案例中...

    朴素贝叶斯实现分词算法

    在这个项目中,我们看到的是如何运用朴素贝叶斯算法来对网络帖子进行自动分词和分类。 首先,我们要理解朴素贝叶斯算法的基本原理。贝叶斯定理是一个概率论中的公式,它描述了在已知一些证据的情况下,某一假设发生...

    朴素贝叶斯实际应用java实现

    1. **朴素贝叶斯理论**:朴素贝叶斯算法是基于贝叶斯定理和特征条件独立假设的分类方法。贝叶斯定理是一种概率推理方法,它表示在给定一些证据(或特征)的情况下,某个假设(或类别)的可能性。而“朴素”一词源于...

    基于朴素贝叶斯的五折交叉算法

    1. 数据预处理:数据读取、清洗、转换成朴素贝叶斯算法所需的格式,可能包括离散化(如果特征是连续的)和编码(将分类变量转换为数字)。 2. 朴素贝叶斯模型构建:根据贝叶斯公式,计算每个类别的先验概率和每个...

Global site tag (gtag.js) - Google Analytics