我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java利用朴素贝叶斯分类算法实现信息分类

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java利用朴素贝叶斯分类算法实现信息分类

贝叶斯分类算法 

贝叶斯分类算法是统计学的一种分类方法,它是一类利用概率统计知识进行分类的算法。在许多场合,朴素贝叶斯(Naïve Bayes,NB)分类算法可以与决策树和神经网络分类算法相媲美,该算法能运用到大型数据库中,而且方法简单、分类准确率高、速度快。

由于贝叶斯定理假设一个属性值对给定类的影响独立于其它属性的值,而此假设在实际情况中经常是不成立的,因此其分类准确率可能会下降。为此,就衍生出许多降低独立性假设的贝叶斯分类算法,如TAN(tree augmented Bayes network)算法。

那么既然是朴素贝叶斯分类算法,它的核心算法又是什么呢?

是下面这个贝叶斯公式:

换个表达形式就会明朗很多,如下:

我们最终求的p(类别|特征)即可!就相当于完成了我们的任务。

代码实例

下面以女生找对象举例,提取除女生找对象的几个关键特征,比如颜值,性格,身高,上进心,资产情况为择偶特征,通过事先调研等手段,获取一部分数据样本,即各类特征以及择偶结果(分类)数据集。根据数据集利用朴素贝叶斯函数计算出个各个特征集合在该分类下的值,结果值最大的分类,认为该数据属于这个分类。由于这个是利用概率学去计算得出的,不一定十分准确,数据集样本数据越大,准确率就越高。

数据集data.txt

下面数据集每行代码一条样本数据,每条数据中的具体特征用逗号“,” 分割,特征顺寻依次为

颜值,性格,身高,上进心,资产情况,女生中意结果

帅,好,高,上进,有钱,中意
不帅,好,高,上进,有钱,中意
帅,不好,高,上进,有钱,中意
帅,好,不高,上进,有钱,中意
帅,好,高,不上进,有钱,中意
帅,好,高,上进,不有钱,中意
帅,好,不高,不上进,有钱,不中意
不帅,不好,不高,上进,有钱,中意
不帅,不好,不高,上进,不有钱,不中意
帅,好,不高,上进,不有钱,中意
不帅,好,高,不上进,有钱,不中意
帅,不好,高,上进,有钱,不中意
不帅,好,高,上进,有钱,不中意
帅,不好,高,上进,不有钱,中意
帅,不好,高,不上进,有钱,中意
帅,好,高,上进,不有钱,不中意
帅,不好,不高,不上进,不有钱,不中意
不帅,不好,不高,不上进,不有钱,不中意
帅,好,不高,上进,有钱,中意
不帅,不好,不高,不上进,有钱,不中意
帅,好,高,上进,不有钱,中意
帅,好,不高,不上进,有钱,中意
帅,好,高,不上进,不有钱,不中意
帅,不好,高,不上进,有钱,不中意

代码实现

 
 
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.*;
import java.util.stream.Collectors;
 

public class NaiveBayesModel {
 
    //样本数据
    private static List<List<String>> data = new ArrayList<>();
    //样本数据
    private static Set<List<String>> dataSet = new HashSet<>();
    //分类模型
    public static Map<String,String> modelMap = new HashMap<>();
    //样本数据集
    private static String path = "./class="lazy" data-src/data.txt";
 
    public static void main(String[] args) {
        //训练模型
        trainingModel();
        //识别
        classification("帅","好","高","上进","有钱");
        classification("不帅","不好","不高","不上进","不有钱");
    }
 
    
    public static void readData(String path){
        List<String> row = null;
        try {
            InputStreamReader isr = new InputStreamReader(new FileInputStream(new File(path)));
            BufferedReader br = new BufferedReader(isr);
            String str = null;
            while((str = br.readLine()) != null){
                row = new ArrayList<>();
                String[] str1 = str.split(",");
                for(int i = 0; i < str1.length ; i++) {
                    row.add(str1[i]);
                }
                dataSet.add(row);
                data.add(row);
            }
            br.close();
            isr.close();
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("读取文件内容出错!");
        }
    }
 
    public static void trainingModel() {
        readData(path);
        String category1="中意";
        String category2="不中意";
        dataSet.forEach(e->{
          double categoryP1=  calculateBayesian(e.get(0),e.get(1),e.get(2),e.get(3),e.get(4),category1);
          double categoryP2=  calculateBayesian(e.get(0),e.get(1),e.get(2),e.get(3),e.get(4),category2);
            String result=categoryP1>categoryP2?category1:category2;
            modelMap.put(e.get(0)+"-"+e.get(1)+"-"+e.get(2)+"-"+e.get(3)+"-"+e.get(4),result);
        });
    }
 
    
    public static void  classification(String look, String character, String height, String progresses, String wealthy){
        String key=look+"-"+character+"-"+height+"-"+progresses+"-"+wealthy;
        String result=modelMap.get(key);
        System.out.println("特征为"+look+","+character+","+height+","+progresses+","+wealthy+"的对象,女生"+result);
    }
 
 
    
