参考文章:https://blog.csdn.net/qq_32690999/article/details/78737393

项目代码目录结构

模拟训练的数据集

核心代码

Bayes.java

package IsStudent_bys;import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;public class Bayes {//按类别分类//输入:训练数据(dataSet)//输出:类别到训练数据的一个Mappublic Map<String,ArrayList<ArrayList<String>>> classify(ArrayList<ArrayList<String>> dataSet){Map<String,ArrayList<ArrayList<String>>> map = new HashMap<String, ArrayList<ArrayList<String>>>(); //待返回的Mapint num=dataSet.size();for(int i=0;i<num;i++)  //遍历所有数据项
        {ArrayList<String> Y = dataSet.get(i);  //将第i个训练样本的信息取出String Class = Y.get(Y.size()-1).toString();  //约定将类别信息放在最后一个字符串if(map.containsKey(Class)){  //判断map中是否已经有这个类了
                map.get(Class).add(Y);}else{  //若没有这个类就新建一个可变长数组记录并加入mapArrayList<ArrayList<String>> nlist = new ArrayList<ArrayList<String>>();nlist.add(Y);map.put(Class,nlist);}}return map;}//计算分类后每个类对应的样本中某个特征出现的概率//输入:某一类别对应的数据(classdata) 目标值(value) 相应的列值(index)//输出:该类数据中相应列上的值等于目标值得频率public double CalPro_yj_c(ArrayList<ArrayList<String>> classdata, String value, int index){int sum = 0;  //sum用于记录相同特征出现的频数int num = classdata.size();for(int i=0;i<num;i++){ArrayList<String> Y = classdata.get(i);if(Y.get(index).equals(value)) sum++;  //相同则计数
        }return (double)sum/num;  //返回频率,以频率带概率
        }//贝叶斯分类器主函数//输入:训练集(可变长数组);待分类集//输出:概率最大的类别public String bys_Main(ArrayList<ArrayList<String>> dataSet, ArrayList<String> testSet){Map<String, ArrayList<ArrayList<String>>> doc = this.classify(dataSet);  //用本class中的分类函数构造映射
        Object classes[] = doc.keySet().toArray(); //把map中所有的key取出来(即所有类别) ,借鉴学习了object的使用(待深入了解)double Max_Value=0.0; //最大的概率int Max_Class=-1;     //用于记录最大类的编号for(int i=0;i<doc.size();i++)  //对每一个类分别计算,本程序只有两个类
        {String c = classes[i].toString();  //将类提取出ArrayList<ArrayList<String>> y = doc.get(c);  //提取该类对应的数据列表double prob = (double)y.size()/dataSet.size();  //计算比例
            System.out.println(c+" : "+prob);  //输出该类的样本占总样本个数的比例!for(int j=0;j<testSet.size();j++)  //对每个属性计算先验概率
            {double P_yj_c = CalPro_yj_c(y,testSet.get(j),j);//输出中间结果以便测试System.out.println("now in bys_Main!!"+P_yj_c);prob = prob*P_yj_c;}System.out.printf("P(%s | testcase) * P(testcase) = %f\n",c,prob);  //输出分子的概率大小if(prob>Max_Value)  //更新分子最大概率
            {Max_Value=prob;Max_Class=i;}}return classes[Max_Class].toString();}
}

FetchData.java

