欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

第八十七篇 朴素贝叶斯

程序员文章站 2022-05-30 18:30:06
...

心得: 还是需要记录一下,自己的学习历程,平时学到的比较杂,在此能全面总结一下自己学到的,看到的,理解的东西。

一、公式原理

  1. 条件概率

    条件概率是指事件A在事件B发生的条件下发生的概率。条件概率表示为:P(A|B),读作“A在B发生的条件下发生的概率”。若只有两个事件A,B,那么,第八十七篇 朴素贝叶斯

第八十七篇 朴素贝叶斯

  1. 全概率公式(知因求果)
    如图;从家到公司有三条路,选择第一条路的概率为P(L1),选择第一条路且不堵车的概率为P(C|L1)
    第八十七篇 朴素贝叶斯
    假设遇到拥堵会迟到,那么从Home到Company不迟到的概率是多少?

    选择每条路都有可能,且不迟到的概率,所以要将所有可能的结果相加,得到最终不迟到的概率:

    P(不迟到) = P(C|L2)+P(C|L2)+P(C|L3)

    全概率公式:

    设事件是一个完备事件组,则对于任意一个事件C,若有如下公式成立:

第八十七篇 朴素贝叶斯

  1. 贝叶斯公式(知果求因)

    贝叶斯要解决的问题是:到达公司且不迟到选择第一条路的概率是多少?

    第八十七篇 朴素贝叶斯

    根据公式得出结果为:
    第八十七篇 朴素贝叶斯

从此处可以看得出来全概率公式和贝叶斯公式是想通的,全概率公式计算的结果就是把各个路径得到的概率求和;而贝叶斯公式啊计算的结果是:已知最终计算的结果,求某一条路径上的发生的概率是多少

B站中某一博主的截图,诠释的透彻,有兴趣可以去看看:
https://www.bilibili.com/video/BV1a4411B7B4/?spm_id_from=333.788.videocard.0

第八十七篇 朴素贝叶斯

二、朴素贝叶斯分类器的公式

假设某个体有n项特征(Feature),分别为F1、F2、…、Fn。现有m个类别(Category),分别为C1、C2、…、Cm。贝叶斯分类器就是计算出概率最大的那个分类,也就是求下面这个算式的最大值:

P(C|F1F2...Fn) = P(F1F2...Fn|C)P(C) / P(F1F2...Fn)

由于 P(F1F2…Fn) 对于所有的类别都是相同的,可以省略,问题就变成了求

P(F1F2...Fn|C)P(C)

的最大值。
朴素贝叶斯分类器则是更进一步,假设所有特征都彼此独立,因此

P(F1F2...Fn|C)P(C) = P(F1|C)P(F2|C) ... P(Fn|C)P(C)

上式等号右边的每一项,都可以从统计资料中得到,由此就可以计算出每个类别对应的概率,从而找出最大概率的那个类。
虽然”所有特征彼此独立”这个假设,在现实中不太可能成立,但是它可以大大简化计算,而且有研究表明对分类结果的准确性影响不大

三、垃圾邮件是如何用贝叶斯方法过滤掉的

现在我们收到一封新邮件,我们假定它是正常邮件和垃圾邮件的概率各是50%。即:

P(正常)= P(垃圾)=50%

然后,对这封新邮件的内容进行解析,发现其中含有“发票”这个词,那么这封邮件属于垃圾邮件的概率提高到多少?其实就是计算一个条件概率,在有“发票”词语的条件下,邮件是垃圾邮件的概率:P(垃圾|发票)。直接计算肯定是无法计算了,这时要用到贝叶斯定理:

第八十七篇 朴素贝叶斯

发票的概率为:
第八十七篇 朴素贝叶斯
最终概率为:
第八十七篇 朴素贝叶斯

这种过滤方法还具有自我学习能力,会根据新收到的邮件,不断调整发票这个词是垃圾邮件的概率和发票是正常邮件的概率。收到的垃圾邮件越多,它的准确率就越高。

四、sklearn中的朴素贝叶斯模型及其应用

  1. 使用朴素贝叶斯模型对iris数据集进行花分类
from sklearn.datasets import load_iris
iris=load_iris()
from sklearn.naive_bayes import BernoulliNB #伯努利型
from sklearn.naive_bayes import GaussianNB #高斯分布型
from sklearn.naive_bayes import MultinomialNB #多项式型

gnb=GaussianNB() #构造
pred=gnb.fit(iris.data,iris.target) #拟合
y_pred=pred.predict(iris.data) #预测

print(iris.data.shape[0],(iris.target !=y_pred).sum()) #iris.target科学家给出的分类,y_pred建模型产生的预测,比较两个有什么不一样,
                                                       #然后将不同的值的个数求出来,150个结果中,有6个和科学家的值不同
  1. 使用sklearn.model_selection.cross_val_score(),对模型进行验证。
from sklearn.naive_bayes import GaussianNB #高斯分布型
from sklearn.model_selection import cross_val_score
gnb=GaussianNB()
scores=cross_val_score(gnb,iris.data,iris.target,cv=10) #将数据集分为10份,其中9份作为训练模型,1份用来做评估
                                                        #score是交叉验证的对象
                                                        #结果是返回准确率的概念,结果是33.3%
print("Accuracy:%.3f"%scores.mean())

结果:
Accuracy:0.953