    public static double calculateBayesian(String look, String character, String height, String progresses, String wealthy,String category) {
        //获取P(x|y)的分母
      //  double denominator = getDenominator(look,character,height,progresses,wealthy);
        //获取P(x|y)的分子
        double molecule = getMolecule(look,character,height,progresses,wealthy,category);
        return molecule/1;
    }
 
    
    public static double getMolecule(String look, String character, String height, String progresses, String wealthy,String category) {
        double resultCP = getProbability(5, category);
        double lookCP = getProbability(0, look, category);
        double characterCP = getProbability(1, character, category);
        double heightCP = getProbability(2, height, category);
        double progressesCP = getProbability(3, progresses, category);
        double wealthyCP = getProbability(4, wealthy, category);
        return lookCP * characterCP * heightCP * progressesCP * wealthyCP * resultCP;
 
    }
 
    
    public static double getDenominator(String look, String character, String height, String progresses, String wealthy) {
        double lookP = getProbability(0, look);
        double characterP = getProbability(1, character);
        double heightP = getProbability(2, height);
        double progressesP = getProbability(3, progresses);
        double wealthyP = getProbability(4, wealthy);
        return lookP * characterP * heightP * progressesP * wealthyP;
    }
 
 
    
    private static double getProbability(int index, String feature) {
        int size = data.size();
        int num = 0;
        for (int i = 0; i < size; i++) {
            if (data.get(i).get(index).equals(feature)) {
                num++;
            }
        }
        return (double) num / size;
    }
 
    
    private static double getProbability(int index, String feature, String category) {
        List<List<String>> filterData=data.stream().filter(e -> e.get(e.size() - 1).equals(category)).collect(Collectors.toList());
        int size =filterData.size();
        int num = 0;
        for (int i = 0; i < size; i++) {
            if (data.get(i).get(index).equals(feature)) {
                num++;
            }
        }
        return (double) num / size;
    }
}

输出结果

使用场景

比如网站垃圾信息分类,文章自动分类,网站垃圾邮件分类,文件分类等。

以反垃圾啊邮件为例说明分类算法的使用,先将批量已经分类的邮件样本(如5000封正常的邮件,2000封垃圾邮件),输入分类算法进行训练,得到一个垃圾邮件分类模型,然后利用分类算法结合分类模型对待处理邮件进行分类识别。

根据已经分类的样本信息提取出一组特征信息的概率,比如邮件中“信用卡”这个词出现在垃圾邮件的中的概率为20%,在非垃圾邮件的概率为1%,就得到一个分类模型。然后从待识别处理的邮件中提取特征值,结合分类模型,就可以判断其分类是不是垃圾邮件。由于贝叶斯算法得到的分类判断是概率值,所以可能会出现误判。

以上就是Java利用朴素贝叶斯分类算法实现信息分类的详细内容,更多关于Java 信息分类的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java利用朴素贝叶斯分类算法实现信息分类

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

朴素贝叶斯和半朴素贝叶斯(AODE)分类器Python实现

  一、概述  机器学习最后一次实验,要求实现朴素贝叶斯和AODE的半朴素贝叶斯分类器。由于老师说可以调用现成的相关机器学习的库,所以我一开始在做朴素贝叶斯分类器的时候,直接调用了sklearn库,很方便,可是问题来了,在做AODE半朴素贝
2023-06-02

web算法中朴素贝叶斯如何实现文档分类

本篇内容主要讲解“web算法中朴素贝叶斯如何实现文档分类”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“web算法中朴素贝叶斯如何实现文档分类”吧!  作业要求:  实验数据在bayes_data
2023-06-02

Python编程之基于概率论的分类方法:朴素贝叶斯

概率论啊概率论,差不多忘完了。 基于概率论的分类方法:朴素贝叶斯 1. 概述 贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类。本章首先介绍贝叶斯分类算法的基础——贝叶斯定理。最后,我们通过实例来讨论贝叶斯分
2022-06-04

Python如何通过朴素贝叶斯和LSTM分别实现新闻文本分类

这篇文章主要介绍Python如何通过朴素贝叶斯和LSTM分别实现新闻文本分类,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!数据处理与分析本次大赛提供的材料是由csv格式编写,只需调用python中的pandas库读取
2023-06-22

discuz x2.0 DIY页面调用分类信息的实现方法

在使用Discuz过程中,很多朋友会遇到一个问题,DIY页面如何调用分类信息呢,这个问题也曾经困扰过我,经过http://www.cppcns.com研究发现了调用的方法,现在就分享给大家。第一步,要在论坛后台设置好分类信息,这里就不详细讲
2022-06-12

Python利用scikit-learn实现近邻算法分类的示例详解

scikit-learn已经封装好很多数据挖掘的算法,这篇文章就来用scikit-learn实现近邻算法分类,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
2023-02-28

如何用K-means算法的Java实现聚类分析681个三国武将

如何用K-means算法的Java实现聚类分析681个三国武将,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。一,k-means算法介绍:k-means算法接受输入量 k ;然后
2023-06-17

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录