java - 朴素贝叶斯
由于在网上找的bayes的源码都是基于应用的,本人才疏学浅,看不太懂,自己花了2天时间写了个粗糙的代码(基于李航那本书的例子),由于只是初学,若有错误,请指出,大家一起学习!
1 import java.io.BufferedReader; 2 import java.io.File; 3 import java.io.FileNotFoundException; 4 import java.io.FileReader; 5 import java.io.IOException; 6 import java.util.ArrayList; 7 import java.util.HashMap; 8 import java.util.List; 9 import java.util.Map; 10 11 public class Bayes { 12 public static void main(String[] args){ 13 List<List<String>> filelist = new ArrayList<List<String>>(); 14 Map<String,Double> prioriP = new HashMap<String,Double>(); 15 Map<String,Integer> prioriNo = new HashMap<String,Integer>(); 16 Map<String,Double> result = new HashMap<String,Double>(); 17 String s1 = "D://1.txt"; 18 String s2 = "D://2.txt"; 19 filelist = read(filelist,s1); 20 prioriP = computepirior(filelist,prioriP,prioriNo); 21 List<List<String>> testlist = new ArrayList<List<String>>(); 22 testlist = read(testlist,s2); 23 result = decide(prioriP,filelist,testlist,prioriNo); 24 print(result,testlist); 25 } 26 //第4步、打印结构 27 private static void print(Map<String, Double> result,List<List<String>> testlist) { 28 System.out.print("测试数据:" + " "); 29 for(int i=0;i<testlist.size();i++){ 30 System.out.print("特征" + (i+1) +" :"); 31 for(int j=0;j<testlist.get(i).size();j++){ 32 System.out.print(testlist.get(i).get(j) + " "); 33 } 34 } 35 System.out.print("所属类别:" + result.keySet().iterator().next()); 36 } 37 //第3.1步、把元数据根据所属类别分开处理 38 private static Map<String, Double> decide(Map<String, Double> prioriP, List<List<String>> filelist, List<List<String>> testlist, Map<String, Integer> prioriNo) { 39 List<Map<String,Integer>> map = new ArrayList<Map<String,Integer>>(); 40 List<List<List<String>>> fc = new ArrayList<List<List<String>>>(); 41 42 for(Map.Entry<String, Integer> entry : prioriNo.entrySet()){ 43 List<List<String>> filecopy = new ArrayList<List<String>>(); 44 for(int i=0;i<filelist.size();i++){ 45 List<String> list = new ArrayList<String>(); 46 for(int j=0;j<filelist.get(i).size();j++){ 47 if(filelist.get(filelist.size()-1).get(j).equals(entry.getKey())){ 48 list.add(filelist.get(i).get(j)); 49 } 50 } 51 filecopy.add(list); 52 } 53 fc.add(filecopy); 54 } 55 56 //有几组测试数据,本来想实现的是测试数据是多对,自己写不出来,这段代码有待改进 57 //第3.2步、测试数据在条件下出现的次数 58 List<Map<String,Integer>> l = new ArrayList<Map<String,Integer>>(); 59 for(int i=0;i<fc.size();i++){ 60 Map<String,Integer> mapdecide = new HashMap<String,Integer>(); 61 for(int k=0;k<fc.get(i).size()-1;k++){ 62 for(int j=0;j<fc.get(i).get(k).size();j++){ //需要和元数据比较的次数 63 if(testlist.get(k).get(0).equals(fc.get(i).get(k).get(j))){ 64 if(mapdecide.containsKey(testlist.get(k).get(0))){ 65 mapdecide.put(testlist.get(k).get(0), mapdecide.get(testlist.get(k).get(0)) + 1); 66 } 67 else{ 68 mapdecide.put(testlist.get(k).get(0), 1); 69 } 70 } 71 } 72 } 73 l.add(mapdecide); 74 } 75 76 //第3.3步、求后验概率,并比较哪个类别的概率大即所属类别 77 Map<String,Double> m = new HashMap<String,Double>(); 78 for(int i=0;i<l.size();i++){ 79 double d = 1.0; 80 for(Map.Entry<String, Integer> entry : l.get(i).entrySet()){ 81 d *= (entry.getValue()/(double)fc.get(i).get(fc.get(i).size()-1).size()); 82 } 83 m.put(fc.get(i).get(fc.get(i).size()-1).get(0), prioriP.get(fc.get(i).get(fc.get(i).size()-1).get(0)) * d); 84 } 85 86 Double max = 0.0; 87 for(Map.Entry<String, Double> e : m.entrySet()){ 88 if(max <= e.getValue()){ 89 max = e.getValue(); 90 } 91 } 92 93 Map<String,Double> result = new HashMap<String,Double>(); 94 for(Map.Entry<String, Double> e:m.entrySet()){ 95 if(max == e.getValue()){ 96 result.put(e.getKey(), e.getValue()); 97 } 98 } 99 return result; 100 } 101 102 //第2步、求先验概率 103 private static Map<String, Double> computepirior(List<List<String>> list, Map<String, Double> prioriP, Map<String, Integer> m) { 104 105 for(int i=0;i<list.get(list.size()-1).size();i++){ 106 if(m.containsKey(list.get(list.size()-1).get(i))){ 107 m.put(list.get(list.size()-1).get(i),m.get(list.get(list.size()-1).get(i)) + 1); 108 } 109 else{ 110 m.put(list.get(list.size()-1).get(i),1); 111 } 112 } 113 for (Map.Entry<String,Integer> entry : m.entrySet()) { 114 prioriP.put(entry.getKey(),(entry.getValue()/(double)list.get(list.size()-1).size())); 115 } 116 return prioriP; 117 } 118 //第1步、读取测试数据和训练数据 119 private static List<List<String>> read(List<List<String>> list, String sread) { 120 try { 121 FileReader fr = new FileReader(new File(sread)); 122 BufferedReader br = new BufferedReader(fr); 123 String string = br.readLine(); 124 while(string != null){ 125 List<String> l = new ArrayList<String>(); 126 String[] str = string.split(" "); 127 for (String s : str) { 128 l.add(s); 129 } 130 list.add(l); 131 string = br.readLine(); 132 } 133 } catch (FileNotFoundException e) { 134 e.printStackTrace(); 135 } catch (IOException e) { 136 e.printStackTrace(); 137 } 138 return list; 139 } 140 }
训练数据:
1 1 1 1 1 2 2 2 2 2 3 3 3 3 3
S M M S S S M M L L L M M L L
-1 -1 1 1 -1 -1 -1 1 1 1 1 1 1 1 -1
测试数据
2
S
实现结果:
测试数据: 特征1 :2 特征2 :S 所属类别:-1
转载于:https://www.cnblogs.com/wn19910213/p/3329590.html
java - 朴素贝叶斯相关推荐
- java 朴素贝叶斯_朴素贝叶斯分类器和一般的贝叶斯分类器有什么区别?
我根据自己理解,给出朴素贝叶斯分类算法的核心,在里面会有通俗详细的解释,希望对你有帮助~ 贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类.而朴素朴素贝叶斯分类是贝叶斯 ...
- java mllib 算法_朴素贝叶斯算法原理及Spark MLlib实例(Scala/Java/Python)
朴素贝叶斯 算法介绍: 朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法. 朴素贝叶斯的思想基础是这样的:对于给出的待分类项,求解在此项出现的条件下各个类别出现的概率,在没有其它可用信息下,我 ...
- 朴素贝叶斯算法实现 | Java | 机器学习 | 贝叶斯
做的一个结课作业,用Java实现了朴素贝叶斯算法 关于贝叶斯算法可以参考西瓜书.贝叶斯分类器-华校专 设计思路 创建数据类.朴素贝叶斯算法类和验证模型的类. 数据类DataFrame,用来加载和存储数 ...
- 基于朴素贝叶斯的垃圾邮件分类器Java实现和讲解
朴素贝叶斯算法最典型的应用就是垃圾邮件的识别,在数据量非常大的情况下,识别的正确率可以达到接近100%,同时实现起来思路并不复杂.本文介绍的就是基于朴素贝叶斯算法的垃圾邮件识别的实现.如果之前对贝叶斯 ...
- java naive方法_朴素贝叶斯方法(Naive Bayes Method)
朴素贝叶斯是一种很简单的分类方法,之所以称之为朴素,是因为它有着非常强的前提条件-其所有特征都是相互独立的,是一种典型的生成学习算法.所谓生成学习算法,是指由训练数据学习联合概率分布P(X,Y),然后 ...
- Java实现基于朴素贝叶斯的情感词分析
朴素贝叶斯(Naive Bayesian)是一种基于贝叶斯定理和特征条件独立假设的分类方法,它是基于概率论的一种有监督学习方法,被广泛应用于自然语言处理,并在机器学习领域中占据了非常重要的地位.在之前 ...
- java spark 朴素贝叶斯算法(naive-bayes)
配置 配置请看我的其他文章 点击跳转 spark官方文档 点击跳转官方文档 其它文章 推荐一个在蚂蚁做算法的人写的文章,不过他的文章偏专业化,有很多数学学公式.我是看的比较懵.点击跳转 数据 训练数据 ...
- 离线轻量级大数据平台Spark之MLib机器学习库朴素贝叶斯实例
1.朴素贝叶斯介绍 表示事件B已经发生的前提下,事件A发生的概率,叫做事件B发生下事件A的条件概率,公式为: 贝叶斯定理: 从已知P(A|B)获得P(B|A)值. 假设A和B代表两类互相影响的事件,如 ...
- 使用说明 vector_Paddlepaddle学习|Ubuntu环境使用 Mahout 进行朴素贝叶斯模型的训练和测试...
朴素贝叶斯算法是基于贝叶斯定理与特征条件独立假设的分类方法.分类是 将一个未知样本分到几个预先已知类的过程.解决数据分类问题有两步:第一步, 建立一个模型,描述预先的数据集或概念集,通过分析由属性描述 ...
最新文章
- 使用 OpenMVG+PMVS实现视觉三维重建
- android的横竖屏切换,Android横竖屏切换 初步探究
- 做一个简单的网上交易系统(参考淘宝、天猫的交易系统)
- 开发板、Windows、Ubuntu三者互联——韦东山嵌入式Linux学习笔记08
- CSS--居中方式总结
- 基于xml技术的操作
- mysql中下杠怎么打_怎么打字母下方的短横杠?,下横杠怎么打
- 存储与主板的外设接口
- 【收藏版】深度学习中的各种优化算法
- 大厂用的分库分表方案和demo源码,都在这里了!
- SLAM方向国内有哪些优秀公司?
- 全球首个区块链经理人指数发布: 3月BMI 62.7 行业景气整体向好
- libcurl简单接口的使用(FTP)
- 将网站封装成APP安卓应用
- Mac:TexStudio 中文论文模版
- 最少拍无纹波计算机控制系统,最少拍无纹波计算机控制系统设计.doc
- 计算机哪所民办学校好,哪所民办高校计算机软件方面好?
- ehviewer_ehviewer1.7.7
- 蛋白质界的 ChatGPT:AlphaFold1 论文必备知识,不会有人还不知道吧
- 牛客网前端刷题(一)