贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类。而朴素贝叶斯分类是贝叶斯分类中最简单,也是常见的一种分类方法。

它的核心算法就是下面这个贝叶斯公式:

换个表达形式,如下:

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

    @Overridepublic void buildClassifier(Instances data) throws Exception {//检测分类器能否处理数据getCapabilities().testWithFail(data);//删除具有类别缺失值的实例data=new Instances(data);data.deleteWithMissingClass();//保存类别的数量m_NumClasses=data.numClasses();//复制训练集m_Instances=new Instances(data);//如果指定,就对数据进行离散化if(m_UseDiscretization){m_Disc=new weka.filters.supervised.attribute.Discretize();m_Disc.setInputFormat(data);m_Instances=weka.filters.Filter.useFilter(m_Instances, m_Disc);}else{m_Disc=null;}//为概率分布预留空间//类别条件概率分布P(X|Y)m_Distributions=new Estimator[m_Instances.numAttributes()-1][m_Instances.numClasses()];//类别分布P(Y)m_ClassDistribution=new DiscreteEstimator(m_Instances.numClasses(), true);int attIndex=0;Enumeration enumeration=m_Instances.enumerateAttributes();//循环处理每一个属性while(enumeration.hasMoreElements()){Attribute attribute=(Attribute) enumeration.nextElement();//如果属性是数值型,根据相邻值之间的差异,测定估计器数值精度double numPrecision=DEFAULT_NUM_PRECISION;if(attribute.type()==Attribute.NUMERIC){//根据当前属性的值对数据集排序m_Instances.sort(attribute);//排序之后,当前属性缺失值的实例就排到最前//这样,判断第一个样本是否有缺失值,就知道整体样本是否有缺失值//如果有,就没有必要执行if后面的代码块if((m_Instances.numInstances()>0) && !m_Instances.instance(0).isMissing(attribute)){//lastVal为后一个实例的当前属性值double lastVal=m_Instances.instance(0).value(attribute);//currentVal,为每个实例的当前属性值,deltaSum为差值double currentVal,deltaSum=0;//distinct为当前属性取不同值的数量int distinct=0;for(int i=1;i<m_Instances.numInstances();i++){Instance currentInst=m_Instances.instance(i);if(currentInst.isMissing(attribute)){break;}currentVal=currentInst.value(attribute);//如果当前值与最后值不相等,则相减并将差值累加到deltaSumif(currentVal!=lastVal){deltaSum+=currentVal-lastVal;lastVal=currentVal;distinct++;}}//最终的numPrecision就是deltaSum/distinctif(distinct>0){numPrecision=deltaSum/distinct;}}}//循环处理每一个类别标签for(int j=0;j<m_Instances.numClasses();j++){//判断当前属性的类型switch(attribute.type()){//如果为连续的数值型属性,根据是否使用核估计器的选项,选择构建Kernelstimator对象还是NormalEstimator对象//两者的构造函数都是使用numPrecision作为参数case Attribute.NUMERIC:if(m_UseKernelEstimator){m_Distributions[attIndex][j]=new KernelEstimator(numPrecision);}else{m_Distributions[attIndex][j]=new NormalEstimator(numPrecision);}break;case Attribute.NOMINAL:m_Distributions[attIndex][j]=new DiscreteEstimator(attribute.numValues(), true);break;default:throw new Exception("Attribute type unkown to my NB");}}attIndex++;}//统计每一个实例Enumeration enumInsts=m_Instances.enumerateInstances();while (enumInsts.hasMoreElements()) {Instance instance=(Instance) enumInsts.nextElement();//调用updateClassifier方法,用实例更新分离器updateClassifier(instance);}//节省空间m_Instances=new Instances(m_Instances,0);}public void updateClassifier(Instance instance) {if(!instance.classIsMissing()){Enumeration enumAtts=m_Instances.enumerateAttributes();int attIndex=0;//循环处理没一个属性while (enumAtts.hasMoreElements()) {Attribute attribute = (Attribute) enumAtts.nextElement();if(!instance.isMissing(attribute)){//m_Distributons第一个下标记为当亲属性下标记,第二个下标为类别值//统计样本实例对应类别属性值的分布//调用Estimator的AddValue方法将新数据值加入到当前评估器中m_Distributions[attIndex][(int)instance.classValue()].addValue(instance.value(attribute),instance.weight());}attIndex++;}//统计类别分布m_ClassDistribution.addValue(instance.classValue(), instance.weight());}}public double[] distributionForInstance(Instance instance) throws Exception{//如果使用useSupervisedDiscretization选项,就对实例进行离散化if(m_UseDiscretization){m_Disc.input(instance);instance=m_Disc.output();}//类别的概率P(Y)double probs[]=new double[m_NumClasses];//循环得到每个类别的概率for(int j=0;j<m_NumClasses;j++){probs[j]=m_ClassDistribution.getProbability(j);}Enumeration enumAtts=instance.enumerateAttributes();int attIndex=0;//循环处理每个属性while(enumAtts.hasMoreElements()){Attribute attribute=(Attribute) enumAtts.nextElement();if(!instance.isMissing(attribute)){//temp为临时概率,max为当前最大概率double temp,max=0;for (int j = 0; j < m_NumClasses; j++){//计算每个类别的条件概率P(X|Y)temp=Math.max(1e-75, Math.pow(m_Distributions[attIndex][j].getProbability(instance.value(attribute)), m_Instances.attribute(attIndex).weight()));probs[j]*=temp;//更新最大概率值if(probs[j]>max){max=probs[j];}if(Double.isNaN(probs[j])){throw new Exception("Nan returned from estimator for atrribute "+attribute.name()+":\n"+m_Distributions[attIndex][j].toString());}}if(max>0 && max<1e-75){//防止概率下溢的危险for(int j=0;j<m_NumClasses;j++){probs[j]*=1e75;}}}attIndex++;}//概率规范化Utils.normalize(probs);return probs;}

weka平台贝叶斯算法相关推荐

  1. WEKA算法开发——记一次不太成功的遗传属性加权贝叶斯算法实验

    WEKA算法开发--记一次不太成功的遗传属性加权贝叶斯算法实验 1. WEKA介绍 2. 使用WEKA开发自己的算法 3. ~~总结~~ 吐槽 1. WEKA介绍 Weka平台是一种数据分析+模式识别 ...

  2. 人工智能知识全面讲解:垃圾邮件克星——朴素贝叶斯算法

    6.1 什么是朴素贝叶斯 6.1.1 一个流量预测的场景 某广告平台接到小明和小李两家服装店的需求,准备在A.B两个线上渠道 投放广告.因为小明和小李两家店都卖女装,属于同一行业相同品类的广告, 所以 ...

  3. 16Python文本数据分析:新闻分类任务 (贝叶斯算法应用实例)

    唐宇迪<python数据分析与机器学习实战>学习笔记 16Python文本数据分析:新闻分类任务 (贝叶斯算法应用实例) ** 一.流程分析 ** 数据如下图:content为主体内容, ...

  4. 机器学习: 贝叶斯算法的应用

    机器学习: 贝叶斯算法的应用 背景 数据集及源码 互联网经济蓬勃发展的背景下,食品经营模式发生了天翻地覆的变化,人们的消费习惯也悄然发生了转变.通过点击手机APP上自己喜欢的食品, 这些食品就能按时准 ...

  5. 基于贝叶斯算法的邮件过滤管理系统的设计和实现(Vue+SpringBoot)

    作者主页:Designer 小郑 作者简介:Java全栈软件工程师一枚,来自浙江宁波,负责开发管理公司OA项目,专注软件前后端开发(Vue.SpringBoot和微信小程序).系统定制.远程技术指导. ...

  6. 朴素贝叶斯算法实现 | Java | 机器学习 | 贝叶斯

    做的一个结课作业,用Java实现了朴素贝叶斯算法 关于贝叶斯算法可以参考西瓜书.贝叶斯分类器-华校专 设计思路 创建数据类.朴素贝叶斯算法类和验证模型的类. 数据类DataFrame,用来加载和存储数 ...

  7. 朴素贝叶斯算法----评论情感分析系统

    文章目录 前言 Step1: 爬取京东评论,作为模型数据集 测试爬虫 爬取6000条好评信息作为数据集,并存储为CSV文件 爬取4000条差评信息作为数据集,并存储为CSV文件 Step2: 读取数据 ...

  8. 贝叶斯算法(3)新闻分类任务实战:jieba中文分词、tfidf特征词提取、wordcloud词云展示、LDA主题建模、朴素贝叶斯算法分析预测

    1 加载数据 import pandas as pd import jieba # 数据源:http://www.sogou.com/labs/resource/ca.phpval_path = '/ ...

  9. 机器学习(8)朴素贝叶斯算法(20条新闻分类)

    目录 一.基础理论 二.实战:20条新闻分类 1.读取数据 2.训练集划分 3.特征工程(文本特征提取) 4.朴素贝叶斯算法训练 5.模型评估 方法一:预测值与真实值比对 方法二:计算准确率 总代码 ...

最新文章

  1. ArduinoYun快速入门教程第1章ArduinoYun概览
  2. 2013计算机视觉代码合集一
  3. Windows 配置 Github 的 SSH-key
  4. 微信不再提供小程序打开App?借助H5为App引流的方式你必须知道!
  5. leetcode题解227-基本计算器 II
  6. oracle查询:分组查询,取出每组中的第一条记录
  7. Ceph分布式存储学习指南1.12 Lustre
  8. Fluke DSX2-5000 CH线缆测试仪技术标书
  9. 智邦科技下一代新技术发布会@MWC上海
  10. 滴滴出行3亿元收购支付牌照 | 地平线发布中国首款嵌入式人工智能视觉芯片 | FF 融资消息不实
  11. Java多线程篇--基本概念
  12. form 表单 发送到邮箱
  13. inventor如何钣金出弧面_Inventor钣金造型教程
  14. 天天基金数据接口的处理
  15. php转换音频采样率,非整数倍SRC采样率转换问题样本试听
  16. 什么是AudioEffect
  17. 在黑马的两个月培训的感受
  18. mysql中表联结_Mysql表联结
  19. python+opencv像素的加减和加权操作
  20. zzulioj:1093: 验证哥德巴赫猜想(函数专题)

热门文章

  1. 技术指标验证试验之KDJ
  2. 漫画 | 什么智商的人才能当程序员?
  3. Python学习笔记4——字典
  4. life:AcFun,我的弹幕站记忆01.
  5. 逻辑回归对信用卡欺诈进行分析
  6. gps校时器(NTP卫星授时服务器)场景应用技术分析
  7. 【矩阵论】Hermite二次型(1)
  8. 【论文复现】ReLU Activation(2011)
  9. 微信小程序 不二博客星球
  10. 驾车时适合听什么音乐, 这几十首适合开车听的歌曲推荐