Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >R语言与机器学习(分类算法)朴素贝叶斯算法

R语言与机器学习(分类算法)朴素贝叶斯算法

作者头像
机器学习AI算法工程
发布于 2018-03-12 09:10:13
发布于 2018-03-12 09:10:13
2.1K00
代码可运行
举报
运行总次数:0
代码可运行

前两个算法都被要求做出一个艰难的决定,给出数据所属分类的明确答案,但往往因为分类特征统计不足,或者分类特征选择有误导致了错误的分类结果,哪怕是训练集也有可能出现不能正确分类的情形。这时,前两种方法都如同现实生活一样是用“少数服从多数”的办法来做出决策。正如帕斯卡指出的:“少数服从多数未必是因为多数人更正义,而是多数人更加强力”,所以为了保证“少数人的权利”,我们要求分类器给出一个最优的猜测结果,同时给出猜测的概率估计值。

贝叶斯统计基础

在说朴素贝叶斯算法之前,还是要说说贝叶斯统计,关于贝叶斯统计,这里只给出最最最基本的简述,其余的还请参阅further reading中的《数学之美番外篇:平凡而又神奇的贝叶斯方法》

先说贝叶斯公式:

定义:设A、B是两个事件,且P(A)>0,称

P(B|A)=P(AB)/P(A)

为在事件A发生的条件下事件B发生的条件概率。

相关公式:

乘法公式 P(XYZ)=P(Z|XY)P(Y|X)P(X)

全概率公式 P(X)=P(XY1)+ P(XY2)+…+ P(XYn)

贝叶斯公式:

如上所示,其中P(A|B)是在B发生的情况下A发生的可能性。在贝叶斯定理中,每个名词都有约定俗成的名称:

  • P(A)是A的先验概率或边缘概率。之所以称为"先验"是因為它不考虑任何B方面的因素。
  • P(A|B)是已知B发生后A的条件概率(直白来讲,就是先有B而后=>才有A),也由于得自B的取值而被称作A的后验概率。
  • P(B|A)是已知A发生后B的条件概率(直白来讲,就是先有A而后=>才有B),也由于得自A的取值而被称作B的后验概率。
  • P(B)是B的先验概率或边缘概率,也作标准化常量。

按这些术语,Bayes定理可表述为:后验概率 = (相似度*先验概率)/标准化常量,也就是說,后验概率与先验概率和相似度的乘积成正比。另外,比例 P(B|A)/P(B)也有时被称作标准相似度,Bayes定理可表述为:后验概率 =标准相似度*先验概率。

朴素贝叶斯

再说说朴素贝叶斯,朴素贝叶斯在英文中叫做naive Bayes,是不是这个贝叶斯方法too simple,sometimes naive呢?我们一起来看看他的基本假设:条件独立性。

给定类标号A,朴素贝叶斯分类器在估计类条件概率时假设属性之间条件独立。条件独立假设可以形式化的表达如下:

P(B|A)=P(b1|A)*P(b2|A)*…*P(bn|A)

其中每个训练样本可用一个属性向量B=(b1,b2,b3,…,bn)表示,各个属性之间条件独立。

比如,对于一篇文章,

“Good good study, Day day up.”

可以用一个文本特征向量来表示,x=(Good, good, study, Day, day , up)。一般各个词语之间肯定不是相互独立的,有一定的上下文联系。但在朴素贝叶斯文本分类时,我们假设个单词之间没有联系,可以用一个文本特征向量来表示这篇文章,这就是“朴素”的来历。

有了条件独立假设,就不必计算X和Y的每一种组合的类条件概率,只需对给定的Y,计算每个xi的条件概率。后一种方法更实用,因为它不需要很大的训练集就能获得较好的概率估计。

其实这种条件独立也不是在日常中看不到,比如Markov过程,再比如我们前面说的脊椎动物数据集的各个指标都可以看作条件独立的(前者是严格的,后者是近似的)

我们为了说明这个问题,使用Tom Mitchell的《机器学习》一书的playing tennis数据集(点击这里下载本文所有代码及用到数据集)来说明这个问题。R代码如下:

