基于贝叶斯算法实现简单的分类(java)参考⽂章:blog.csdn/qq_32690999/article/details/78737393
项⽬代码⽬录结构
模拟训练的数据集resultset 遍历
核⼼代码
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++)  //遍历所有数据项
{
String Class = Y.get(Y.size()-1).toString();  //约定将类别信息放在最后⼀个字符串
ainsKey(Class)){  //判断map中是否已经有这个类了
<(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 = (i);
(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 = (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((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 = "sql.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 = Connection(url,user,password);  //利⽤信息链接数据库
if(!conn.isClosed())
System.out.println("Succeeded connecting to the Database!");
Statement statement = ateStatement();  //⽤statement 来执⾏sql语句
String sql = "select * from TrainData";  //这是sql语句中的查询某个表,注意后⾯的emp是表名!!!
ResultSet rs = uteQuery(sql);  //⽤于返回结果
String str = null;
()){  //⼀直读到最后⼀条表
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.Token());
}
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 = Line();  //先读⼊⼀⾏
testSet = ad_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();
}
}
}
运⾏效果截图:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。