概率论和高中数学都学习过贝叶斯公式来计算条件概率,A发生下B发送的概率这种题,比较熟悉。朴素贝叶斯分类算法或许和这个有点关系吧…
1、贝叶斯原理
“逆向概率”:相对“正向概率”而言,正向概率就像是一个袋子各种颜色球然后摸求概率这种问题,上帝视角解决问题。而大多数我们需要解决的问题确不能在上帝视角解决的。于是贝叶斯提出这样一个问题:不知道袋中白球和黑球的个数,而是通过摸出球的颜色来判断带中白球和黑球个数的比例
贝叶斯公式 P(A|B) = (P(B|A) * P(A))/ P(B)
2、朴素贝叶斯
例子(重要,代码实现的思路依赖于解决这个问题的思路):
某个医院早上收了六个门诊病人,如下表。
症状 职业 疾病
打喷嚏 护士 感冒
打喷嚏 农夫 过敏
头痛 建筑工人 脑震荡
头痛 建筑工人 感冒
打喷嚏 教师 感冒
头痛 教师 脑震荡
现在又来了第七个病人,是一个打喷嚏的建筑工人。请问他患上感冒的概率有多大?
P(感冒|打喷嚏 x 建筑工人)
= P(打喷嚏 * 建筑工人|感冒)* P(感冒) / p (打喷嚏 * 建筑工人)
由于打喷嚏和建筑工人是相互独立事件
原式 = P(打喷嚏|感冒) * p(建筑工人|感冒) * p(感冒) / p(打喷嚏) * p(建筑工人)
(这些概率都可以根据数据计算出来,从来预测第七个病人患上感冒的概率)
= (2/3 * 1/3 * 1/2) / (1/2 * 1/3)
= 2/3 = 66.6%
上面这给例子的计算过程大概就是朴素贝叶斯分类算法的原理,贝叶斯朴素算法的前提是假设影响结果的属性之间是相互独立的,如职业护士和教师(但现实不排除有人同时从事这两种职业的可能),虽然如此,这种算法在大多数情况下还是比较准确。
朴素贝叶斯分类:在统计资料的基础上,依据某些特征,计算各个类别的概率,从而实现分类。
3、代码实现
以实验的作业为例:
现有西瓜挑选数据文件:dataset.txt
编程实现朴素贝叶斯算法
并判断有如下特征的瓜是否好瓜:
青绿,稍蜷,浊响,清晰,凹陷,硬滑
dataset.txt:
编号,色泽,根蒂,敲声,纹理,脐部,触感,好瓜
1,青绿,蜷缩,浊响,清晰,凹陷,硬滑,是
2,乌黑,蜷缩,沉闷,清晰,凹陷,硬滑,是
3,乌黑,蜷缩,浊响,清晰,凹陷,硬滑,是
4,青绿,蜷缩,沉闷,清晰,凹陷,硬滑,是
5,浅白,蜷缩,浊响,清晰,凹陷,硬滑,是
6,青绿,稍蜷,浊响,清晰,稍凹,软粘,是
7,乌黑,稍蜷,浊响,稍糊,稍凹,软粘,是
8,乌黑,稍蜷,浊响,清晰,稍凹,硬滑,是
9,乌黑,稍蜷,沉闷,稍糊,稍凹,硬滑,否
10,青绿,硬挺,清脆,清晰,平坦,软粘,否
11,浅白,硬挺,清脆,模糊,平坦,硬滑,否
12,浅白,蜷缩,浊响,模糊,平坦,软粘,否
13,青绿,稍蜷,浊响,稍糊,凹陷,硬滑,否
14,浅白,稍蜷,沉闷,稍糊,凹陷,硬滑,否
15,乌黑,稍蜷,浊响,清晰,稍凹,软粘,否
16,浅白,蜷缩,浊响,模糊,平坦,硬滑,否
17,青绿,蜷缩,沉闷,稍糊,稍凹,硬滑,否
代码实现之:
目录结构:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aHqEPEFi-1608896877278)(https://i.loli.net/2020/12/25/aILTHUQNu6iSY1y.png)]
- FileRead : 读取txt工具类
- Watermelon:西瓜实体类
- NativeBayesModel:算法实现类
FileRead.java
package utils;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
/**
* @description: 读取.txt文件工具类
* @author: zyb
* @date: 2020/10/13 15:47
*/
public class FileRead {
public static void main(String[] args) {
String filePath = "文件所在路径/文件名";
List<String> list = FileRead.read(filePath);
for (String s : list) {
System.out.println(s);
}
}
public static List<String> read(String filePath){
FileInputStream inputStream = null;
BufferedReader bufferedReader = null;
List<String> data = new ArrayList<String>();
try {
inputStream = new FileInputStream(filePath);
//设置inputStreamReader的构造方法并创建对象设置编码方式为gbk(编码格式可自行切换)
bufferedReader = new BufferedReader(new InputStreamReader(inputStream,"gbk"));
String str = null;
while((str = bufferedReader.readLine()) != null)
{
data.add(str);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (bufferedReader != null) {
try {
bufferedReader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}