[plain] view plaincopyprint

  1. data <-read.csv("D:/R/data/playing tennis.csv")
  2. data<-data[,-1]#去掉了日期这一个没有可作为分类变量价值的变量
  3. prior.yes<-sum(data[,5] =="Yes") / length(data[,5]);
  4. prior.no<-sum(data[,5] =="No") / length(data[,5]);
  5. bayespre<- function(condition) {
  6. post.yes <-
  7. sum((data[,1] == condition[1]) & (data[,5] == "Yes")) /sum(data[,5] == "Yes") *
  8. sum((data[,2] == condition[2]) & (data[,5] == "Yes")) /sum(data[,5] == "Yes") *
  9. sum((data[,3] == condition[3]) & (data[,5] == "Yes")) /sum(data[,5] == "Yes") *
  10. sum((data[,4] == condition[4]) & (data[,5] == "Yes")) /sum(data[,5] == "Yes") *
  11. prior.yes;
  12. post.no <-
  13. sum((data[,1] == condition[1]) & (data[,5] == "No")) /sum(data[,5] == "No") *
  14. sum((data[,2] == condition[2]) & (data[,5] == "No")) /sum(data[,5] == "No") *
  15. sum((data[,3] == condition[3]) & (data[,5] == "No")) /sum(data[,5] == "No") *
  16. sum((data[,4] == condition[4]) & (data[,5] == "No")) /sum(data[,5] == "No") *
  17. prior.no;
  18. return(list(prob.yes = post.yes,
  19. prob.no = post.no,
  20. prediction = ifelse(post.yes>=post.no, "Yes", "No")));
  21. }

测试:

[plain] view plaincopyprint?

  1. bayespre(c("Rain","Hot","High","Strong"))
  2. bayespre(c("Sunny","Mild","Normal","Weak"))
  3. bayespre(c("Overcast","Mild","Normal","Weak"))

上面三个测试集输出结果为:

>bayespre(c("Rain","Hot","High","Strong"))

$prob.yes

[1] 0.005291005

$prob.no

[1] 0.02742857

$prediction

[1] "No"

>bayespre(c("Sunny","Mild","Normal","Weak"))

$prob.yes

[1] 0.02821869

$prob.no

[1] 0.006857143

$prediction

[1] "Yes"

>bayespre(c("Overcast","Mild","Normal","Weak"))

$prob.yes

[1] 0.05643739

$prob.no

[1] 0

$prediction

[1] "Yes"

我们同样可以来训练一下我们之前提到的脊椎动物数据集(略去代码),来看看分类效果:

>bayespre(animals,c("no","yes","no","sometimes","yes"))

$prob.mammals

[1] 0

$prob.amphibians

[1] 0.1

$prob.fishes

[1] 0

$prob.reptiles

[1] 0.0375

$prediction

[1] amphibians

Levels: amphibians birds fishesmammals reptiles

这里我们仍然没有区分出是两栖动物还是爬行动物,但是至少它告诉我们选择时要考虑到爬行动物这种可能,而不是像决策树那样告诉你他是两栖动物。

>bayespre(animals,c("no","yes","no","yes","no"))

$prob.mammals

[1] 0.0004997918

$prob.amphibians

[1] 0

$prob.fishes

[1] 0.06666667

$prob.reptiles

[1] 0

$prediction

[1] fishes

Levels: amphibians birds fishesmammals reptiles

这个是第三条数据作为测试数据的,也就是得到了正确分类,他告诉我们有极小的可能他是哺乳动物,我们可以忽略它,毕竟两个概率相差太大了

> bayespre(animals,c("yes","no","no","yes","no"))

$prob.mammals

[1] 0.0179925

$prob.amphibians

[1] 0

$prob.fishes

[1] 0.01666667

$prob.reptiles

[1] 0

$prediction

[1] mammals

Levels: amphibians birds fishesmammals reptiles

这个分类相当不好,两个分类的概率也相差无几,我们确实需要考虑。

这至少告诉了我们两个事实:这个学习器的分类效果不太好;这个数据集的生物特征统计信息不够。

除此以外,我们还发现这个学习器处理不了他没见过的情况,以playing tennis数据为例:

假设有来了一个新样本 x1= (Outlook = Foggy,Temprature = Hot,Humidity = High,Wind =Strong),要求对其分类。我们来开始计算:

>bayespre(c("foggy","Hot","High","Strong"))

$prob.yes

[1] 0

$prob.no

[1] 0

$prediction

[1] "Yes"

计算到这里,大家就会意识到,这里出现了一个新的属性值,在训练样本中所没有的。如果有一个属性的类条件概率为0,则整个类的后验概率就等于0,我们可以直接得到后验概率P(Yes | x1)= P(No | x1)=0,这时二者相等,无法分类。(虽说程序设定时我遵从疑罪从无的思想偏向了正例)

当训练样本不能覆盖那么多的属性值时,都会出现上述的窘境。简单的使用样本比例来估计类条件概率的方法太脆弱了,尤其是当训练样本少而属性数目又很大时。

如何解决?引入m估计(m-estimate)方法来估计条件概率:

P(xi|yj)=(nc+mp)/(n+m)

n是类yj中的样本总数,nc是类yj中取值xi的样本数,m是称为等价样本大小的参数,而p是用户指定的参数。如果没有训练集(即n=0),则P(xi|yj)=p, 因此p可以看作是在类yj的样本中观察属性值xi的先验概率。等价样本大小决定先验概率和观测概率nc/n之间的平衡,提高了估计的稳健性。

朴素贝叶斯方法是一个很特别的方法,所以值得介绍一下。在众多的分类模型中,应用最为广泛的两种分类模型是决策树模型(Decision Tree Model)和朴素贝叶斯模型(Naive Bayes Model,NBC)。朴素贝叶斯模型发源于古典数学理论,有着坚实的数学基础,以及稳定的分类效率。

同时,NBC模型所需估计的参数很少,对缺失数据不太敏感,算法也比较简单。理论上,NBC模型与其他分类方法相比具有最小的误差率。但是实际上并非总是如此,这是因为NBC模型假设属性之间相互独立,这个假设在实际应用中往往是不成立的,这给NBC模型的正确分类带来了一定影响。在属性个数比较多或者属性之间相关性较大时,NBC模型的分类效率比不上决策树模型。而在属性相关性较小时,NBC模型的性能最为良好。(所以在文本分类时能够用关键词就更好了)

R语言中Naive Bayes的实现函数

R的e1071包的naiveBayes函数提供了naive bayes的具体实现,其用法如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
## S3 method for class 'formula'
naiveBayes(formula, data, laplace = 0, ..., subset, na.action = na.pass)
## Default S3 method:
naiveBayes(x, y, laplace = 0, ...)

我们以titanic数据集为例,看看titanic上的符合怎样条件的人更容易得救:

[plain] view plaincopyprint?

  1. data(Titanic)
  2. m <- naiveBayes(Survived ~ ., data = Titanic)
  3. m

R中的文本处理工具

在介绍贝叶斯文本挖掘之前,我想我们先得把R处理文本的一些工具简单的介绍一下,比如处理文本的tm包,R语言处理正则表达式之类的,关于tm包你可以参阅的是tm的帮助文档《Introduction to the tm Package Text Mining in R》,关于正则表达式可以参阅furtherreading 的《文本(字符串)处理与正则表达式》

先说tm包,在tm 中导入数据需要函数Corpus(或VCorpus),函数的用法如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Corpus(x,
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
       readerControl = list(reader = x$DefaultReader, language = "en"),...)

对于这些资料来源(x),tm 包提供了一些相关的函数,比如:DirSource(处理目录)、 VectorSource(由文档构成的向量)、 DataframeSource(数据框)等。

一旦导入了训练文档,需要后续文档处理,比如填充、停止词去除。(在英文里,有些单词是会发生变化,比如我们要识别cat 这个字符,但还可能有cats 等单词,这时候就需要进行填充(stemming)将他们视为一个词,但遗憾的是在tm包中英文中有些不规则的动词过去式可能没法识别为一个词)在tm 包里,这些函数都归到信息转化里面,其主要函数就是tm_map(),这个函数可以通过maps 方式将转化函数实施到每一个单词上。tm_map()的主要用法如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tm_map(x, FUN, ..., useMeta = FALSE, lazy = FALSE)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
       提供的FUN常用的有as.PlainTextDocument(将xml转化为纯文本)、stripWhitespace(去除多余空白)、tolower(转化为小写)、removeWords(去除停止词)、stemDocument(填充)等。

Dictionary() 函数常用于在文本挖掘中展现相关的词条时。当将字典(Dictionary)传递到DocumentTermMatrix() 以后,生成的矩阵会根据字典提取计算词汇出现在每篇文档的频率。(这个在之后会有例子,就不多说了)

再介绍字符串的处理,分割函数:strsplit。使用格式为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
strsplit(x, split, fixed = FALSE, perl = FALSE, useBytes = FALSE)

主要参数说明:

X:字串向量,每个元素都将单独进行拆分。

Split:为拆分位置的字串向量,默认为正则表达式匹配(fixed=FALSE)fixed=TRUE,表示使用普通文本匹配或正则表达式的精确匹配。

Perl:表示可以选择是否兼容Perl的正则表达式的表述方式。

朴素贝叶斯在文本挖掘中的算法

下面开始介绍Naive Bayes算法:

计算每个类别中的文档数目:

for每篇训练文档:

for每个类别:

if 词条in 文档:增加该词条计数值,增加所有词条计数值

For 每个类别:

For 每个词条

Prob=词条数目/总词条数目

Return prob

举例说明,比如我要对我最近阅读的文献,有spc与doe两类,他们的关键词列表如下(部分关键词)

docId

Key word

class

1

“Adaptive weighting” “run length” “control chart”

spc

2

“run length” “control chart”

spc

3

“control chart” “EWMA” “run length”

spc

4

“D-Efficiency” ”Main Effect” “Quadratic Effect”

doe

给定一个新样本”control chart” “run length””main effect” “EWMA”,对其进行分类。

该文本用属性向量表示为d=(”control chart” ,“run length” ,”main effect” ,“EWMA”),类别集合为Y={spc,doe}。类spc下总共有8个单词,类doe下总共有3个单词,训练样本单词总数为11,因此P(spc)=8/11, P(doe)=3/11。部分类条件概率计算如下(使用m估计):

P(”control chart”| spc)=(3+1)/(8+7)=4/15=2/7

P(”main effect”| spc) = (0+1)/(8+7)=1/15

P(”control chart”|doe)=(0+1)/(7+3)=0.1

分母中的8,是指spc类别下训练样本的关键词总数,7是指训练样本有有7个不同的关键词,3是指doe类下共有3个关键词词。

利用类条件概率,开始计算后验概率,

P(spc |d)=4/15*4/15*1/15*8/11≈0.003447811

P(doe|d)= 0.1*0.1*0.2*0.1*3/11≈5.454545e-05

因此,这个文档属于类别spc。

基于朴素贝叶斯的邮件分类

下面来说说朴素贝叶斯分类器在文本分类中的应用。下面是一个使用Naive Bayes分类垃圾邮件的很小的例子,数据来自《机器学习实战》,在本文末尾有数据集下载提示。

这个邮件集合分为两个文件夹ham,spam,各有25封邮件。其中spam中的是广告邮件。这里我们从各文件夹中抽取2封作为测试集,其余作为训练集。作为垃圾邮件分类器,我们总假定不能判决(即两个类别的概率相差不足一个数量级的,这个判别标准需要根据训练的情况确定)的为正常邮件。

R代码:

1、建立词袋:

