利用朴素贝叶斯分类方法预测一个数据对象类别,带你理解朴素贝叶斯分类算法

  利用朴素贝叶斯分类方法预测一个数据对象类别,带你理解朴素贝叶斯分类算法

  00-1010贝叶斯分类算法代码实例数据集data.txt代码实现输出结果使用场景

  00-1010贝叶斯分类算法是统计学的一种分类方法,是一种利用概率统计知识的分类算法。在许多场合,朴素贝叶斯(NB)分类算法可以与决策树和神经网络分类算法相比较。该算法适用于大型数据库,具有方法简单、分类精度高、速度快等优点。

  贝叶斯定理假设一个属性值对给定类别的影响独立于其他属性的值,但这种假设在实际情况下往往不成立,因此其分类精度可能下降。因此,许多贝叶斯分类算法,如TAN(tree augmented Bayes network)算法,被用来减少独立性假设。

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

  它是下面的贝叶斯公式:

  换个表达形式就清楚多了,如下:

  我们终于可以找到P(类别特征)了!相当于完成了我们的任务。

  00-1010这里以女生为例,提取除女生外的几个关键特征,比如颜值、性格、身高、上进心、资产作为择偶特征。通过前期研究等手段,获取一些数据样本,即各种特征和择偶结果(分类)数据集。根据数据集,使用朴素贝叶斯函数计算该分类下每个特征集的值。具有最大结果值的分类被认为该数据属于该分类。因为这是按概率计算的,可能不太准确。数据集的样本数据越大,准确率越高。

  00-1010以下数据集每个代码行有一个样本数据,每个数据集中的具体特征用逗号“,”分隔,特征顺序如下

  颜值,性格,身高,上进心,资产,女生喜欢的结果。

  帅,好,高,上进,有钱,对不帅感兴趣,好,高,上进,有钱,对帅感兴趣,不好,高,上进,有钱,对帅感兴趣,好,不高,上进,有钱,对帅感兴趣,好,高,不上进,有钱。有事业心,不富有,对帅感兴趣,好,高,不上进,富有,对帅感兴趣,坏,高,不上进,富有,对帅感兴趣,好,高,上进,富有,对帅感兴趣,不好,高,上进,不富有,对帅感兴趣,不好,高,不上进,富有,个子不高,上进,有钱,对帅感兴趣,不好,个子不高,不上进,有钱,对帅不感兴趣,好,高,上进,不有钱,对帅感兴趣,好,个子不高,不上进,有钱,对帅感兴趣,好,高,不上进,不有钱,对帅不感兴趣,不好,个子高,不上进,有钱,有钱

  

目录

导入Java . io . buffered reader;导入Java . io . file;导入Java . io . file inputstream;导入Java . io . inputstreamreader;导入Java . util . *;导入Java . util . stream . collectors;/* * * @ authorliuya */public类naivebayesmodel {//示例数据私有静态listliststringdata=new ArrayList();//sample data private static set list string dataset=new hashset();//分类模型公共静态mapstring,string模型map=new hashmap();//示例数据集私有静态字符串路径=。/src/data . txt ;public static void main(string[]args){//training model training model();//识别分类(帅,好,高,上进,有钱);分类(不帅,不好,不高,没上进心,不有钱);}/* * *导入数据* @ param path * @ return */public static void读取数据(字符串路径){

 

   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(xy)的分母 // double denominator = getDenominator(look,character,height,progresses,wealthy); //获取P(xy)的分子 double molecule = getMolecule(look,character,height,progresses,wealthy,category); return molecule/1; } /** * 获取p(xy)分子 * @return */ 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; } /** * 获取p(xy)分母 * @return */ 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; } /** * 获取某特征的概率 * @return */ 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; } /** * 获取某类别下某特征的概率 * @return */ 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 信息分类的资料请关注盛行IT其它相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: