简介

贝叶斯分类算法是一大类分类算法的总称

贝叶斯分类算法以样本可能属于某类的概率来作为分类依据

朴素贝叶斯分类算法是贝叶斯分类算法中最简单的一种

注:朴素的意思是条件概率独立性

此处要想真正理解,需要有概率论的基础知识

P(A|x1x2x3x4)=p(A|x1)*p(A|x2)p(A|x3)p(A|x4)则为条件概率独立

P(xy|z)=p(xyz)/p(z)=p(xz)/p(z)*p(yz)/p(z)

算法

如果一个事物在一些属性条件发生的情况下,事物属于A的概率大于属于B的概率,则判定事物属于A

公式

步骤

1、分解各类先验样本数据中的特征

2、计算各类数据中,各特征的条件概率

(比如:特征1出现的情况下,属于A类的概率p(A|特征1),属于B类的概率p(B|特征1),属于C类的概率p(C|特征1)......)

3、分解待分类数据中的特征(特征1、特征2、特征3、特征4......)

4、计算各特征的各条件概率的乘积,如下所示:

判断为A类的概率:p(A|特征1)*p(A|特征2)*p(A|特征3)*p(A|特征4).....

判断为B类的概率:p(B|特征1)*p(B|特征2)*p(B|特征3)*p(B|特征4).....

判断为C类的概率:p(C|特征1)*p(C|特征2)*p(C|特征3)*p(C|特征4).....

5、结果中的最大值就是该样本所属的类别

代码

