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

算法三:朴素贝叶斯算法

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

贝叶斯统计基础

在说朴素贝叶斯算法之前,还是要说说贝叶斯统计,关于贝叶斯统计,这里只给出最最最基本的简述,其余的还请参阅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(X|Y1)+ P(X|Y2)+…+ P(X|Yn)

贝叶斯公式:

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

按这些术语,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代码如下:

data <-read.csv("D:/R/data/playing tennis.csv")data<-data[,-1]#去掉了日期这一个没有可作为分类变量价值的变量prior.yes<-sum(data[,5] =="Yes") / length(data[,5]);prior.no<-sum(data[,5] =="No") / length(data[,5]); bayespre<- function(condition) {post.yes <- sum((data[,1] == condition[1]) & (data[,5] == "Yes")) /sum(data[,5] == "Yes") * sum((data[,2] == condition[2]) & (data[,5] == "Yes")) /sum(data[,5] == "Yes") * sum((data[,3] == condition[3]) & (data[,5] == "Yes")) /sum(data[,5] == "Yes") * sum((data[,4] == condition[4]) & (data[,5] == "Yes")) /sum(data[,5] == "Yes") * prior.yes; post.no <- sum((data[,1] == condition[1]) & (data[,5] == "No")) /sum(data[,5] == "No") * sum((data[,2] == condition[2]) & (data[,5] == "No")) /sum(data[,5] == "No") * sum((data[,3] == condition[3]) & (data[,5] == "No")) /sum(data[,5] == "No") * sum((data[,4] == condition[4]) & (data[,5] == "No")) /sum(data[,5] == "No") * prior.no; return(list(prob.yes = post.yes,prob.no = post.no,prediction = ifelse(post.yes>=post.no, "Yes", "No")));} 测试:bayespre(c("Rain","Hot","High","Strong"))bayespre(c("Sunny","Mild","Normal","Weak"))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"

你并不一定会从此拥有更美好的人生,

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

相关文章:

你感兴趣的文章:

标签云: