利用朴素贝叶斯算法进行分类-Java代码实现
http://www.crocro.cn/post/286.html
利用朴素贝叶斯算法进行分类-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));
}
}
利用朴素贝叶斯算法进行分类-Java代码实现的更多相关文章
- 【数据挖掘】朴素贝叶斯算法计算ROC曲线的面积
题记: 近来关于数据挖掘学习过程中,学习到朴素贝叶斯运算ROC曲线.也是本节实验课题,roc曲线的计算原理以及如果统计TP.FP.TN.FN.TPR.FPR.ROC面积等等.往往运用 ...
- 朴素贝叶斯算法java实现(多项式模型)
网上有很多对朴素贝叶斯算法的说明的文章,在对算法实现前,参考了一下几篇文章: NLP系列(2)_用朴素贝叶斯进行文本分类(上) NLP系列(3)_用朴素贝叶斯进行文本分类(下) 带你搞懂朴素贝叶斯分类 ...
- 朴素贝叶斯算法原理及Spark MLlib实例(Scala/Java/Python)
朴素贝叶斯 算法介绍: 朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法. 朴素贝叶斯的思想基础是这样的:对于给出的待分类项,求解在此项出现的条件下各个类别出现的概率,在没有其它可用信息下,我 ...
- 【sklearn朴素贝叶斯算法】高斯分布/多项式/伯努利贝叶斯算法以及代码实例
朴素贝叶斯 朴素贝叶斯方法是一组基于贝叶斯定理的监督学习算法,其"朴素"假设是:给定类别变量的每一对特征之间条件独立.贝叶斯定理描述了如下关系: 给定类别变量\(y\)以及属性值向 ...
- 【十大算法实现之naive bayes】朴素贝叶斯算法之文本分类算法的理解与实现
关于bayes的基础知识,请参考: 基于朴素贝叶斯分类器的文本聚类算法 (上) http://www.cnblogs.com/phinecos/archive/2008/10/21/1315948.h ...
- Python机器学习笔记:朴素贝叶斯算法
朴素贝叶斯是经典的机器学习算法之一,也是为数不多的基于概率论的分类算法.对于大多数的分类算法,在所有的机器学习分类算法中,朴素贝叶斯和其他绝大多数的分类算法都不同.比如决策树,KNN,逻辑回归,支持向 ...
- 朴素贝叶斯算法下的情感分析——C#编程实现
这篇文章做了什么 朴素贝叶斯算法是机器学习中非常重要的分类算法,用途十分广泛,如垃圾邮件处理等.而情感分析(Sentiment Analysis)是自然语言处理(Natural Language Pr ...
- C#编程实现朴素贝叶斯算法下的情感分析
C#编程实现 这篇文章做了什么 朴素贝叶斯算法是机器学习中非常重要的分类算法,用途十分广泛,如垃圾邮件处理等.而情感分析(Sentiment Analysis)是自然语言处理(Natural Lang ...
- 朴素贝叶斯算法 & 应用实例
转载请注明出处:http://www.cnblogs.com/marc01in/p/4775440.html 引 和师弟师妹聊天时经常提及,若有志于从事数据挖掘.机器学习方面的工作,在大学阶段就要把基 ...
随机推荐
- sybase 修改用户密码
命令行输入 isql -Usa -P123456 将sa口令设置为NULL(当前口令为"123456"): sp_password '123456',NULL,sa
- HTTP中的重定向和请求转发的区别
原文出处:http://blog.csdn.net/meiyalei/article/details/2129120 一.调用方式 我们知道,在servlet中调用转发.重定向的语句如下: reque ...
- vcs 下使用system verilog调用c函数
c中要加入<svdpi.h> sv的tb中加入 import "DPI-C" function int funcname(); 仿真时,vcs命令行中加入 +vc fu ...
- Codecraft-17 and Codeforces Round #391 (Div. 1 + Div. 2, combined)
传送门:http://codeforces.com/contest/757 A题题意是给你一个字符串,让你在里面找到"Bulbasaur"这样的单词有多少个,字符串可以重排列.实际 ...
- gitignore git提交忽略文件
从网上找的git忽略文件挺前面的,现在记录下来,以备后用: tomsuite.xml **pom.xml.releaseBackup release.properties gen */seed.txt ...
- nginx: [emerg] socket() [::]:80 failed (97: Address family not supported by protocol)
环境:Centos6.5 行为:安装nginx 问题: nginx: [emerg] socket() [::]: failed (: Address family not supported by ...
- 2016年团体程序设计天梯赛-决赛 L1-3. 出租(20)
下面是新浪微博上曾经很火的一张图: 一时间网上一片求救声,急问这个怎么破.其实这段代码很简单,index数组就是arr数组的下标,index[0]=2 对应 arr[2]=1,index[1]=0 对 ...
- CSS3秘笈复习:第十一章
1.text-align与vertical-align: text-align控制水平方向的定位,关键字是left.right.center和justify. vertical-align控制垂直方向 ...
- DD应用实例
1.将本地的/dev/hdb整盘备份到/dev/hdd dd if=/dev/hdb of=/dev/hdd2.将/dev/hdb全盘数据备份到指定路径的image文件dd if=/dev/hdb o ...
- Java 反射 调用私有域和方法(setAccessible)
Java 反射 调用私有域和方法(setAccessible) @author ixenos AccessibleObject类 Method.Field和Constructor类共同继承了Acces ...