1. 朴素贝叶斯分类算法原理

1.1 概述

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

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

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

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

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

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)

1.2 算法思想

朴素贝叶斯的思想是这样的:

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

通俗来说比如,你在街上看到一个黑人,我让你猜这哥们哪里来的,你十有八九猜非洲。为什么呢?

在你的脑海中,有这么一个判断流程:

  1. 这个人的肤色是黑色 <特征>
  2. 黑色人种是非洲人的概率最高 <条件概率:黑色条件下是非洲人的概率>
  3. 没有其他辅助信息的情况下,最好的判断就是非洲人

这就是朴素贝叶斯的思想基础。

再扩展一下,假如在街上看到一个黑人讲英语,那我们是怎么去判断他来自于哪里?

提取特征:

肤色: 黑

语言: 英语

黑色人种来自非洲的概率: 80%

黑色人种来自于美国的概率:20%

讲英语的人来自于非洲的概率:10%

讲英语的人来自于美国的概率:90%

在我们的自然思维方式中,就会这样判断:

这个人来自非洲的概率:80% * 10% = 0.08

这个人来自美国的概率:20% * 90% =0.18

我们的判断结果就是:此人来自美国!

其蕴含的数学原理如下:

p(A|xy)=p(Axy)/p(xy)=p(Axy)/p(x)p(y)=p(A)/p(x)*p(A)/p(y)* p(xy)/p(xy)=p(A|x)p(A|y)

朴素贝叶斯分类器

  朴素贝叶斯分类器的表示形式:

  当特征为为x时,计算所有类别的条件概率,选取条件概率最大的类别作为待分类的类别。由于上公式的分母对每个类别都是一样的,因此计算时可以不考虑分母,即

  朴素贝叶斯的朴素体现在其对各个条件的独立性假设上,加上独立假设后,大大减少了参数假设空间。  

1.3 算法要点

1.3.1 算法步骤

  1. 分解各类先验样本数据中的特征
  2. 计算各类数据中,各特征的条件概率

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

  1. 分解待分类数据中的特征(特征1、特征2、特征3、特征4......)
  2. 计算各特征的各条件概率的乘积,如下所示:

判断为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).....

......

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

1.3.2 算法应用举例

大众点评、淘宝等电商上都会有大量的用户评论,比如:

1、衣服质量太差了!!!!颜色根本不纯!!!

2、我有一有种上当受骗的感觉!!!!

3、质量太差,衣服拿到手感觉像旧货!!!

4、上身漂亮,合身,很帅,给卖家点赞

5、穿上衣服帅呆了,给点一万个赞

6、我在他家买了三件衣服!!!!质量都很差!

0

0

0

1

1

0

其中1/2/3/6是差评,4/5是好评

现在需要使用朴素贝叶斯分类算法来自动分类其他的评论,比如:

a、这么差的衣服以后再也不买了

b、帅,有逼格

……

1.3.3 算法应用流程

  1. 分解出先验数据中的各特征

(即分词,比如“衣服”“质量太差”“差”“不纯”“帅”“漂亮”,“赞”……)

  1. 计算各类别(好评、差评)中,各特征的条件概率

(比如 p(“衣服”|差评)、p(“衣服”|好评)、p(“差”|好评) 、p(“差”|差评)……)

  1. 分解出待分类样本的各特征

(比如分解a: “差” “衣服” ……)

  1. 计算类别概率

P(好评) = p(好评|“差”) *p(好评|“衣服”)*……

P(差评) = p(差评|“差”) *p(差评|“衣服”)*……

5、显然P(差评)的结果值更大,因此a被判别为“差评”

2. 朴素贝叶斯分类算法案例1

2.1 需求

客户评论分类:

以在线社区的留言板为例。为了不影响社区的发展,我们要屏蔽侮辱性的言论,所以要构建一个快速过滤器,如果某条留言使用了负面或者侮辱性的语言,那么就将该留言标识为内容不当。过滤这类内容是一个很常见的需求。对此问题建立两个类别:侮辱类和非侮辱类,使用1和0分别标识。

有以下先验数据,使用bayes算法对未知类别数据分类

帖子内容

类别

'my','dog','has','flea','problems','help','please'

0

'maybe','not','take','him','to','dog','park','stupid'

1

'my','dalmation','is','so','cute','I','love','him'

0

'stop','posting','stupid','worthless','garbage'

1

'mr','licks','ate','my','steak','how','to','stop','him'

0

'quit','buying','worthless','dog','food','stupid'

1

待分类数据:

'love','my','dalmation'

?

'stupid','garbage'

?

2.2 模型分析

参见1.3.2

跟1.3.2节中的举例基本一致,中文换成英文即可

2.2 Python实现

(1) 词表到词向量的转换函数

from numpy import *

#过滤网站的恶意留言

# 创建一个实验样本

def loadDataSet():