object NaiveBayes {
  /**
    * 先验数据
    */
  def dataSet(): (Array[Array[String]], Array[Int]) ={
    val dataList = Array(Array("my", "dog", "has", "flea", "problems", "help", "please"),
      Array("maybe", "not", "take", "him", "to", "dog", "park", "stupid"),
      Array("my", "dalmation", "is", "so", "cute", "I", "love", "him"),
      Array("stop", "posting", "stupid", "worthless", "garbage"),
      Array("mr", "licks", "ate", "my", "steak", "how", "to", "stop", "him"),
      Array("quit", "buying", "worthless", "dog", "food", "stupid"))
    //分类
    val dataType=Array(0, 1, 0, 1, 0, 1)
    (dataList,dataType)
  }

/**
    * 设置分类
    * @param dataList 数据集合
    * @param inputSet 输入类型
    */
  def setWordsType(dataList:Array[String],inputSet:Array[String]): Array[Int] ={
    /***
      *  先验数据
      *  ArrayBuffer(quit, buying, worthless, dog, food, stupid, mr, licks, ate, my, steak, how, to, stop, him, posting, garbage, dalmation, is, so, cute, I, love, maybe, not, take, park, has, flea, problems, help, please)
      *  ArrayBuffer(quit, buying, worthless, dog, food, stupid, mr, licks, ate, my, steak, how, to, stop, him, posting, garbage, dalmation, is, so, cute, I, love, maybe, not, take, park, has, flea, problems, help, please)
      *  ArrayBuffer(quit, buying, worthless, dog, food, stupid, mr, licks, ate, my, steak, how, to, stop, him, posting, garbage, dalmation, is, so, cute, I, love, maybe, not, take, park, has, flea, problems, help, please)
      *  ArrayBuffer(quit, buying, worthless, dog, food, stupid, mr, licks, ate, my, steak, how, to, stop, him, posting, garbage, dalmation, is, so, cute, I, love, maybe, not, take, park, has, flea, problems, help, please)
      *  ArrayBuffer(quit, buying, worthless, dog, food, stupid, mr, licks, ate, my, steak, how, to, stop, him, posting, garbage, dalmation, is, so, cute, I, love, maybe, not, take, park, has, flea, problems, help, please)
      *  ArrayBuffer(quit, buying, worthless, dog, food, stupid, mr, licks, ate, my, steak, how, to, stop, him, posting, garbage, dalmation, is, so, cute, I, love, maybe, not, take, park, has, flea, problems, help, please)
      *
      *
      */
    val returnList=new Array[Int](dataList.length)
    val dataIndex = dataList.zipWithIndex
    for(word <- inputSet){
      if(dataList.contains(word)){
        //println(dataIndex.filter(_._1 == word).toBuffer)
        //与inputSet数据相等的为1
        returnList(dataIndex.filter(_._1 == word)(0)._2) = 1
      }else {
        println("the word: %s is not in my Vocabulary!\n",word)
      }
    }
    returnList
  }

/**
    * 先验数据
    * @param trainData 训练数据
    * @param trainType 训练类型
    */
  def trainSet(trainData:Array[Array[Int]],trainType:Array[Int]): (Array[Double], Array[Double], Double) ={
    /**
      * 0 = {int[32]@797}
      * 1 = {int[32]@798}
      * 2 = {int[32]@799}
      * 3 = {int[32]@800}
      * 4 = {int[32]@801}
      * 5 = {int[32]@802}
      *
      *  ArrayBuffer(0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1)
      *  ArrayBuffer(0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0)
      *  ArrayBuffer(0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0)
      *  ArrayBuffer(0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
      *  ArrayBuffer(0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
      *  ArrayBuffer(1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
      *
      */
    val trainLength=trainData.length
    val wordsNum=trainData(0).length
    //每个分类的概率,这里分类只有0/1,所以只返回一个类别1的概率
    val pType=trainType.sum/trainLength.toDouble
    var p0Num=Array.fill(wordsNum)(1)
    var p1Num=Array.fill(wordsNum)(1)

var p0Denom = 2.0
    var p1Denom = 2.0

/**
      * for 循环 0~5
      * p0Denom:2.0
        p1Denom:2.0
        p0Denom:9.0
        p1Denom:2.0
        p0Denom:9.0
        p1Denom:10.0
        p0Denom:17.0
        p1Denom:10.0
        p0Denom:17.0
        p1Denom:15.0
        p0Denom:26.0
        p1Denom:15.0
      */
    for (i <- 0 until trainLength) {

if (trainType(i) == 1) {
        var cnt = 0
        //
        p1Num = p1Num.map { x =>
          val v = x + trainData(i)(cnt)
          cnt += 1
          v
        }
        p1Denom += trainData(i).sum
      } else {
        var cnt = 0
        p0Num = p0Num.map { x =>
          val v = x + trainData(i)(cnt)
          cnt += 1
          v
        }
        p0Denom += trainData(i).sum
      }
    }
    /**
      * p1Num
      * ArrayBuffer(2, 2, 3, 3, 2, 4, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 1)
      * p1Denom 21.0
      *
      * p0Num
      * ArrayBuffer(1, 1, 1, 2, 1, 1, 2, 2, 2, 4, 2, 2, 2, 2, 3, 1, 1, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 2)
      * p0Denom 26.0
      */
    (p1Num.map(x => Math.log(x / p1Denom)), p0Num.map(x => Math.log(x / p0Denom)), pType)

}

def classifyNB(vec2Classify: Array[Int], p0Vec: Array[Double], p1Vec: Array[Double], pClass1: Double): Int = {
    var cnt = 0
    val p1 = vec2Classify.map { x =>
      val v = x * p1Vec(cnt)
      cnt += 1
      v
    }.sum + math.log(pClass1)
    cnt = 0
    val p0 = vec2Classify.map { x =>
      val v = x * p0Vec(cnt)
      cnt += 1
      v
    }.sum + math.log(1.0 - pClass1)
    //log(p(w/c0)p(c0))=log(p(w/c0))+log(p(c0))= sum(vec2Classify * p0Vec) + log(1.0 - pClass1)
    if (p1 > p0) 1 else 0
  }

def main(args: Array[String]): Unit = {
    val DataSet = dataSet()
    val listOPosts = DataSet._1
    val listClasses = DataSet._2
    val myVocabList = listOPosts.reduce((a1, a2) => a1.++:(a2)).distinct
    /**
      * myVocabList的数据
      * ArrayBuffer(quit, buying, worthless, dog, food, stupid, mr, licks, ate, my, steak, how, to, stop, him, posting, garbage, dalmation, is, so, cute, I, love, maybe, not, take, park, has, flea, problems, help, please)
      */
    var trainMat = new ArrayBuffer[Array[Int]](listOPosts.length)
    listOPosts.foreach(postinDoc => trainMat.append(setWordsType(myVocabList, postinDoc)))

//训练集
    val p = trainSet(trainMat.toArray, listClasses)
    val p0V = p._2
    val p1V = p._1
    val pAb = p._3
    val testEntry = Array("love", "my", "dalmation")
    val thisDoc = setWordsType(myVocabList, testEntry)
    println(testEntry.mkString(",") + " classified as: " + classifyNB(thisDoc, p0V, p1V, pAb))
    val testEntry2 = Array("stupid", "garbage")
    val thisDoc2 = setWordsType(myVocabList, testEntry2)
    println(testEntry2.mkString(",") + " classified as: " + classifyNB(thisDoc2, p0V, p1V, pAb))
  }
}

