算法原理
朴素贝叶斯分类是一种十分简单的分类算法,叫它朴素贝叶斯分类是因为这种方法的思想真的很朴素,朴素贝叶斯的思想基础是这样的:对于给出的待分类项,求解在此项出现的条件下各个类别出现的概率,哪个最大,就认为此待分类项属于哪个类别。
概率计算公式
P
(
A
∣
B
C
)
=
P
(
A
)
×
P
(
B
∣
A
)
×
P
(
C
∣
A
)
P
(
B
C
)
P(A | BC) = \frac {P(A) \times P(B | A)\times P(C | A)} {P(BC)}
P(A∣BC)=P(BC)P(A)×P(B∣A)×P(C∣A)
对给定的一组特征进行分类
本文的预测问题是“患者是否感冒”
将以往患者的状况写入文件中,文件中的内容如下:
身体状况:正常(Normal),发烧(High),发高烧(Very high)
是否流鼻涕:是(True),否(False)
肌肉疼痛:疼痛(True),正常(False)
头痛:是(True),否(Fasle)
是否感冒:是( P),否(N)
一患者有如下特征:
发烧(High),流鼻涕(True),肌肉正常(False),头痛(True)
判断患者是否感冒?
由贝叶斯算法的原理可以知道,要计算以下两个值,并比较其大小
P(P | (High,True,False,True))
P(N | (High,True,False,True))
运行效果:
因此我们可以预测,患者感冒
代码如下:
package a2;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.io.*;
public class Bayesian {
static String filePath = System.getProperty("user.dir")+"\\src\\a2\\dataset.txt";
static ArrayList<ArrayList<String>> data = new ArrayList<ArrayList<String>>();
//从文件中读取数据,储存到集合data中
public ArrayList<ArrayList<String>> readTable(String filePath){
ArrayList<String> d = null;
ArrayList<ArrayList<String>> t = new ArrayList<ArrayList<String>>();
File file = new File(filePath);
try {
InputStreamReader isr = new InputStreamReader(new FileInputStream(file));
BufferedReader bf = new BufferedReader(isr);
String str = null;
while((str = bf.readLine()) != null) {
d = new ArrayList<String>();
String[] str1 = str.split(",");
for(int i = 1; i < str1.length ; i++) {
d.add(str1[i]);
}
t.add(d);
data = t;
}
bf.close();
isr.close();
} catch (Exception e) {
e.printStackTrace();
System.out.println("文件不存在!");
}
return t;
}
//计算分母的值,并返回
public double denominator() {
double result = 0;
int count1 = 0;
int count2 = 0;
int count3 = 0;
int count4 = 0;
for(int i = 0; i < data.size() ;i++) {
if(data.get(i).get(0).equals("High")) {
count1++;
}
if(data.get(i).get(1).equals("True")) {
count2++;
}
if(data.get(i).get(2).equals("False")) {
count3++;
}
if(data.get(i).get(3).equals("True")) {
count4++;
}
}
result = (count1 / (data.size()*1.0))*(count2 / (data.size()*1.0))*(count3 / (data.size()*1.0))*(count4 / (data.size()*1.0));
System.out.println(result);
return result;
}
//计算分子的值
public double moleculeIsCold(String cold) {
double result = 0;
int countIsCold = 0;
int count1 = 0;
int count2 = 0;
int count3 = 0;
int count4 = 0;
for(int i = 0; i < data.size() ;i++) {
if(data.get(i).get(4).equals(cold)) {
countIsCold++;
}
if(data.get(i).get(0).equals("High") && data.get(i).get(4).equals(cold)) {
count1++;
}
if(data.get(i).get(1).equals("True") && data.get(i).get(4).equals(cold)) {
count2++;
}
if(data.get(i).get(2).equals("False") && data.get(i).get(4).equals(cold)) {
count3++;
}
if(data.get(i).get(3).equals("True") && data.get(i).get(4).equals(cold)) {
count4++;
}
}
result = (countIsCold / (data.size()*1.0))*(count1 / (countIsCold*1.0))*(count2 / (countIsCold*1.0))*(count3 / (countIsCold*1.0))*(count4 / (countIsCold*1.0));
return result;
}
//比较感冒和未感冒的概率,并返回比较结果
public String compared() {
String str = "";
double d1 = 0,d2 = 0;
d1 = moleculeIsCold("P")*1.0 / denominator();
d2 = moleculeIsCold("N")*1.0 / denominator();
if(d1 > d2) {
str = "感冒";
}else {
str = "没有感冒";
}
System.out.println("感冒的概率:"+d1);
System.out.println("没有感冒的概率:"+d2);
System.out.println(str);
return str;
}
public static void main(String[] args) {
Bayesian ba = new Bayesian();
ba.readTable(filePath);
ba.denominator();
ba.compared();
}
}