postingList = [['my','dog','has','flea','problems','help','please'],

['maybe','not','take','him','to','dog','park','stupid'],

['my','dalmation','is','so','cute','I','love','him'],

['stop','posting','stupid','worthless','garbage'],

['mr','licks','ate','my','steak','how','to','stop','him'],

['quit','buying','worthless','dog','food','stupid']]

classVec = [0,1,0,1,0,1]

return postingList, classVec

# 创建一个包含在所有文档中出现的不重复词的列表

def createVocabList(dataSet):

vocabSet = set([])      #创建一个空集

for document in dataSet:

vocabSet = vocabSet | set(document)   #创建两个集合的并集

return list(vocabSet)

#将文档词条转换成词向量

def setOfWords2Vec(vocabList, inputSet):

returnVec = [0]*len(vocabList)        #创建一个其中所含元素都为0的向量

for word in inputSet:

if word in vocabList:

#returnVec[vocabList.index(word)] = 1     #index函数在字符串里找到字符第一次出现的位置  词集模型

returnVec[vocabList.index(word)] += 1      #文档的词袋模型    每个单词可以出现多次

else: print "the word: %s is not in my Vocabulary!" % word

return returnVec

  1. 从词向量计算概率

#朴素贝叶斯分类器训练函数   从词向量计算概率

def trainNB0(trainMatrix, trainCategory):

numTrainDocs = len(trainMatrix)

numWords = len(trainMatrix[0])

pAbusive = sum(trainCategory)/float(numTrainDocs)

# p0Num = zeros(numWords); p1Num = zeros(numWords)

#p0Denom = 0.0; p1Denom = 0.0

p0Num = ones(numWords);   #避免一个概率值为0,最后的乘积也为0

p1Num = ones(numWords);   #用来统计两类数据中,各词的词频

p0Denom = 2.0;  #用于统计0类中的总数

p1Denom = 2.0  #用于统计1类中的总数

for i in range(numTrainDocs):

if trainCategory[i] == 1:

p1Num += trainMatrix[i]

p1Denom += sum(trainMatrix[i])

else:

p0Num += trainMatrix[i]

p0Denom += sum(trainMatrix[i])

# p1Vect = p1Num / p1Denom

#p0Vect = p0Num / p0Denom

p1Vect = log(p1Num / p1Denom)    #在类1中,每个次的发生概率

p0Vect = log(p0Num / p0Denom)      #避免下溢出或者浮点数舍入导致的错误   下溢出是由太多很小的数相乘得到的

return p0Vect, p1Vect, pAbusive

  1. 根据现实情况修改分类器

注意:主要从以下两点对分类器进行修改

  • 贝叶斯概率需要计算多个概率的乘积以获得文档属于某个类别的概率,即计算p(w0|1)p(w1|1)p(w2|1)。如果其中一个概率值为0,那么最后的乘积也为0
  • 第二个问题就是下溢出,这是由于太多过小的数相乘造成的。由于大部分因子都非常小,所以程序会下溢出或者得不到正确的答案。解决办法是对乘积取自然对数这样可以避免下溢出或者浮点数舍入导致的错误。
  • 每个单词的出现与否作为一个特征,被称为词集模型;在词袋模型中,每个单词可以出现多次。

#朴素贝叶斯分类器

def classifyNB(vec2Classify, p0Vec, p1Vec, pClass1):

p1 = sum(vec2Classify*p1Vec) + log(pClass1)

p0 = sum(vec2Classify*p0Vec) + log(1.0-pClass1)

if p1 > p0:

return 1

else: return 0

def testingNB():

listOPosts, listClasses = loadDataSet()

myVocabList = createVocabList(listOPosts)

trainMat = []

for postinDoc in listOPosts:

trainMat.append(setOfWords2Vec(myVocabList, postinDoc))

p0V, p1V, pAb = trainNB0(array(trainMat), array(listClasses))

testEntry = ['love','my','dalmation']

thisDoc = array(setOfWords2Vec(myVocabList, testEntry))

print testEntry, 'classified as: ', classifyNB(thisDoc, p0V, p1V, pAb)

testEntry = ['stupid','garbage']

thisDoc = array(setOfWords2Vec(myVocabList, testEntry))

print testEntry, 'classified as: ', classifyNB(thisDoc, p0V, p1V, pAb)

  1. 运行测试

>>>reload(bayes)

<module ‘bayes’ from ‘bayes.py’>

>>>bayes.testingNB()

['love','my','dalmation'] classified as: 0

['stupid','garbage'] classified as: 1

  1. 朴素贝叶斯分类算法案例2

3.1 需求

利用大量邮件先验数据,使用朴素贝叶斯分类算法来自动识别垃圾邮件

3.2 python实现

#过滤垃圾邮件

def textParse(bigString):      #正则表达式进行文本解析

import re

listOfTokens = re.split(r'\W*',bigString)

return [tok.lower() for tok in listOfTokens if len(tok) > 2]

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)

trainingSet = 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(setOfWords2Vec(vocabList, docList[docIndex]))

trainClasses.append(classList[docIndex])

p0V, p1V, pSpam = trainNB0(array(trainMat), array(trainClasses))

errorCount = 0

for docIndex in testSet:              #对测试集进行分类

wordVector = setOfWords2Vec(vocabList, docList[docIndex])

if classifyNB(array(wordVector), p0V, p1V, pSpam) != classList[docIndex]:

errorCount += 1

print 'the error rate is: ', float(errorCount)/len(testSet)


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

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)

机器学习-贝叶斯分类算法与应用相关推荐

  1. python推荐系统算法朴素贝叶斯_机器学习经典算法之朴素贝叶斯分类

    很多人都听说过贝叶斯原理,在哪听说过?基本上是在学概率统计的时候知道的.有些人可能会说,我记不住这些概率论的公式,没关系,我尽量用通俗易懂的语言进行讲解. 贝叶斯原理是英国数学家托马斯·贝叶斯提出的. ...

  2. 机器学习笔记之朴素贝叶斯分类算法

    朴素贝叶斯分类算法: 优点:在数据较少的情况下仍然有效,可以处理多分类问题. 缺点:对于输入数据的准备方式较为敏感. 适用数据类型:标称型数据(离散型数据) 算法原理: 对于某一个条件,这个条件下哪个 ...

  3. 【机器学习原理】朴素贝叶斯分类算法

    文章目录 一.朴素贝叶斯公式 1. 从统计角度看分类问题 2. 贝叶斯公式的基本思想 贝叶斯的基本逻辑 3. 用贝叶斯公式进行选择 贝叶斯版的预测未来 二.朴素贝叶斯分类的算法原理 1. 朴素贝叶斯分 ...

  4. 【python机器学习:朴素贝叶斯分类算法】

    python机器学习:朴素贝叶斯分类算法 朴素贝叶斯介绍 贝叶斯公式 基本思想 示例分析 数据展示 先验概率和条件概率 算法步骤: 代码 计算先验概率和条件概率 分类 朴素贝叶斯介绍 贝叶斯分类是一类 ...

  5. 机器学习经典算法——朴素贝叶斯分类算法

    目录 简介 基本概念 贝叶斯定理 贝叶斯公式的本质内涵 代码 托马斯·贝叶斯 简介 朴素贝叶斯分类算法作为机器学习最经典的算法之一,该算法是一种有监督学习算法.其理论基础是"贝叶斯定理&qu ...

  6. 基于python的贝叶斯分类算法预测_python机器学习:朴素贝叶斯分类算法

    大数据挖掘DT机器学习  公众号: datayx 贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类.而朴素朴素贝叶斯分类是贝叶斯分类中最简单,也是常见的一种分类方法.这 ...

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

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

  8. 机器学习系列--贝叶斯分类算法

    简介 贝叶斯分类算法是一大类分类算法的总称 贝叶斯分类算法以样本可能属于某类的概率来作为分类依据 朴素贝叶斯分类算法是贝叶斯分类算法中最简单的一种 注:朴素的意思是条件概率独立性 此处要想真正理解,需 ...

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

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

最新文章

  1. ASP.NET实现数据图表
  2. 关于Go ROOT 和Go PATH的设置
  3. 如何使用 Redis 实现大规模的帖子浏览计数
  4. NetworkX系列教程(10)-算法之三:关键路径问题
  5. x86_64编译JPEG遇到Invalid configuration `x86_64-unknown-linux-gnu'
  6. ImportError: No module named openid
  7. Oracle入门(十四G)之PL / SQL中检索数据
  8. CentOS 6.5 Zabbix-agent3.2 安装 1.0版
  9. 【CodeForces - 1197C】Array Splitting(水题)
  10. 软件测试桌面检查,静态测试的主要方法 - 测试天下,梦寻人生 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...
  11. python 主线程_Python threading多线程模块
  12. 【白皮书分享】车企数据资产及业务价值实现白皮书.pdf(附下载链接)
  13. 操作系统CPU上下文切换
  14. Apache Flink 在国有大型银行智能运营场景下的应用
  15. 第一次面试总结--中国电子科学研究院
  16. Linux 安装jdk8
  17. plist图片列表分割拆分器(修复输出图片错误的BUG)
  18. 互联网应用开发实践:需求分析与数据库设计
  19. 实验二 无线网络环境RSSI测量实验
  20. java jdk 7_jdk1.7下载|Java Development Kit (JDK) 下载「64位」-太平洋下载中心

热门文章

  1. Cucumber Hooks
  2. Android 自动化测试(5)robotium
  3. php 递归算法,解读php全排列递归算法代码
  4. TYUT太原理工大学2022数据库大题之概念模型设计
  5. 模拟CMOS集成电路设计入门学习(4)
  6. (附源码)计算机毕业设计Java房产中介管理系统
  7. 抢先报名 Google 谷歌 菊与刀的金矿岛国 - 细说日本游戏出海 线上研讨会
  8. [华为OD]测试工程师(已过)
  9. MATLAB:批量对图片进行裁剪
  10. 理解BERT:一个突破性NLP框架的综合指南