[plain] view plaincopyprint

  1. library(tm)
  2. txt1<-"D:/R/data/email/ham"
  3. txtham<-Corpus(DirSource(txt1),readerControl=list(language= "en"))
  4. txtham<-tm_map(txtham,stripWhitespace)
  5. txtham<-tm_map(txtham,tolower)
  6. txtham<-tm_map(txtham,removeWords,stopwords("english"))
  7. txtham<-tm_map(txtham,stemDocument)
  8. txt2<-"D:/R/data/email/spam"
  9. txtspam<-Corpus(DirSource(txt2),readerControl=list(language= "en"))
  10. txtspam<-tm_map(txtspam,stripWhitespace)
  11. txtspam<-tm_map(txtspam,tolower)
  12. txtspam<-tm_map(txtspam,removeWords,stopwords("english"))
  13. txtspam<-tm_map(txtspam,stemDocument)

2、词汇计数(包括词类数目与词量数目)

[plain] view plaincopyprint?

  1. dtm1<-DocumentTermMatrix(txtham)
  2. n1<-length(findFreqTerms(dtm1,1))
  3. dtm2<-DocumentTermMatrix(txtspam)
  4. n2<-length(findFreqTerms(dtm2,1))
  5. setwd("D:/R/data/email/spam")
  6. name<-list.files(txt2)
  7. data1<-paste("spam",1:23)
  8. lenspam<-0
  9. for(i in 1:length(names)){
  10. assign(data1[i],scan(name[i],"character"))
  11. lenspam<-lenspam+length(get(data[i]))
  12. }
  13. setwd("D:/R/data/email/ham")
  14. names<-list.files(txt1)
  15. data<-paste("ham",1:23)
  16. lenham<-0
  17. for(i in 1:length(names)){
  18. assign(data[i],scan(names[i],"character"))
  19. lenham<-lenham+length(get(data[i]))
  20. }

3、naive Bayes模型建立(使用m估计,p=1/m,m为词汇总数)

[plain] view plaincopyprint?

  1. prob<-function(char,corp,len,n){
  2. d<-Dictionary(char)
  3. re<-DocumentTermMatrix(corp, list(dictionary = d));
  4. as.matrix(re)
  5. dtm<-DocumentTermMatrix(corp)
  6. n<-length(findFreqTerms(dtm, 1))
  7. prob<-(sum(re[,1])+1)/(n+len)
  8. return(prob)
  9. }
  10. testingNB<-function(sentences){
  11. pro1<-0.5
  12. pro2<-0.5
  13. for(i in1:length(sentences)){
  14. pro1<-pro1*prob(sentences[i],txtham,lenham,n1)
  15. }
  16. for(i in1:length(sentences)){
  17. pro2<-pro2*prob(sentences[i],txtspam,lenspam,n2)
  18. }
  19. return(list(prob.ham = pro1,
  20. prob.span =pro2,
  21. prediction =ifelse(pro1>=pro2/10, "ham", "spam")))
  22. }

4、测试(利用test里的4封邮件,仅以ham2.txt,spam1.txt为例)

[plain] view plaincopyprint?

  1. #读取文档,并且实现分词与填充
  2. email<-scan("D:/R/data/email/test/ham2.txt","character")
  3. sentences<-unlist(strsplit(email,",|\\?|\\;|\\!"))#分词
  4. library(Snowball)#实现填充
  5. a<-tolower(SnowballStemmer(sentences))# 实现填充并除去大小写因素
  6. #测试
  7. testingNB(a)

输出结果:

$prob.ham

[1] 3.537766e-51

$prob.span

[1] 4.464304e-51

$prediction

[1] "ham"

类似的使用spam1.txt得到结果:

$prob.ham

[1] 5.181995e-95

$prob.span

[1] 1.630172e-84

$prediction

[1] "spam"

可以看出分类效果一般,但是典型的广告邮件还是可以区分出来的。对于分类而言,我们使用tm包来做naive Bayes多少有些高射炮打蚊子的意思,因为这里面除了去除停止词外我们几乎没有用到tm的更多不能利用base包实现的东西了(比如词类统计可以使用table,字典的查询可以使用grep, regexpr来实现它)。但是去掉停止词对于这样的文本分类是十分重要的,可以让分类准确率更高。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2015-08-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大数据挖掘DT数据分析 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【机器学习-监督学习】朴素贝叶斯
  贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,所以统称为贝叶斯分类。朴素贝叶斯是一种贝叶斯分类算法,在许多场合可以与决策树和神经网络分类算法相媲美。图1展示了贝叶斯原理、贝叶斯分类和朴素贝叶斯三者之间的关系。
Francek Chen
2025/01/22
1770
【机器学习-监督学习】朴素贝叶斯
Python3《机器学习实战》学习笔记(五):朴素贝叶斯实战篇之新浪新闻分类
本文通过分析代码数据集,总结了一种基于机器学习的新闻分类方法,该方法通过提取文本特征,使用朴素贝叶斯分类器进行分类,并针对数据集不平衡问题,采用过采样和欠采样策略,提升分类效果。同时,针对提取的特征词,采用词袋模型和TF-IDF方法进行特征表示,最终将特征向量输入到分类器中进行分类。实验结果表明,该方法在新闻分类任务上具有较好的效果。
Jack_Cui
2018/01/08
2.2K0
Python3《机器学习实战》学习笔记(五):朴素贝叶斯实战篇之新浪新闻分类
机器学习(14)——朴素贝叶斯算法思想:基于概率的预测贝叶斯公式朴素贝叶斯算法示例:文本数据分类
前言:在所有的机器学习分类算法中,朴素贝叶斯和其他绝大多数的分类算法都不同。对于大多数的分类算法,比如决策树,KNN,逻辑回归,支持向量机等,他们都是判别方法,也就是直接学习出特征输出Y和特征X之间的关系,要么是决策函数Y=f(X)要么是条件分布P(Y|X)。但是朴素贝叶斯却是生成方法,也就是直接找出特征输出Y和特征X的联合分布然后用P(Y|X)=P(X,Y)/P(X)得出。 朴素贝叶斯很直观,计算量也不大,在很多领域有广泛的应用, 算法思想:基于概率的预测 逻辑回归通过拟合曲线(或者学习超平面)实现分类
DC童生
2018/04/27
14.2K0
机器学习(14)——朴素贝叶斯算法思想:基于概率的预测贝叶斯公式朴素贝叶斯算法示例:文本数据分类
图解机器学习 | 朴素贝叶斯算法详解
教程地址:http://www.showmeai.tech/tutorials/34
ShowMeAI
2022/03/10
2.8K0
图解机器学习 | 朴素贝叶斯算法详解
AI -朴素贝叶斯
朴素贝叶斯是一种基于概率论和统计学的分类算法,它的核心是贝叶斯定理和特征条件独立假设。
@小森
2024/03/24
1230
机器学习算法--朴素贝叶斯(Naive Bayes)
朴素贝叶斯算法(Naive Bayes, NB) 是应用最为广泛的分类算法之一。它是基于贝叶斯定义和特征条件独立假设的分类器方法。NB模型所需估计的参数很少,对缺失数据不太敏感,算法也比较简单。当年的垃圾邮件分类都是基于朴素贝叶斯分类器识别的。
@小森
2024/03/15
3190
机器学习算法--朴素贝叶斯(Naive Bayes)
机器学习算法的R语言实现:朴素贝叶斯分类器
1、引子 朴素贝叶斯方法是一种使用先验概率去计算后验概率的方法,其中朴素的意思实际上指的是一个假设条件,后面在举例中说明。本人以为,纯粹的数学推导固然有其严密性、逻辑性的特点,但对我等非数学专业的人来说,对每一推导步骤的并非能透彻理解,我将从一个例子入手,类似于应用题的方式,解释朴素贝叶斯分类器,希望能对公式的理解增加形象化的场景。 2、实例 最近“小苹果”很火,我们就以苹果来举例说,假设可以用三个特征来描述一个苹果,分别为“尺寸”、“重量”和“颜色”;其中“尺寸”的取值为小、大,“重量”的取值为轻、重,“
机器学习AI算法工程
2018/03/14
1.1K0
机器学习算法的R语言实现:朴素贝叶斯分类器
机器学习算法的R语言实现:朴素贝叶斯分类器
1、引子 朴素贝叶斯方法是一种使用先验概率去计算后验概率的方法,其中 朴素 的意思实际上指的是一个假设条件,后面在举例中说明。本人以为,纯粹的数学推导固然有其严密性、逻辑性的特点,但对我等非数学专业的人来说,对每一推导步骤的并非能透彻理解,我将从一个例子入手,类似于应用题的方式,解释朴素贝叶斯分类器,希望能对公式的理解增加形象化的场景。 2、实例 最近“小苹果”很火,我们就以苹果来举例说,假设可以用三个特征来描述一个苹果,分别为“尺寸”、“重量”和“颜色”;其中“尺寸”的取值为小、大,“重量”的取值为轻、
机器学习AI算法工程
2018/03/12
7350
贝叶斯分类算法
贝叶斯分类算法是统计学的一种分类方法,它是一类利用概率统计知识进行分类的算法。在许多场合,朴素贝叶斯(Naïve Bayes,NB)分类算法可以与决策树和神经网络分类算法相媲美,该算法能运用到大型数据库中,而且方法简单、分类准确率高、速度快。
润森
2019/09/27
1.1K0
贝叶斯分类算法
朴素贝叶斯算法详解(1)
1. 引言   朴素贝叶斯算法(Naive Bayes)是机器学习中常见的基本算法之一,主要用来做分类任务的。它是基于贝叶斯定理与条件独立性假设的分类方法。对于给定的训练数据集,首先基于特征条件独立性假设学习输入/输出的联合概率分布,然后基于此模型,对于给定的输入 x 利用贝叶斯定理求出后验概率最大的输出 y。   基于以上的解释,我们知道:1. 该算法的理论核心是贝叶斯定理;2. 它是基于条件独立性假设这个强假设之下的,这也是该算法为什么称为“朴素”的原因。 本文将从以下几个角度去详细解释朴素贝
机器学习算法工程师
2018/03/06
8060
朴素贝叶斯算法的推导与实践
但是,有时我们无法非常明确地得到分类,例如当数据量非常大时,计算每个样本与预测样本之间的距离或是构建决策树都会因为运算量过大而力不从心。
用户3147702
2022/06/27
3210
朴素贝叶斯算法的推导与实践
数据挖掘十大经典算法(9) 朴素贝叶斯分类器 Naive Bayes
  贝叶斯分类器的分类原理是通过某对象的先验概率,利用贝叶斯公式计算出其后验概率,即该对象属于某一类的概率,选择具有最大后验概率的类作为该对象所属的类。眼下研究较多的贝叶斯分类器主要有四种,各自是:Naive Bayes、TAN、BAN和GBN。   贝叶斯网络是一个带有概率凝视的有向无环图,图中的每个结点均表示一个随机变量,图中两结点 间若存在着一条弧,则表示这两结点相相应的随机变量是概率相依的,反之则说明这两个随机变量是条件独立的。网络中随意一个结点X 均有一个对应的条件概率表(Conditional Probability Table,CPT),用以表示结点X 在其父结点取各可能值时的条件概率。若结点X 无父结点,则X 的CPT 为其先验概率分布。贝叶斯网络的结构及各结点的CPT 定义了网络中各变量的概率分布。   贝叶斯分类器是用于分类的贝叶斯网络。该网络中应包括类结点C,当中C 的取值来自于类集合( c1 , c2 , … , cm),还包括一组结点X = ( X1 , X2 , … , Xn),表示用于分类的特征。对于贝叶斯网络分类器,若某一待分类的样本D,其分类特征值为x = ( x1 , x2 , … , x n) ,则样本D 属于类别ci 的概率P( C = ci | X1 = x1 , X2 = x 2 , … , Xn = x n) ,( i = 1 ,2 , … , m) 应满足下式:   P( C = ci | X = x) = Max{ P( C = c1 | X = x) , P( C = c2 | X = x ) , … , P( C = cm | X = x ) }   而由贝叶斯公式:   P( C = ci | X = x) = P( X = x | C = ci) * P( C = ci) / P( X = x)   当中,P( C = ci) 可由领域专家的经验得到,而P( X = x | C = ci) 和P( X = x) 的计算则较困难。   应用贝叶斯网络分类器进行分类主要分成两阶段。第一阶段是贝叶斯网络分类器的学习,即从样本数 据中构造分类器,包含结构学习和CPT 学习;第二阶段是贝叶斯网络分类器的推理,即计算类结点的条件概率,对分类数据进行分类。这两个阶段的时间复杂性均取决于特征值间的依赖程度,甚至能够是 NP 全然问题,因而在实际应用中,往往须要对贝叶斯网络分类器进行简化。依据对特征值间不同关联程度的如果,能够得出各种贝叶斯分类器,Naive Bayes、TAN、BAN、GBN 就是当中较典型、研究较深入的贝叶斯分类器。
