目录

0. 前言

1. 条件概率

2. 朴素贝叶斯(Naive Bayes)

3. 朴素贝叶斯应用于文本分类

4. 实战案例

4.1. 垃圾邮件分类案例


学习完机器学习实战的朴素贝叶斯,简单的做个笔记。文中部分描述属于个人消化后的理解,仅供参考。

所有代码和数据可以访问 我的 github

如果这篇文章对你有一点小小的帮助,请给个关注喔~我会非常开心的~

0. 前言

贝叶斯算法,是一类基于概率论的分类方法。朴素贝叶斯(Naive Bayes),是采取了贝叶斯最原始、最简单的假设的算法。

朴素贝叶斯算法给出实例属于各个类别的概率,然后选择概率最大的一类。贝叶斯决策理论的核心思想是选择具有最高概率的决策。

  • 优点:在数据较少的情况下,仍然十分有效果
  • 缺点:对于输入数据的准备方式比较敏感
  • 适用数据类型:标称型数据

朴素贝叶斯假设:

  1. 所有特征都是独立的(即每个特征出现的可能性与其他特征无关)
  2. 每个特征都是同等重要的

1. 条件概率

 称为事件  的概率。 称为在事件  发生的情况下,事件  的概率,这就是条件概率。根据概率论,给出以下的定义:

为了计算  ,我们可以设法通过计算  来得到。

2. 朴素贝叶斯(Naive Bayes)

假设类别为  ,测试样本为  ,要计算  ,可以通过计算  ,因为假设各个特征独立,所以有:

其概率,等于各个特征在此类别前提下的概率之积。

  •  :属于不同类别的计算公式中, 为分母相同,可以不计算
  •  :为训练集中,第  个类别的概率,即第  个类别的频率(出现的样本数/总样本数)
  •  :为训练集属于第  个类别的样本中,第   个特征的概率,即第   个特征的频率(特征出现的次数/总特征数)

通过以上可得出朴素贝叶斯分类器,对于测试样本  ,只需将每个特征的特征值与对应特征的概率相乘,就可得到  ,特征值相当于一个权重。

3. 朴素贝叶斯应用于文本分类

在文本分类中,特征值的选取可有两种:

  • 词集模型(set-of-words model):只判断这个词汇是否出现,即只有  和 
  • 词袋模型(bag-of-words model):判断这个词汇出现的次数

算法可根据以下步骤进行,其他应用场合也可参考:

  1. 将训练集中所有文本的单词拆分出来,去重,获得词汇表
  2. 根据词汇表(特征),对每个文本提取特征值,将文本转换为向量
  3. 计算  和 
  4. 将测试文本转换为向量
  5. 将向量的每一个元素与对应的概率相乘,即第  个元素的特征值乘以 
  6. 计算出每一个类别的  ,选择最大概率的类别,作为分类结果

4. 实战案例

以下将展示书中案例的代码段,所有代码和数据可以在github中下载:

4.1. 垃圾邮件分类案例

