由于在网上找的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 - 朴素贝叶斯相关推荐

  1. java 朴素贝叶斯_朴素贝叶斯分类器和一般的贝叶斯分类器有什么区别?

    我根据自己理解,给出朴素贝叶斯分类算法的核心,在里面会有通俗详细的解释,希望对你有帮助~ 贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类.而朴素朴素贝叶斯分类是贝叶斯 ...

  2. java mllib 算法_朴素贝叶斯算法原理及Spark MLlib实例(Scala/Java/Python)

    朴素贝叶斯 算法介绍: 朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法. 朴素贝叶斯的思想基础是这样的:对于给出的待分类项,求解在此项出现的条件下各个类别出现的概率,在没有其它可用信息下,我 ...

  3. 朴素贝叶斯算法实现 | Java | 机器学习 | 贝叶斯

    做的一个结课作业,用Java实现了朴素贝叶斯算法 关于贝叶斯算法可以参考西瓜书.贝叶斯分类器-华校专 设计思路 创建数据类.朴素贝叶斯算法类和验证模型的类. 数据类DataFrame,用来加载和存储数 ...

  4. 基于朴素贝叶斯的垃圾邮件分类器Java实现和讲解

    朴素贝叶斯算法最典型的应用就是垃圾邮件的识别,在数据量非常大的情况下,识别的正确率可以达到接近100%,同时实现起来思路并不复杂.本文介绍的就是基于朴素贝叶斯算法的垃圾邮件识别的实现.如果之前对贝叶斯 ...

  5. java naive方法_朴素贝叶斯方法(Naive Bayes Method)

    朴素贝叶斯是一种很简单的分类方法,之所以称之为朴素,是因为它有着非常强的前提条件-其所有特征都是相互独立的,是一种典型的生成学习算法.所谓生成学习算法,是指由训练数据学习联合概率分布P(X,Y),然后 ...

  6. Java实现基于朴素贝叶斯的情感词分析

    朴素贝叶斯(Naive Bayesian)是一种基于贝叶斯定理和特征条件独立假设的分类方法,它是基于概率论的一种有监督学习方法,被广泛应用于自然语言处理,并在机器学习领域中占据了非常重要的地位.在之前 ...

  7. java spark 朴素贝叶斯算法(naive-bayes)

    配置 配置请看我的其他文章 点击跳转 spark官方文档 点击跳转官方文档 其它文章 推荐一个在蚂蚁做算法的人写的文章,不过他的文章偏专业化,有很多数学学公式.我是看的比较懵.点击跳转 数据 训练数据 ...

  8. 离线轻量级大数据平台Spark之MLib机器学习库朴素贝叶斯实例

    1.朴素贝叶斯介绍 表示事件B已经发生的前提下,事件A发生的概率,叫做事件B发生下事件A的条件概率,公式为: 贝叶斯定理: 从已知P(A|B)获得P(B|A)值. 假设A和B代表两类互相影响的事件,如 ...

  9. 使用说明 vector_Paddlepaddle学习|Ubuntu环境使用 Mahout 进行朴素贝叶斯模型的训练和测试...

    朴素贝叶斯算法是基于贝叶斯定理与特征条件独立假设的分类方法.分类是 将一个未知样本分到几个预先已知类的过程.解决数据分类问题有两步:第一步, 建立一个模型,描述预先的数据集或概念集,通过分析由属性描述 ...

最新文章

  1. 使用 OpenMVG+PMVS实现视觉三维重建
  2. android的横竖屏切换,Android横竖屏切换 初步探究
  3. 做一个简单的网上交易系统(参考淘宝、天猫的交易系统)
  4. 开发板、Windows、Ubuntu三者互联——韦东山嵌入式Linux学习笔记08
  5. CSS--居中方式总结
  6. 基于xml技术的操作
  7. mysql中下杠怎么打_怎么打字母下方的短横杠?,下横杠怎么打
  8. 存储与主板的外设接口
  9. 【收藏版】深度学习中的各种优化算法
  10. 大厂用的分库分表方案和demo源码,都在这里了!
  11. SLAM方向国内有哪些优秀公司?
  12. 全球首个区块链经理人指数发布: 3月BMI 62.7 行业景气整体向好
  13. libcurl简单接口的使用(FTP)
  14. 将网站封装成APP安卓应用
  15. Mac:TexStudio 中文论文模版
  16. 最少拍无纹波计算机控制系统,最少拍无纹波计算机控制系统设计.doc
  17. 计算机哪所民办学校好,哪所民办高校计算机软件方面好?
  18. ehviewer_ehviewer1.7.7
  19. 蛋白质界的 ChatGPT:AlphaFold1 论文必备知识,不会有人还不知道吧
  20. 牛客网前端刷题(一)

热门文章

  1. spring融合activitymq-all启动报错的解决办法
  2. Java IO: 字符流的Buffered和Filter
  3. 【搬砖】【Python数据分析】Pycharm中plot绘图不能显示出来
  4. centos7 安装 oracle 11G
  5. Python学习系列(一)(基础入门)
  6. python 调试命令
  7. VMware ESXi导出OVF模板
  8. Plitch for the final Feb 16
  9. c++账户类 题目描述
  10. 在国外读phd 的时候和supervisor沟通的时候需要注意的点