朴素贝叶斯是一种基于概率统计的机器学习方法,其原理采用计算样本数据中先验数据与标签数据出现的概率,以先验数据对应最大出现概率的标签作为预测结果。

朴素贝叶斯公式一般记为:P(A|B)=P(A)*P(B|A)/P(B),即当我们要预测先验条件B出现时A出现的概率时,可以通过条件A出现概率与条件A出现时条件B出现概率的乘积除以条件B的概率。在计算中P(A)*P(B|A)等效于计算条件A与条件B同时出现概率,即P(A∩B)。

也就是说,朴素贝叶斯的训练过程主要就是统计条件概率P(B)和联合概率P(A∩B),由于朴素贝叶斯是统计各种条件出现概率,对条件本身数据格式没有具体要求,因此适用于文本型数据的预测,可以应用于邮件过滤、新闻分类等方面。

训练数据由标签和先验条件组成,这里假定一组训练数据,结果标签由1、2、3表示,先验条件假设两个维度,第一个维度由A、B、C、D组成,第二个维度由a、b、c、d组成。

如图:

第一步是读取训练数据,训练数据为csv格式,读取数据时使用逗号分割标签数据和不同维度数据。

读取训练数据:

public List<List<String>> readTrainFile(File trainFile) throws Exception {List<List<String>> resultList = new ArrayList<List<String>>();if (trainFile.exists()) {BufferedReader reader = new BufferedReader(new FileReader(trainFile));String line;while ((line = reader.readLine()) != null) {String[] strings = line.split(",");List<String> lineList = new ArrayList<String>();for (int i = 0; i < strings.length; i++) {lineList.add(strings[i]);}resultList.add(lineList);}reader.close();}return resultList;}

第二步,计算联合概率:

private Map<String, Double> caculateUnionProbability(List<List<String>> trainData) {Map<String, Double> result = new HashMap<String, Double>();int dataSize = trainData.size();double singleProbability = 1 / (double) dataSize;for (int i = 0; i < dataSize; i++) {List<String> line = trainData.get(i);if (null != line) {String key = new String();for(int j = 0; j < line.size(); j++) {key += line.get(j);}if (result.containsKey(key)) {result.put(key, result.get(key) + singleProbability);} else {result.put(key, singleProbability);}}}return result;}

第三步,计算条件概率:

private Map<String, Double> caculateConditionProbability(List<List<String>> trainData) {Map<String, Double> result = new HashMap<String, Double>();int dataSize = trainData.size();double singleProbability = 1 / (double) dataSize;for (int i = 0; i < dataSize; i++) {List<String> line = trainData.get(i);line.remove(0);if (null != line) {String key = new String();for(int j = 0; j < line.size(); j++) {key += line.get(j);}if (result.containsKey(key)) {result.put(key, result.get(key) + singleProbability);} else {result.put(key, singleProbability);}}}return result;}

第四步,将训练结果写入模型文件:

private void writeTrainResult(List<String> tags,Map<String, Double> unionProbability, Map<String, Double> conditionProbability,File resultFile) throws Exception {resultFile.createNewFile();FileWriter writer = new FileWriter(resultFile);for (int i = 0; i < 3; i++) {if (i == 0) {String allTag = new String();for (int j = 0; j < tags.size(); j++) {String tag = tags.get(j);if(j < tags.size() - 1) {allTag += tag + ",";}else {allTag += tag;}}allTag = "tags-" + allTag;writer.write(allTag);writer.write("\r\n");}else if (i == 1) {// 写入联合概率List<String> keyList = new ArrayList<String>();Set<String> keys = unionProbability.keySet();Iterator<String> iterator = keys.iterator();String firstKey = iterator.next();keyList.add(firstKey);while (iterator.hasNext()) {String key = iterator.next();keyList.add(key);}for (int j = 0; j < keyList.size(); j++) {String key = keyList.get(j);Double value = unionProbability.get(key);writer.write(key + "-" + value.toString());writer.write("\r\n");}} else {// 写入条件概率List<String> keyList = new ArrayList<String>();Set<String> keys = conditionProbability.keySet();Iterator<String> iterator = keys.iterator();String firstKey = iterator.next();keyList.add(firstKey);while (iterator.hasNext()) {String key = iterator.next();keyList.add(key);}for (int j = 0; j < keyList.size(); j++) {String key = keyList.get(j);Double value = conditionProbability.get(key);writer.write(key + "-" + value.toString());writer.write("\r\n");}}}writer.close();}

第五步,预测:

public String predict(File resultFile, String conditionB) throws Exception{String result = new String();Map<String, Double> results = new HashMap<String, Double>();String[] conditionAll = getAllCondition(resultFile);//分别计算不同分类对应概率for(int i = 0; i < conditionAll.length; i++) {String condition = conditionAll[i];String unionCondition = condition + conditionB;double res = predictProbability(resultFile, conditionB,unionCondition);results.put(condition, res);}//取出最大概率对应分类作为结果double max = 0;for(int i = 0; i < results.size(); i++) {double res = results.get(conditionAll[i]);if (res > max) {max = res;result = conditionAll[i];}}return result;}
测试:
//测试public static void main(String[] args) throws Exception {NaiveBaysian naiveBaysian = new NaiveBaysian();naiveBaysian.train(new File("C:/Users/admin/Desktop/1.txt"), new File("C:/Users/admin/Desktop/2.bys"));String result = naiveBaysian.predict(new File("C:/Users/admin/Desktop/2.bys"), "Da");System.out.println(result);}

测试中训练模型和预测是一起做的,实际应用中,只需要读取训练好的模型文件,用预测部分代码即可完成朴素贝叶斯的计算。

机器学习入门02-朴素贝叶斯原理和java实现相关推荐

  1. ML————朴素贝叶斯原理和SKlearn相关库

    二师兄养成记正式开始, 以后就写这了.  写的不对的.有疑问的,恳请大佬指出来. 一. 贝叶斯定理 1.  条件概率: P(A | B) = P(A B) / P(B) = P(A U B)/ P(B ...

  2. 机器学习实战之朴素贝叶斯

    机器学习实战之朴素贝叶斯 一.朴素贝叶斯算法概述 1.贝叶斯决策理论 2.条件概率 3.全概率公式 4.贝叶斯推断 5.朴素贝叶斯推断 二.实战 三.总结 1.朴素贝叶斯推断的一些优点: 2.朴素贝叶 ...

  3. 《机器学习实战》朴素贝叶斯

    机器学习实战的朴素贝叶斯一章中的源文件老是提示 IndexError: range object index out of range 看源码里怎么都不会溢出啊,除非minLen为0:所以看了下测试集 ...

  4. 机器学习面试题——朴素贝叶斯

    机器学习面试题--朴素贝叶斯 提示:这些知识点也是大厂笔试经常考的题目,我记得阿里和京东就考!!!想必在互联网大厂就会用这些知识解决实际问题 朴素贝叶斯介绍一下 朴素贝叶斯优缺点 贝叶斯公式 朴素贝叶 ...

  5. 机器学习:基于朴素贝叶斯对花瓣花萼的宽度和长度分类预测

    机器学习:基于朴素贝叶斯对花瓣花萼的宽度和长度分类预测 作者:i阿极 作者简介:Python领域新星作者.多项比赛获奖者:博主个人首页

  6. 机器学习实验:朴素贝叶斯算法

    机器学习实验:朴素贝叶斯算法 问题如下: 根据给出的算法naivebayes.py,实现: 1.将数据集文件naivebayes_data.csv中的数据替换成14天打球与天气数据: 2.预测样本{O ...

  7. 机器学习实战刻意练习 —— Task 02. 朴素贝叶斯

    机器学习实战刻意练习 第 1 周任务   分类问题:K-邻近算法   分类问题:决策树 第 2 周任务   分类问题:朴素贝叶斯   分类问题:逻辑回归 第 3 周任务   分类问题:支持向量机 第 ...

  8. 【机器学习基础】朴素贝叶斯的算法实现

    前言 本次我们将梳理下朴素贝叶斯(Naive Bayes)的相关内容. 本文约1.6k字,预计阅读10分钟. 概要 朴素贝叶斯算法是一种适用于二分类和多分类分类问题的「分类算法」.在贝叶斯概率框架下, ...

  9. 机器学习(六):朴素贝叶斯及拉普拉斯修正

    一.前言 2022年的第一篇博客,<机器学习>这个专栏去年由于自己的时间原因,更新的不勤,乘最近稍微有点时间准备开始陆陆续续更新,今天先来一道开胃菜:带拉普拉斯修正的朴素贝叶斯,话不多说请 ...

最新文章

  1. 刮刮乐html5效果擦除,利用HTML5的画布Canvas实现刮刮卡效果
  2. zedboard嵌入式linux,zedboard构建嵌入式linux
  3. mysql having in_正确理解MySQL中的where和having的区别
  4. 基础拾遗------泛型详解
  5. Windows 容器
  6. 树莓派4bpython串口通信解读数据_树莓派基础实验36:通用串口通信实验
  7. 项目中遇到的所有ECharts图表集合
  8. BZOJ 3231: [Sdoi2008]递归数列
  9. java认证考试(java认证考试报名)
  10. php 开发一元夺宝插件,yiyuanyungou 一元云购商城源码,商用 ci框架开发,带指定中奖插件 Other systems 其他 249万源代码下载- www.pudn.com...
  11. matlab 进行时域分析实验报告,控制系统时域分析实验报告.doc
  12. 欧几里得变换(Euclidean transformation)详解
  13. SLAM基础——李群李代数
  14. lombok get/set 方法未生效,解决办法
  15. 科研日志--python大文件打开内存溢出
  16. vulnhub--Funbox: Scriptkiddie
  17. 【2019蓝桥杯国赛B组】排列数
  18. GPGPU Achitectures阅读笔记 1
  19. 最简单的方式获取ELMo得到的词向量
  20. Linux系统监控——top命令

热门文章

  1. 09.span query 查询
  2. 洛谷——P1019 单词接龙
  3. Android--多个Activity共享Socket--单例模式
  4. 【最详细】数据结构(C语言版 第2版)第六章课后习题答案 严蔚敏 等 编著
  5. 软件测试部分练习题答案
  6. 剑指0ffer04.二维数组中的查找
  7. switch语句格式_JavaScript流程控制语句_if语句(十一)
  8. linux 性能教程,Linux系统下常见性能分析工具的使用
  9. 实验图文详解——apache的编译安装及httpd服务开机自启
  10. Android操作HTTP实现与服务器通信