机器学习系列--贝叶斯分类算法相关推荐

  1. 03、机器学习 (贝叶斯分类算法与应用)

    1. 朴素贝叶斯分类算法原理     1.1 概述         贝叶斯分类算法是一大类分类算法的总称         贝叶斯分类算法以样本可能属于某类的概率来作为分类依据         朴素贝叶 ...

  2. 【机器学习算法专题(蓄力计划)】十六、机器学习中贝叶斯分类算法

    文章目录 朴素贝叶斯分类器的三个流程: 贝叶斯原理概念: 贝叶斯分类相关公式: 离散型随机变量 `类条件独立假设` `手写贝叶斯分类` `对于离散值的分类,对于连续值的分类` `Sklearn提供了3 ...

  3. 机器学习之贝叶斯分类算法(nlp)

    一.贝叶斯公式 条件概率 由上式进一步推导 由此,推广到随机变量的范畴,设 X,Y 为两个随机变量,得到贝叶斯公式: X可以当作实际输入的数据 ,Y是所需要预测的类别 二.朴素贝叶斯算法的优缺点 1. ...

  4. 机器学习算法系列(十三)-朴素贝叶斯分类算法(Naive Bayes Classifier Algorithm)

    阅读本文需要的背景知识点:一丢丢编程知识 一.引言   前面几节介绍了一类分类算法--线性判别分析.二次判别分析,接下来介绍另一类分类算法--朴素贝叶斯分类算法1 (Naive Bayes Class ...

  5. 机器学习系列-强填EM算法在理论与工程之间的鸿沟(下)

    前言 在上一篇文章<机器学习系列-强填EM算法在理论与工程之间的鸿沟(上)>中,小夕用优(恐)雅(怖)的数学理论来向读者解释了EM算法的工作原理.那么从工程角度出发的EM算法又是怎样的呢? ...

  6. 机器学习系列之EM算法

    机器学习系列之EM算法 我讲EM算法的大概流程主要三部分:需要的预备知识.EM算法详解和对EM算法的改进. 一.EM算法的预备知识 1.极大似然估计 (1)举例说明:经典问题--学生身高问题 我们需要 ...

  7. k近邻法matlab_机器学习系列(一)K近邻算法(KNN,KNearestNeigh

    本文源自微信公众号[Python编程和深度学习]原文链接:机器学习系列(一)K-近邻算法(KNN,K-Nearest-Neighbor),欢迎扫码关注鸭! 目录 一.算法概述 二.Python代码 三 ...

  8. 《机器学习系列-强填EM算法在理论与工程之间的鸿沟(上)》

    小夕曾经问一位做机器学习理论的学姐:"学姐学姐,EM算法是什么呢?" 学姐回答:"EM算法啊,就是解决包含隐变量的参数估计问题." 小夕: 然后小夕去问一位做工 ...

  9. 机器学习系列------1. GBDT算法的原理

    GBDT算法是一种监督学习算法.监督学习算法需要解决如下两个问题: 1.损失函数尽可能的小,这样使得目标函数能够尽可能的符合样本 2.正则化函数对训练结果进行惩罚,避免过拟合,这样在预测的时候才能够准 ...

最新文章

  1. LeetCode简单题之字符串中的单词数
  2. 基于高德地图Windows Phone API 快速开发地图相关APP(二)
  3. JS实现select去除option的使用注意事项
  4. “不一样”的真实渗透测试案例分析
  5. centos8中一键安装Nginx
  6. 搭建集群时的问题总结
  7. dp主机_MODBUS 和 PROFIBUS-DP 协议有什么区别
  8. 牛牛和牛可乐的赌约2
  9. VB 两种方法建立多级目录
  10. .net vue漂亮登录界面_一文弄懂前端框架Vue 的核心——数据绑定,为升职涨薪加分
  11. php开源源码管理后台小程序团购,秒杀,分销 高可用
  12. XTU 1205 Range
  13. 【图解算法】彻底搞懂(括号匹配)——图解带你直击本质
  14. WBS(Work Breakdown Structure)
  15. 学计算机i58300够用嘛,酷睿i58300h处理器怎么样
  16. 黑马程序员----------Java新特性反射 泛型
  17. Aras innovator: 怎样把excel文件导入到Aras数据库
  18. 一个亿万富翁的创业自述
  19. oracle 中int字节,oracle 数据类型
  20. python中os库用法详解(总结)

热门文章

  1. python读取rtsp流_python cv2读取rtsp实时码流按时生成连续视频文件方式
  2. 智慧物流打造海尔集团核心竞争力
  3. Oracle EBS NETSUITE,在SAP与Oracle夹缝中成长的NetSuite
  4. 阿里云开放搜索很强大
  5. Linux安装Elasticsearch(手把手入门教程及下载资源)
  6. 十、软件项目开发总结报告-模板
  7. [置顶] iphone 软解那点事 (二)
  8. 基于PPT的三维光路结构示意图绘制实例演示-技术细节
  9. 驾考一点通 android
  10. 多国首脑圆桌聚餐报道