# coding:utf-8
from numpy import *
import re"""
垃圾邮件分类案例
"""# 根据所有样本集合创建词汇表
def createVocabList(dataSet):vocabSet = set()for document in dataSet:# 集合求并集vocabSet = vocabSet | set(document)return list(vocabSet)# 通过词汇表,文本转换为向量
# 词集模型(每个词只记录是否有出现)
def setOfWords2Vec(vocabList, inputSet):returnVec = [0] * len(vocabList)for word in inputSet:if word in vocabList:returnVec[vocabList.index(word)] = 1return returnVec# 通过词汇表,文本转换为向量
# 词袋模型(每个词记录出现的次数)
def bagOfWords2VecMN(vocabList, inputSet):returnVec = [0] * len(vocabList)for word in inputSet:if word in vocabList:returnVec[vocabList.index(word)] += 1return returnVec# 训练NB分类器
def trainNB0(trainMatrix, trainCategory):# 文档数量numTrainDocs = len(trainMatrix)# 向量中特征(单词)的数量numWords = len(trainMatrix[0])# 类别1占总文档的比例pAbusive = sum(trainCategory) / float(numTrainDocs)# 为防止再之后计算过程中某一个特征的概率为0,导致总的概率为0,不采用以下# p0Num = zeros(numWords)# p1Num = zeros(numWords)# p0Denom = 0.0# p1Denom = 0.0p0Num = ones(numWords)p1Num = ones(numWords)p0Denom = 2.0p1Denom = 2.0# 遍历每一个文本向量for i in range(numTrainDocs):# 如果向量属于类别1if trainCategory[i] == 1:# 通过向量,计算文档每个词汇的出现次数p1Num += trainMatrix[i]# 计算类别1中,单词的总数量p1Denom += sum(trainMatrix[i])else:p0Num += trainMatrix[i]p0Denom += sum(trainMatrix[i])# 类别1中,每个单词出现的次数/总单词数=每个单词的出现比例# 为防止数值太小,对其取Logp1Vect = log(p1Num / p1Denom)p0Vect = log(p0Num / p0Denom)return p0Vect, p1Vect, pAbusive# 分类算法
def classifyNB(vec2Classify, p0Vec, p1Vec, pClass1):# 因为 p1Vec 取过对数,log(x1)+...+log(xn)=log(x1*...*xn) 等于乘积p1 = sum(vec2Classify * p1Vec) + log(pClass1)p0 = sum(vec2Classify * p0Vec) + log(1 - pClass1)if p1 > p0:return 1else:return 0# 文件解析
def textParse(bigString):listOfTokens = re.split('\W+', bigString)return [tok.lower() for tok in listOfTokens if len(tok) > 2]# 获取高频的前30个词汇
def calcMostFreq(vocabList, fullText):freqDict = {}# 遍历词汇表中的每一个词for token in vocabList:freqDict[token] = fullText.count(token)# 排序sortedFreq = sorted(freqDict.items(), key=lambda item: item[1], reverse=True)return sortedFreq[:30]# 垃圾邮件测试
def spamTest():docList = []classList = []fullText = []# 遍历正的数据源和反的数据源for i in range(1, 26):wordList = textParse(open('email/spam/%d.txt' % i).read())docList.append(wordList)fullText.extend(wordList)classList.append(1)wordList = textParse(open('email/ham/%d.txt' % i).read())docList.append(wordList)fullText.extend(wordList)classList.append(0)# 创建词汇表vocabList = createVocabList(docList)# 获取高频词汇top30Words = calcMostFreq(vocabList, fullText)# 去除高频词汇,因高频词汇很可能是冗余词汇for pairW in top30Words:if pairW[0] in vocabList:vocabList.remove(pairW[0])trainingSet = list(range(50))testSet = []# 选择测试向量for i in range(10):randIndex = int(random.uniform(0, len(trainingSet)))testSet.append(trainingSet[randIndex])del (trainingSet[randIndex])trainMat = []trainClasses = []# 创建训练集合for docIndex in trainingSet:# 将文本集合转换为文本向量矩阵trainMat.append(bagOfWords2VecMN(vocabList, docList[docIndex]))trainClasses.append(classList[docIndex])# p0V: 类别0中,每个词汇出现的比例# p1V: 类别1中,每个词汇出现的比例# pSpam: 类别1的文本数量占总文本数量的比例p0V, p1V, pSpam = trainNB0(array(trainMat), array(trainClasses))correctCount = 0for docIndex in testSet:wordVector = bagOfWords2VecMN(vocabList, docList[docIndex])if classifyNB(array(wordVector), p0V, p1V, pSpam) == classList[docIndex]:correctCount += 1print('the correct rate is: ', float(correctCount) / len(testSet))return vocabList, p0V, p1V# 获取最具表征性的词汇
def getTopWords(vocabList, p0V, p1V):top0 = []top1 = []for i in range(len(p0V)):if p0V[i] > -6.0:top0.append((vocabList[i], p0V[i]))if p1V[i] > -6.0:top1.append((vocabList[i], p1V[i]))sorted0 = sorted(top0, key=lambda pair: pair[1], reverse=True)print("***** 0 *****")for item in sorted0:print(item[0])sorted1 = sorted(top1, key=lambda pair: pair[1], reverse=True)print('***** 1 *****')for item in sorted1:print(item[0])if __name__ == '__main__':vocabList, p0V, p1V = spamTest()# getTopWords(vocabList, p0V, p1V)

如果这篇文章对你有一点小小的帮助,请给个关注喔~我会非常开心的~

机器学习实战(三)朴素贝叶斯NB(Naive Bayes)相关推荐

  1. 垃圾邮件分类快速理解机器学习中的朴素贝叶斯(Naive Bayes)

    贝叶斯方法是一个历史悠久,有着坚实的理论基础的方法,同时处理很多问题时直接而又高效,很多高级自然语言处理模型也可以从它演化而来.因此,学习贝叶斯方法,是研究自然语言处理问题的一个非常好的切入口. 其实 ...

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

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

  3. 【机器学习sklearn】高斯朴素贝叶斯 Gaussian naive bayes

    贝叶斯Bayes - Thomas Bayes 前言 一.贝叶斯决策论(Bayesian decision theory) 二.实例:高斯朴素贝叶斯 Gaussian Naive Bayes (Gau ...

  4. python机器学习-朴素贝叶斯(Naive Bayes)模型建立及评估(完整代码+实现效果)

    实现功能: python机器学习-朴素贝叶斯(Naive Bayes)模型建立及评估. 实现代码: # 导入需要的库 from warnings import simplefilter simplef ...

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

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

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

    文章目录 一.朴素贝叶斯 二.基于贝叶斯决策理论的分类方法 三.数学知识准备 3.1 条件概率 3.2 全概率公式 3.3 贝叶斯推断 四.使用条件概率来分类 五.文本分类 5.1 从文本中构建词向量 ...

  7. 朴素贝叶斯(naive bayes)原理小结

    朴素贝叶斯(naive bayes)原理小结 1. 朴素贝叶斯的学习 1.1 基本假设:条件独立性 1.2 朴素贝叶斯分类器 1.3 后验概率的含义 2. 参数估计 2.1 极大似然估计 2.2 贝叶 ...

  8. 朴素贝叶斯(Naive Bayes):鸢尾花分类项目(不调库,手工推)

    一.数据来源 1.数据来源:kaggle 2.数据样式 通过对数据"萼片.花瓣的长度.宽度(sepal_length.sepal_width.petal_length.petal_width ...

  9. 朴素贝叶斯(Naive Bayes)(原理+Python实现)

    朴素贝叶斯(Naive Bayes)(原理+Python实现) 创作背景 算法分类 生成类算法 判别类算法 区别 知识补充 朴素贝叶斯算法 举个栗子 求解思路 求解过程(数学计算) 代码实现 自己实现 ...

  10. 朴素贝叶斯(Naive Bayes)分类和Gaussian naive Bayes

    朴素贝叶斯(Naive Bayes)   参考资料:https://www.cnblogs.com/pinard/p/6069267.html   朴素贝叶斯最关键的就是 (强制认为每种指标都是独立的 ...

最新文章

  1. 关于如何使用机器学习来做异常检测的7个问题
  2. 枚举可以被子类化以添加新元素吗?
  3. leetcode 925. 长按键入
  4. 一天1个机器学习知识点(二)
  5. java日期类的计算问题_java日期计算(Calendar类)
  6. android初学之退出应用程序
  7. 项目管理其实可以简单一点——任务分工
  8. Java中的Volatile如何工作? Java中的volatile关键字示例
  9. linux 进程调度源码分析,Linux调度器源码分析
  10. 图解Android 内存分析工具之Mat使用教程
  11. 读大师的书 说自己的话——《传世经典书丛评注版》邀你来点评
  12. go语言导出oracle数据,Go语言导出内容到Excel的方法
  13. 既然谭浩强的C语言教材不好,那应该选什么书作C语言教材?
  14. LDA模型困惑度计算出现的问题
  15. HDU - 2534 Score (数学,找规律)
  16. SSL证书中DV证书、OV证书和EV证书的区别
  17. 记第一次挖洞交洞历程
  18. android 备份 通信录,如何简单备份手机通讯录?
  19. Python sklearn 分类效果评估
  20. 微信6个新表情衍生职场好戏,『程序员』版也太太太真实了吧……

热门文章

  1. 自我介绍(老师作业,大神自行忽略)
  2. 使用Python+md5删除本地重复(同一张不重名)的照片
  3. 20190228 搭建Hadoop基础环境
  4. P3160 [CQOI2012]局部极小值
  5. eclipse中使用Lombok(转)
  6. 微信小程序 drawImage 问题
  7. ORACLE PL/SQL 实例精解之第二章 通用编程语言基础
  8. 2016/06/11
  9. C语言中,两整数相除,若分母为零,则会出现怎样的结果???
  10. ThinkPHP源码学习之一