利用朴素贝叶斯算法进行分类-Java代码实现

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

利用朴素贝叶斯算法进行分类-Java代码实现

鳄鱼  3个月前 (12-14)  分类:机器学习  阅读(44)  评论(0)

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));
	}

}
时间: 2024-10-20 07:56:55

利用朴素贝叶斯算法进行分类-Java代码实现的相关文章

【数据挖掘】朴素贝叶斯算法计算ROC曲线的面积

题记:          近来关于数据挖掘学习过程中,学习到朴素贝叶斯运算ROC曲线.也是本节实验课题,roc曲线的计算原理以及如果统计TP.FP.TN.FN.TPR.FPR.ROC面积等等.往往运用ROC面积评估模型准确率,一般认为越接近0.5,模型准确率越低,最好状态接近1,完全正确的模型面积为1.下面进行展开介绍: ROC曲线的面积计算原理 一.朴素贝叶斯法的工作过程框架图 二.利用weka工具,找到训练的预处理数据 1.利用朴素贝叶斯算法对weather.nominal.arff文件进行

基于概率论的分类方法:朴素贝叶斯算法实践学习

      关于本文说明,本人原博客地址位于http://blog.csdn.net/qq_37608890,本文来自笔者于2017年12月12日 13:03:46所撰写内容(http://blog.csdn.net/qq_37608890/article/details/78738552).             本文根据最近学习机器学习书籍 网络文章的情况,特将一些学习思路做了归纳整理,详情如下.如有不当之处,请各位大拿多多指点,在此谢过.          通过前两篇文章,我们对于k-近

C#编程实现朴素贝叶斯算法下的情感分析

C#编程实现 这篇文章做了什么 朴素贝叶斯算法是机器学习中非常重要的分类算法,用途十分广泛,如垃圾邮件处理等.而情感分析(Sentiment Analysis)是自然语言处理(Natural Language Progressing)中的重要问题,用以对文本进行正负面的判断,以及情感度评分和意见挖掘.本文借助朴素贝叶斯算法,针对文本正负面进行判别,并且利用C#进行编程实现. 不先介绍点基础? 朴素贝叶斯,真的很朴素 朴素贝叶斯分类算法,是一种有监督学习算法,通过对训练集的学习,基于先验概率与贝叶

朴素贝叶斯算法 &amp; 应用实例

转载请注明出处:http://www.cnblogs.com/marc01in/p/4775440.html 引 和师弟师妹聊天时经常提及,若有志于从事数据挖掘.机器学习方面的工作,在大学阶段就要把基础知识都带上. 机器学习在大数据浪潮中逐渐展示她的魅力,其实<概率论>.<微积分>.<线性代数>.<运筹学>.<信息论>等几门课程算是前置课程,当然要转化为工程应用的话,编程技能也是需要的,而作为信息管理专业的同学,对于信息的理解.数据的敏感都是很好

通俗易懂机器学习——朴素贝叶斯算法

本文将叙述朴素贝叶斯算法的来龙去脉,从数学推导到计算演练到编程实战 文章内容有借鉴网络资料.李航<统计学习方法>.吴军<数学之美>加以整理及补充 基础知识补充: 1.贝叶斯理论–吴军数学之美 http://mindhacks.cn/2008/09/21/the-magical-bayesian-method/ 2.条件概率 3.联合分布 朴素贝叶斯算法 朴素贝叶斯法是基于贝叶斯定理和特征条件独立假设的 分类方法.给定训练数据集,首先基于特征条件独立假设学习 输入/输出的联合概率分布

机器学习之朴素贝叶斯算法

1 贝叶斯定理的引入 概率论中的经典条件概率公式: 公式的理解为,P(X ,Y)= P(Y,X)<=> P(X | Y)P(Y)= P(Y | X)P (X),即 X 和 Y 同时发生的概率与 Y 和 X 同时发生的概率一样. 2 朴素贝叶斯定理 朴素贝叶斯的经典应用是对垃圾邮件的过滤,是对文本格式的数据进行处理,因此这里以此为背景讲解朴素贝叶斯定理.设D 是训练样本和相关联的类标号的集合,其中训练样本的属性集为          X { X1,X2, ... , Xn }, 共有n 个属性:

挖掘算法(1)朴素贝叶斯算法

原文:http://www.blogchong.com/post/NaiveBayes.html 1 文档说明 该文档为朴素贝叶斯算法的介绍和分析文档,并且结合应用实例进行了详细的讲解. 其实朴素贝叶斯的概念以及流程都被写烂了,之所以写这些是方便做个整理,记录备忘.而实例部分进行了详细的描述,网络上该实例比较简单,没有过程. 至于最后部分,则是对朴素贝叶斯的一个扩展了,当然只是简单的描述了一下过程,其中涉及到的中文分词以及TFIDF算法,有时间再具体补上. 2 算法介绍 2.1 贝叶斯定理 (1

数据挖掘|朴素贝叶斯算法

作者:张一 链接:https://zhuanlan.zhihu.com/p/21571692 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 因为后期的项目将涉及到各种各样的价格数据处理问题,所以我们现在开始学习一些简单的数据清洗与算法的知识.关于算法,以前听起来觉得好高大上,现在开始学,觉得书上的描述并不是很通俗易懂,所以用自己的语言来简要写一下这些算法~ 注:非商业转载注明作者即可,商业转载请联系作者授权并支付稿费.本人已授权"维权骑士"网站(ht

朴素贝叶斯算法原理及实现

朴素贝叶斯算法简单高效,在处理分类问题上,是应该首先考虑的方法之一. 1.准备知识 贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类. 这个定理解决了现实生活里经常遇到的问题:已知某条件概率,如何得到两个事件交换后的概率,也就是在已知P(A|B)的情况下如何求得P(B|A).这里先解释什么是条件概率: 表示事件B已经发生的前提下,事件A发生的概率,叫做事件B发生下事件A的条件概率.其基本求解公式为:. 下面不加证明地直接给出贝叶斯定理: 2.朴素贝叶斯分类 2.1