package IsStudent_bys;import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.StringTokenizer;public class FetchData {//连接数据库,读取训练数据//输入:数据库//输出:可变长数组public ArrayList<ArrayList<String>> fetch_traindata(){ArrayList<ArrayList<String>> dataSet = new ArrayList<ArrayList<String>>();  //待返回
        Connection conn;    String driver = "com.mysql.jdbc.Driver"; String url = "jdbc:mysql://localhost:3306/Bayes";  //指向要访问的数据库!注意后面跟的是数据库名称String user = "root";   //navicat for sql配置的用户名String password = "root";  //navicat for sql配置的密码try{Class.forName(driver);  //用class加载动态链接库——驱动程序conn = DriverManager.getConnection(url,user,password);  //利用信息链接数据库if(!conn.isClosed())System.out.println("Succeeded connecting to the Database!");Statement statement = conn.createStatement();  //用statement 来执行sql语句String sql = "select * from TrainData";   //这是sql语句中的查询某个表,注意后面的emp是表名!!!ResultSet rs = statement.executeQuery(sql);  //用于返回结果
            String str = null;while(rs.next()){  //一直读到最后一条表ArrayList<String> s= new ArrayList<String>();str = rs.getString("Sex");  //分别读取相应栏位的信息加入到可变长数组中
                s.add(str);str = rs.getString("tatto");s.add(str);str = rs.getString("smoking");s.add(str);str = rs.getString("wearglasses");s.add(str);str = rs.getString("ridebike");s.add(str);str = rs.getString("isStudent");s.add(str);dataSet.add(s);  //加入dataSet//System.out.println(s);  输出中间结果调试
            }rs.close();conn.close();}catch(ClassNotFoundException e){  //catch不同的错误信息,并报错System.out.println("Sorry,can`t find the Driver!");e.printStackTrace();}catch(SQLException e){e.printStackTrace();}catch (Exception e) {e.printStackTrace();}finally{System.out.println("数据库训练数据读取成功!");}return dataSet;}public ArrayList<String> read_testdata(String str) throws IOException  //将用户输入的一整行字符串分割解析成可变长数组
    {ArrayList<String> testdata=new ArrayList<String>();  //待返回StringTokenizer tokenizer = new StringTokenizer(str);  while (tokenizer.hasMoreTokens()) { testdata.add(tokenizer.nextToken());}return testdata;}
}

Main.java

package IsStudent_bys;import java.io.BufferedInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Scanner;public class Main {//主函数,读取数据库,并读入待判定数据,输出结果public static void main(String[] args) {FetchData Fdata = new FetchData();   //java对函数的调用要先声明相应的对象再调用Bayes bys = new Bayes();ArrayList<ArrayList<String>> dataSet = null; //训练数据列表ArrayList<String> testSet = null; //测试数据try{System.out.println("从数据库读入训练数据:");dataSet = Fdata.fetch_traindata();   //读取训练数据集合System.out.println("请输入测试数据:"); Scanner cin = new Scanner(new BufferedInputStream(System.in));  //从标准输入输出中读取测试数据while(cin.hasNext())  //支持多条测试数据读取
            {String str = cin.nextLine();   //先读入一行testSet = Fdata.read_testdata(str);//将这一行进行字符串分隔解析后返回可变长数组类型//System.out.println(testSet);  //输出中间结果String ans = bys.bys_Main(dataSet, testSet);  //调用贝叶斯分类器if(ans.equals("yes")) System.out.println("Yes!!! 根据已有数据推断极有可能像是一个学生!");  //输出结果else System.out.println("他/她 的特征不像一名学生!");}cin.close();}catch (IOException e) {  //处理异常
            e.printStackTrace();} }}

运行效果截图:

转载于:https://www.cnblogs.com/zyt-bg/p/10405947.html

基于贝叶斯算法实现简单的分类(java)相关推荐

  1. 朴素贝叶斯算法:实现邮件分类

    朴素贝叶斯算法:实现邮件分类 注:代码和数据已上传:https://download.csdn.net/download/j__max/10705454 一.实验准备 1.实验内容和目的 使用5000 ...

  2. 基于贝叶斯算法的邮件过滤管理系统的设计和实现(Vue+SpringBoot)

    作者主页:Designer 小郑 作者简介:Java全栈软件工程师一枚,来自浙江宁波,负责开发管理公司OA项目,专注软件前后端开发(Vue.SpringBoot和微信小程序).系统定制.远程技术指导. ...

  3. 朴素贝叶斯算法实现英文文本分类

    目录 1. 作者介绍 2. 朴素贝叶斯算法简介及案例 2.1朴素贝叶斯算法简介 2.2文本分类器 2.3对新闻文本进行文本分类 3. Python 代码实现 3.1文本分类器 3.2 新闻文本分类 参 ...

  4. 基于贝叶斯算法的证券市场风险研究

    [摘要] 证券市场风险是指由于受到各种不确定因素引起证券市场价格非理性剧烈变动及证券资产迅速贬值,从而使市场行为主体可能受到损失.风险事件是风险产生的必要条件,是直接导致损失发生的不确定性事件,也是导 ...

  5. 基于贝叶斯算法的文本分类算法

    因为要做一个关于数据挖掘的算法应用PPT,虽然知道很多数据挖掘的算法怎么使用,但是需要讲解它们的原理,还真的需要耗费很多精力,之前做一个曲线拟合,已经发在博客里,现在做贝叶斯算法的基础原理. 1.基本 ...

  6. 基于朴素贝叶斯算法对肿瘤类别分类

    目录 朴素贝叶斯算法​编辑 朴素贝叶斯的三种方式 实战--肿瘤类别的分类 朴素贝叶斯算法  贝叶斯定理 贝叶斯定理(Bayes Theorem)也称贝叶斯公式,是关于随机 事件的条件概率的定理 定理内 ...

  7. Python scikit-learn,分类,朴素贝叶斯算法,文档分类,MultinomialNB,拉普拉斯平滑系数

    朴素贝叶斯预测分类的思想就是根据待预测文档的特征(TF-IDF高的词)分别计算属于各个类别的概率,其中概率最大的类别,就是预测的类别.(朴素的意思就是文档的特征(词)之间相互独立) 朴素贝叶斯进行文档 ...

  8. 机器学习——朴素贝叶斯算法(垃圾邮件分类)

    朴素贝叶斯算法介绍以及垃圾邮件分类实现 1.一些数学知识 2.贝叶斯公式 3.朴素贝叶斯算法 (1)介绍 (2)核心思想 (3)朴素贝叶斯算法 (4)拉普拉斯修正 (5)防溢出策略 (6)一般过程 ( ...

  9. 【图像分割】基于贝叶斯算法阙值图像分割matlab代码

    1 简介 图像预处理是后期继续进行图像相关研究的先驱,准确有效的采用合适的预处理方法起着关键作用;在对贝叶斯公式和相关理论的深入研究后,针对贝叶斯算法处理庞大数据的高效性和处理对象的独立性强的特点,以 ...

最新文章

  1. 新版Edge浏览器弹出“ 禁用开发人员模式扩展 ”的解决方案
  2. 什么叫做石英表_石英表和机械表的区别是什么
  3. oracle 存储过程字符替换,Oracle存储过程常用字符串处理函数整理
  4. IOS15全屏滑动返回
  5. Spring中@ Component,@ Service,@ Controller和@Repository之间的区别
  6. 后台运行python程序 遇到缓冲区问题
  7. 【模板】最新空web.xml模板
  8. Java多线程学习二十七:AtomicInteger 在高并发下性能不好,如何解决?为什么?
  9. Spring @Order注解的使用
  10. 企业知识管理与协同软件Confluence搭建与配置
  11. python 获取当前目录,上级目录,上上级目录
  12. 每日一句20200104
  13. 【组合数学】递推方程 ( 有重根下递推方程通解结构 | 线性无关解 | 有重根下的通解 | 有重根下的递推方程求解示例 | 递推方程公式解法总结 ) ★
  14. axure创建自定义元件库
  15. 变废为宝,用旧电脑自己DIY组建 NAS 服务器
  16. eclipse中各图标的含义
  17. php正则表达式. 123,php正则表达式 - 路人甲123的个人页面 - OSCHINA - 中文开源技术交流社区...
  18. 卡内基梅隆大学计算机专业介绍,卡内基梅隆大学计算机专业介绍 全美大学计算机专业榜首...
  19. dw自动滚动图片_Dreamweaver实现滚动图片文字
  20. 淘宝短视频,为什么搬运的短视频没有流量?从算法角度分析

热门文章

  1. Oracle NoLogging Append 方式减少批量insert的redo_size
  2. 禅道程序员的10条原则
  3. python 字典的系列操作
  4. Python之Selenium的爬虫用法
  5. 《Servlet和JSP学习指南》一第2章 Session管理 2.1 网址重写
  6. js 、jq强化复习
  7. 一步一步写算法(之hash表)
  8. HDUOJ------Worm
  9. UVa 412 - Pi
  10. 我是一名Cisco爱好 者