朴素贝叶斯分类: 使用案例

1, 全概率公式:

在这里插入图片描述
在这里插入图片描述

2, 贝叶斯公式:

在这里插入图片描述

3,朴素贝叶斯分类器:

定义:

  • 1,设 x= {a1, a2, a3…, am } 为一个待分类项,而每个a为x的一个特征属性。
  • 2,有类别集合:C ={ y1, y2, y3 …, yn }
  • 3,计算一个概率集合U : P(y1|x), P(y2|x), P(y3|x)…P(yn|x)
  • 4,x最可能的类别 <==> 集合U中,概率的取最大值时,是类别集合C中的哪个?

朴素贝叶斯分类器是一个概率分类器。假设现有的类别C={c1,c2,……cm}。给定一篇文档d,文档d最有可能属于哪个类呢?这个问题用数学公式表示如下:

在这里插入图片描述
由于每个概率值很小(比如0.0001)若干个很小的概率值直接相乘,
得到的结果会越来越小。为了避免计算过程出现下溢(underflower),
引入对数函数Log, 最终得到:
在这里插入图片描述

4,实现代码如下:

List<String> reallist=new ArrayList<String>();//真实分类:  体育,娱乐,财经....
List<String> pridlist=new ArrayList<String>();//预测的结果: 体育,财经,娱乐....

for (Entry<String, List<String>> entry : nativeBayes.getFiles_test().entrySet()) {//取出: 待测数据
		String realclassname = entry.getKey();
		List<String> files = entry.getValue();
		
		for (String file : files) {//取出文件遍历: 一一计算它在各模型的分值(最大者最似然)
			reallist.add(realclassname);
			List<String> classnamelist=new ArrayList<String>();//实际的分类:体育,财经,娱乐....
			List<Double> scorelist=new ArrayList<Double>();	   //测后的分值:-208, -691,-703
			
			for (Entry<String, Double> entry_1 : nativeBayes.getClassProb().entrySet()) {
				String classname = entry_1.getKey();	  	
				Double score = Math.log(entry_1.getValue());//先验概率:根据公式,计算分值权重
				String[] words = file.split(" ");

				for (String word : words) {		
					if(nativeBayes.getClassFeaProb().get(classname).containsKey(word)){
						score += Math.log(nativeBayes.getClassFeaProb().get(classname).get(word));
					}else{
						score += Math.log(nativeBayes.getClassDefaultProb().get(classname));
					}
				}

				classnamelist.add(classname);
				scorelist.add(score);

			}//分类模型: 遍历end
			Double maxProb = Collections.max(scorelist);
			int idx = scorelist.indexOf(maxProb);
			pridlist.add(classnamelist.get(idx));
		}
}

5,模型的测评

精确率,准确率,召回率

for (String classname : nativeBayes.getFiles_test().keySet()) {    	
	double correctNum = 0.0;
	double allNum = 0.0;//测试数据中,某个分类的文章总数
	double preNum = 0.0;//测试数据中,预测为该分类的文章总数

	for (int i = 0; i < reallist.size(); i++) {
		if(reallist.get(i) == classname){
			allNum += 1;
			if(reallist.get(i) == pridlist.get(i)){
				correctNum += 1;
			}
		}
		if(pridlist.get(i) == classname){
			preNum += 1;
		}
	}

    System.out.println(classname + " 精确率(跟预测分类比较):" + correctNum / preNum + " 召回率(跟真实分类比较):" + correctNum / allNum);    
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

根哥的博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值