参考文章: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)
//输出:类别到训练数据的一个Map
public Map<String,ArrayList<ArrayList<String>>> classify(ArrayList<ArrayList<String>> dataSet){
Map<String,ArrayList<ArrayList<String>>> map = new HashMap<String, ArrayList<ArrayList<String>>>(); //待返回的Map
int 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{ //若没有这个类就新建一个可变长数组记录并加入map
ArrayList<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();
}
} }

运行效果截图:

基于贝叶斯算法实现简单的分类(java)的更多相关文章

  1. 【sklearn朴素贝叶斯算法】高斯分布/多项式/伯努利贝叶斯算法以及代码实例

    朴素贝叶斯 朴素贝叶斯方法是一组基于贝叶斯定理的监督学习算法,其"朴素"假设是:给定类别变量的每一对特征之间条件独立.贝叶斯定理描述了如下关系: 给定类别变量\(y\)以及属性值向 ...

  2. Atitti 文本分类  以及 垃圾邮件 判断原理 以及贝叶斯算法的应用解决方案

    Atitti 文本分类  以及 垃圾邮件 判断原理 以及贝叶斯算法的应用解决方案 1.1. 七.什么是贝叶斯过滤器?1 1.2. 八.建立历史资料库2 1.3. 十.联合概率的计算3 1.4. 十一. ...

  3. 【十大算法实现之naive bayes】朴素贝叶斯算法之文本分类算法的理解与实现

    关于bayes的基础知识,请参考: 基于朴素贝叶斯分类器的文本聚类算法 (上) http://www.cnblogs.com/phinecos/archive/2008/10/21/1315948.h ...

  4. 什么是机器学习的分类算法?【K-近邻算法(KNN)、交叉验证、朴素贝叶斯算法、决策树、随机森林】

    1.K-近邻算法(KNN) 1.1 定义 (KNN,K-NearestNeighbor) 如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类 ...

  5. Atitit 贝叶斯算法的原理以及垃圾邮件分类的原理

    Atitit 贝叶斯算法的原理以及垃圾邮件分类的原理 1.1. 最开始的垃圾邮件判断方法,使用contain包含判断,只能一个关键词,而且100%概率判断1 1.2. 元件部件串联定律1 1.3. 垃 ...

  6. Naive Bayes(朴素贝叶斯算法)[分类算法]

    Naïve Bayes(朴素贝叶斯)分类算法的实现 (1) 简介: (2)   算法描述: (3) <?php /* *Naive Bayes朴素贝叶斯算法(分类算法的实现) */ /* *把. ...

  7. [ML学习笔记] 朴素贝叶斯算法(Naive Bayesian)

    [ML学习笔记] 朴素贝叶斯算法(Naive Bayesian) 贝叶斯公式 \[P(A\mid B) = \frac{P(B\mid A)P(A)}{P(B)}\] 我们把P(A)称为"先 ...

  8. 朴素贝叶斯算法--python实现

    朴素贝叶斯算法要理解一下基础:    [朴素:特征条件独立   贝叶斯:基于贝叶斯定理] 1朴素贝叶斯的概念[联合概率分布.先验概率.条件概率**.全概率公式][条件独立性假设.]   极大似然估计 ...

  9. Python机器学习笔记:朴素贝叶斯算法

    朴素贝叶斯是经典的机器学习算法之一,也是为数不多的基于概率论的分类算法.对于大多数的分类算法,在所有的机器学习分类算法中,朴素贝叶斯和其他绝大多数的分类算法都不同.比如决策树,KNN,逻辑回归,支持向 ...

随机推荐

  1. About the Importance of Aim in Life

    Have an aim in life, or your energies will all be wasted.   ---R. Peters 人生应该树立目标,否则你的精力会白白浪费. ---彼得 ...

  2. Sql server not in优化

    使用EXISTS(或NOT EXISTS)通常将提高查询的效率,由于NOT IN子句将对子查询中的表执行了一个全表遍历. oracle在执行IN子查询过程中,先执行子查询结果放入临时表再进行主查询: ...

  3. Codeforces 1096F(dp + 树状数组)

    题目链接 题意: 对于长度为$n$的排列,在已知一些位的前提下求逆序对的期望 思路: 将答案分为$3$部分 $1.$$-1$与$-1$之间对答案的贡献.由于逆序对考虑的是数字之间的大小关系,故假设$- ...

  4. MYSQL(三)

    转载自https://www.cnblogs.com/wupeiqi/articles/5716963.html 1.索引 索引是表的目录,在查找内容之前可以先在目录中查找索引位置,以此快速定位查询数 ...

  5. mac使用apktool打包回apk

    升级最新版的apktool 下载目录:https://ibotpeaches.github.io/Apktool/install/. 权限修改 将上述的文件放在usr/local/bin目录下并执行 ...

  6. iOS -- Effective Objective-C 阅读笔记 (5)

    1: 理解 '对象等同性' 概念 理解: 根据'等同性' 来比较对象是一个非常有用的功能, 不过按照 == 操作符比较出来的结果未必是我们想要的, 因为该操作比较的是两个指针本身, 而不是其所指的对象 ...

  7. sass进阶—变量运算

    /*变量操作 (两个变量之间的运算符需要用空格隔开,否则会报错.)==,!= <,>,<=,>=+,-,*,/,% */ $width1:50px;$width2:100px; ...

  8. 在Pycharm中自动添加时间日期作者等信息

    1.按照下面路径以此打开File→→Settings→→Editor→→File and code Templates 右侧找到Python Script,如下图 2.设置相关代码如下 ##!/usr ...

  9. 烽火R2600交换机配置脚本

    烽火交换机端口映射配置 ip nat inside source static udp iP 端口号 公网iP 端口号 ip nat inside source interface Vlan-intf ...

  10. C语言fread/fwrite填坑记

    坑的描述 用fwrite把数据写入文件,再用fread读取,发现后半部分的数据可能是错的. 原因:原本要写入文件的数据中,有0x0A,如果用的是文本模式打开的文件流,在windows下0x0A会被转换 ...