机器学习-朴素贝叶斯分类算法(java,判断西瓜好坏案例)

概率论和高中数学都学习过贝叶斯公式来计算条件概率,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();
                }
            }
        }
        
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值