`

Java实现的朴素贝叶斯分类器

阅读更多

目前的算法只能处理结果只有两种的情况,即true or false. 多分枝或者是数字类型的还无法处理。

用到的一些基础数据结构可以参考上一篇关于ID3的代码。 

 

这里只贴出来实现贝叶斯分类预测的部分:

package classifier;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import util.ArffUtil;


/**
 * NBC means Naive Bayes Classifier
 * @author wenjun_yang
 *
 */
public class NBCUtil {
	
	ArffUtil util = new ArffUtil();
	private List<String> attributeList = null;
	private List<String[]> dataList = null;
	private String decAttributeName = null;
	private int decAttributeIndex = -1;
	
	private Map<String, List<String[]>> seperatedDataTable = null;
	public NBCUtil(String decAttributeName, List<String> attributeList, List<String[]> dataList) {
		this.attributeList = attributeList;
		this.dataList = dataList;
		this.decAttributeName = decAttributeName;
		
		this.decAttributeIndex = util.getValueIndex(decAttributeName, this.attributeList);
		this.seperatedDataTable = seperateDataList(dataList);
	}
	
	private Map<String, List<String[]>> seperateDataList(List<String[]> dataList) {
		Map<String, List<String[]>> map = new HashMap<String, List<String[]>>();
		
		for(String[] arr : dataList) {
			if(decAttributeIndex >= 0 && decAttributeIndex < arr.length) {
				String currentKey = arr[decAttributeIndex]; 
				if(map.containsKey(currentKey)) {
					List<String[]> tempList = map.get(currentKey);
					tempList.add(arr);
					map.put(currentKey, tempList);
				} else {
					List<String[]> tempList = new ArrayList<String[]>();
					tempList.add(arr);
					map.put(currentKey , tempList);
				}
			}
		}
		
		return map;
	}
	
	public Boolean predict(Map<String, String> predictData, String targetDecAttributeValue) {
		if(predictData.containsKey(decAttributeName)) predictData.remove(decAttributeName);
		
		List<String[]> positiveDataTable = new ArrayList<String[]>();
		if(seperatedDataTable.containsKey(targetDecAttributeValue)) {
			positiveDataTable = seperatedDataTable.get(targetDecAttributeValue);
		}
		
		double resultP = 1.;
		
		// Step 1: 逐个属性的比率进行计算
		// 即: 计算 P(Attr=Value|Y=true) / P(Attr=Value|Y=false) 的值
		for(String attrName : predictData.keySet()) {
			String attrValue = predictData.get(attrName);
			int attrIndex = util.getValueIndex(attrName, attributeList);
			int attrPositiveCount = 0;
			int attrNegativeCount = 0;
			
			for(String[] arr : dataList) {
				if(arr[attrIndex].equals(attrValue)) {
					if(arr[decAttributeIndex].equals(targetDecAttributeValue)) {
						attrPositiveCount++;
					} else {
						attrNegativeCount++;
					}
				}
			}
			double temp =  (attrPositiveCount / (double)positiveDataTable.size() ) /
							(attrNegativeCount / (double)(dataList.size() - positiveDataTable.size()));
			resultP *= temp;
		}
		// 最后计算 P(Y=true) / P(Y=false)
		resultP *= positiveDataTable.size() / (double)(dataList.size() - positiveDataTable.size());
		System.out.println(resultP);
		if(resultP > 1) {
			return true;
		} else {
			return false;
		}
	}
}

 

 

完整的项目也上传了,可以直接使用。

数据源来自weka

1
0
分享到:
评论
3 楼 酷呀嗒 2015-04-16  
给的文件没有main函数 这个怎么启动啊
2 楼 RangerWolf 2015-01-11  
caihongshijie6 写道
你好,这里面用到的数据文件在哪里找呢?


Weka SciKit-learn 都自带不少数据
另外网上也有不少公开的数据
1 楼 caihongshijie6 2015-01-03  
你好,这里面用到的数据文件在哪里找呢?

相关推荐

    Java实现朴素贝叶斯分类器

    实验描述: 对指定数据集进行分类问题的...数据集: balance-scale.data(见附件一) ,已有数据集构建贝叶斯分类器。 数据包括四个属性:五个属性值 第一个属性值表示样本的类别号,其他四个属性为四个不同的特征值。

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

    在Java中实现朴素贝叶斯分类器,我们需要理解以下几个关键知识点: 1. **贝叶斯定理**:贝叶斯定理是概率论中的一个公式,它描述了在已知某些条件下,事件A发生的条件概率P(A|B)如何根据先验概率P(A)和证据B的概率P...

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

    在Java中实现朴素贝叶斯分类器,通常涉及以下步骤: - **数据预处理**:去除停用词,词干提取,转换为小写,创建词频表等。 - **特征选择**:计算每个特征(单词)在每个类别中的概率。 - **模型构建**:根据...

    朴素贝叶斯算法java实现

    在Java中实现朴素贝叶斯分类器,我们可以利用其简单高效的特点,适用于文本分类、垃圾邮件过滤、情感分析等多种场景。 首先,我们需要理解朴素贝叶斯的基本原理。朴素贝叶斯模型假设每个特征对类别条件概率的影响是...

    java实现朴素贝叶斯算法

    这些库提供了现成的朴素贝叶斯分类器实现,简化了开发过程。 总结来说,Java实现朴素贝叶斯算法涉及到数据预处理、概率计算、模型建立、预测以及模型评估等多个环节。通过理解算法原理并结合Java编程技巧,我们可以...

    spark+java实现朴素贝叶斯

    `BayesClassifier.java`很可能是实现朴素贝叶斯分类器的主要代码,包含模型的构建、训练和预测功能。`Bayes.java`可能包含了与朴素贝叶斯算法相关的辅助函数,如概率计算、数据预处理等。 在Spark中,我们通常使用...

    朴素贝叶斯分类器

    朴素贝叶斯分类器是一种基于概率理论的监督学习方法,广泛应用于数据挖掘和机器学习领域。它的核心思想是利用贝叶斯定理来预测未知类别的数据实例属于哪个类别。贝叶斯定理是一个在概率论中用于计算条件概率的重要...

    朴素贝叶斯java代码参考

    4. **分类过程**:对于新的未知数据,朴素贝叶斯分类器会计算每个类别的后验概率P(Class|Features),并选择具有最高后验概率的类别作为预测结果。 5. **Java实现**:在`naive_bayes.java`文件中,可能会包含以下...

    Spring-Boot集成Neo4j并利用Spark的朴素贝叶斯分类器实现基于电影知识图谱的智能问答系统

    在构建智能问答系统时,将Spring-Boot与Neo4j数据库和Spark的朴素贝叶斯分类器相结合是一种高效的方法,特别是在处理与电影相关的知识图谱数据时。以下将详细阐述这个系统的组成部分及其工作原理。 首先,Spring-...

    Java编写的朴素贝叶斯分类器

    在Java编程环境中实现朴素贝叶斯分类器,可以帮助开发者理解算法原理,并将其应用于实际的数据处理任务中。以下是对这个Java编写的朴素贝叶斯分类器的详细解释: 1. **朴素贝叶斯理论基础**: - **贝叶斯定理**:...

    机器学习--朴素贝叶斯

    总的来说,Java实现朴素贝叶斯分类器需要对算法原理有深入理解,同时熟练掌握Java编程技巧和数据结构。在实际项目中,可以结合开源机器学习库,如Weka或Apache Mahout,这些库提供了封装好的朴素贝叶斯模型,可以...

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

    在Java环境下实现朴素贝叶斯分类器,我们可以分为以下几个步骤: 1. 数据预处理: 在文本分类任务中,首先需要对文本数据进行预处理,包括分词、去除停用词(如“的”、“是”等常见无实际意义的词语)、词干提取...

    java实现基于贝努力模型的朴素贝叶斯分类器

    总的来说,这个Java项目提供了一个完整的朴素贝叶斯分类器实现,使用了贝叶斯定理和贝叶斯模型,并针对文本分类问题进行了优化。通过理解贝叶斯定理和朴素贝叶斯模型的工作原理,以及如何在Java中实现这些概念,我们...

    贝叶斯分类器(java)

    然而,即使在特征之间存在关联的情况下,朴素贝叶斯分类器仍然表现出色,尤其是在文本分类、垃圾邮件过滤等领域。 【压缩包子文件的文件名称列表】:虽然这里只列出了“贝叶思”这一文件名,通常在这样的项目中,...

    java贝叶斯分类器

    尽管在现实世界中这种假设往往过于理想化,但在许多情况下,朴素贝叶斯分类器仍能表现出良好的性能。它的“朴素”一词来源于对特征独立性的假设。 三、Java实现 1. 数据预处理:在构建分类器之前,需要对文本数据...

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

    在`NaiveBayes`文件中,可能包含一个简单的朴素贝叶斯分类器的Java实现,包括上述各步骤的代码。通过阅读和理解这些代码,你可以深入学习朴素贝叶斯算法的工作原理以及如何在实际项目中应用。 总之,朴素贝叶斯算法...

    基于SpringBoot+Neo4j+Spark实现的论文智能分析问答系统(采用朴素贝叶斯分类器).zip

    基于SpringBoot+Neo4j+Spark实现的论文智能分析问答系统(采用朴素贝叶斯分类器).zip基于SpringBoot+Neo4j+Spark实现的论文智能分析问答系统(采用朴素贝叶斯分类器).zip基于SpringBoot+Neo4j+Spark实现的论文智能...

    基于IRIS bayes分类器

    - **源代码**:实现朴素贝叶斯分类器的编程语言代码(如Python、R或Java),可能包括数据加载、预处理、模型训练、预测和评估等部分。 - **IRIS数据集**:原始的CSV或TXT文件,包含了鸢尾花的特征和类别信息。 - **...

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

    3. **Java实现**:在Java中,可以使用诸如Weka这样的机器学习库来实现朴素贝叶斯分类器。Weka提供了丰富的机器学习算法接口,可以方便地进行数据预处理、模型训练和评估。另外,也可以手动编写代码,实现朴素贝叶斯...

Global site tag (gtag.js) - Google Analytics