全栈程序员站长
2022/07/13
4010
机器学习-04-分类算法-02贝叶斯算法案例
因为0.038>6.80*10­^(-5),所以朴素贝叶斯分类器将待测样本判别为“好瓜”。
用户2225445
2025/03/23
480
机器学习-04-分类算法-02贝叶斯算法案例
A.机器学习入门算法(二): 朴素贝叶斯(Naive Bayes)
朴素贝叶斯算法(Naive Bayes, NB) 是应用最为广泛的分类算法之一。它是基于贝叶斯定义和特征条件独立假设的分类器方法。由于朴素贝叶斯法基于贝叶斯公式计算得到,有着坚实的数学基础,以及稳定的分类效率。NB模型所需估计的参数很少,对缺失数据不太敏感,算法也比较简单。当年的垃圾邮件分类都是基于朴素贝叶斯分类器识别的。
汀丶人工智能
2023/03/22
8690
A.机器学习入门算法(二): 朴素贝叶斯(Naive Bayes)
朴素贝叶斯以及三种常见模型推导
朴素贝叶斯算法Naive Bayes定义中有两个关键定义:特征之间强假设独立和贝叶斯定理.这两个定义就是朴素贝叶斯的关键.接下来先了解一下这两个定义.
公众号-不为谁写的歌
2020/07/23
1.5K0
【机器学习】朴素贝叶斯算法
链接:https://cloud.tencent.com/developer/article/2472727
摆烂小白敲代码
2024/11/24
6700
【机器学习】朴素贝叶斯算法
【机器学习】朴素贝叶斯算法详解与实战扩展
朴素贝叶斯算法是一种基于概率统计的分类方法,它利用贝叶斯定理和特征条件独立假设来预测样本的类别。尽管其假设特征之间相互独立在现实中往往不成立,但朴素贝叶斯分类器因其计算简单、效率高、对缺失数据不敏感等优点,在文本分类、垃圾邮件过滤、情感分析等领域有着广泛的应用。
破晓的历程
2024/08/20
2980
【机器学习 | 朴素贝叶斯】朴素贝叶斯算法:概率统计方法之王,简单有效的数据分类利器
贝叶斯算法是一种常用的概率统计方法,它利用贝叶斯定理来进行分类和预测。其在计算机还没有出现前几十年就存在了,那个时候科学家们都是用手算的,是最早的机器学习形式之一,该算法基于统计学原理,通过已知的先验概率和观测到的数据,更新对事件发生概率的估计。因为有着一个很强的假设,每个数据特征都是独立的,这也是条件独立的前提条件,也叫"朴素的"的假设,故叫朴素贝叶斯算法。
计算机魔术师
2023/10/15
7450
【机器学习 | 朴素贝叶斯】朴素贝叶斯算法:概率统计方法之王,简单有效的数据分类利器
朴素贝叶斯算法优化与 sklearn 实现
这显然是不正确的,本文,我们就来解决这个问题,同时对算法进行优化并使用 sklearn 来实现算法的实践。
用户3147702
2022/06/27
6250
朴素贝叶斯算法优化与 sklearn 实现
算法金 | AI 基石,无处不在的朴素贝叶斯算法
但在 20 世纪,这一理论被重新发现并广泛应用于各个领域,如机器学习、医学诊断和金融分析等
算法金
2024/06/10
1840
算法金 | AI 基石,无处不在的朴素贝叶斯算法
推荐阅读
相关推荐
【机器学习-监督学习】朴素贝叶斯
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验