傻傻de

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

朴素贝叶斯(Naive Bayes)

一、简介

首先介绍一下贝叶斯:

贝叶斯(约1702-1761) Thomas Bayes,英国数学家。
约1702年出生于伦敦,做过神甫。1742年成为英国皇家学会会员。1761年4月7日逝世。贝叶斯在数学方面主要研究概率论。
他首先将归纳推理法用于概率论基础理论,并创立了贝叶斯统计理论,对于统计决策函数、统计推断、统计的估算等做出了贡献。

朴素贝叶斯算法:

朴素贝叶斯算法是基于贝叶斯定理与特征条件独立假设的分类方法。
朴素贝叶斯分类器(Naive Bayes Classifier,或 NBC)发源于古典数学理论,有着坚实的数学基础,以及稳定的分类效率。

二、概率基础

1.联合概率

联合概率:表示两个事件共同发生的概率。A与B的联合概率记为P(A,B)。

2.条件概率

条件概率:指事件A在另外一个事件B已经发生条件下的发生概率。记为P(A|B),读作“在B的条件下A的概率”。

三、贝叶斯公式

在给定类变量y和从属特征向量x1到xn的情况下,贝叶斯定理表明了以下关系:

\begin{align}\notag P(y|x_{1},x_{2},...,x_{n}) = \frac{P(x_{1},x_{2},...,x_{n} | y)P(y)}{P(x_{1},x_{2},...,x_{n}))} \end{align}

使用条件独立假设:

\begin{align}\notag P(x_{1},x_{2},...,x_{n}|y) = P(x_{1}|y)P(x_{2}|y)...P(x_{n}|y) \end{align}

可以得到:

\begin{align}\notag P(y|x_{1},x_{2},...,x_{n}) = \frac{P(y)\prod_{i=1}^{n}P(x_{i}| y)}{P(x_{1},x_{2},...,x_{n})} \end{align}

四、计算举例

在一个训练集中,m类文章有30篇,n类文章有70篇,其中出现A、B、C、D四个词的个数如下表所示。

m n
A 7 55
B 11 51
C 21 15
D 64 0
总计 103 121

当要预测的文章中出现了B、C、D三个词,则该文章属于m类还是n类?
属于m类的概率为:

\begin{align}\notag P(m|B,C,D) = \frac{P(m)P(B,C,D| m)}{P(B,C,D)} =\frac{11}{103}\cdot \frac{21}{103}\cdot \frac{64}{103}\cdot \frac{30}{100} \div P(B,C,D) =\frac{0.00405}{P(B,C,D)} \end{align}

属于n类的概率为:

\begin{align}\notag P(n|B,C,D) = \frac{P(n)P(B,C,D| n)}{P(B,C,D)} =\frac{51}{121}\cdot \frac{15}{121}\cdot \frac{0}{121}\cdot \frac{70}{100} \div P(B,C,D) =\frac{0}{P(B,C,D)} \end{align}

由上面计算得:

\begin{align}\notag P(m|B,C,D) > P(n|B,C,D) \end{align}

则预测该文章属于m类。

五、拉普拉斯平滑(Laplace smoothing)

当某个分量在训练集某个分类中从没出现过,会导致整个实例的计算结果为0,如上面属于n类的概率。为了解决这个问题,使用拉普拉斯平滑进行处理,公式如下。

\begin{align}\notag \hat{}\theta_{yi} = \frac{N_{yi}+\alpha}{N_{y}+\alpha n} \end{align}

其中alpha为平滑系数,一般取值为1。

上式表示在分子上加1,在分母上加上1乘以特征的数量即可。上述例子中属于n类的概率为:

\begin{align}\notag P(m|B,C,D) = \frac{P(m)P(B,C,D| m)}{P(B,C,D)} =\frac{51+1}{121+1\times 4}\cdot \frac{15+1}{121+1\times 4}\cdot \frac{0+1}{121+1\times 4}\cdot \frac{70}{100} \div P(B,C,D) =\frac{0.00298}{P(B,C,D)} \end{align}

六、优缺点

1. 优点

  • 发源于古典数学理论,有稳定的分类效率
  • 对缺失数据不太敏感,算法简单,常用于文本分类
  • 分类准确率高,速度快

2. 缺点

  • 基于样本特征独立的假设,如果特征有关联是效果不好

七、API

	sklearn.naive_bayes.MultinomialNB(alpha=1.0)

alpha:平滑系数

八、简单示例

from sklearn.naive_bayes import MultinomialNB
from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import TfidfVectorizer


news_train = fetch_20newsgroups(subset="train")
news_test = fetch_20newsgroups(subset="test")

tfidf = TfidfVectorizer()
news_train_data = tfidf.fit_transform(news_train.data)
news_train_target = news_train.target

news_test_data = tfidf.transform(news_test.data)
news_test_target = news_test.target

mnb = MultinomialNB()
mnb.fit(news_train_data,news_train_target)
print("准确率为:",mnb.score(news_test_data,news_test_target))

我一直在,守着你的天真和笑容。——《哆啦A梦》

posted on 2018-12-27 23:58  傻傻de  阅读(723)  评论(0编辑  收藏  举报