朴素贝叶斯算法

文章目录

  • 1. 贝叶斯定理
  • 2. 朴素贝叶斯
    • 2.1 朴素贝叶斯原理
    • 2.2 朴素贝叶斯适用范围
    • 2.3 朴素贝叶斯常用模型
  • 3. 朴素贝叶斯算法的特点
  • 4. 朴素贝叶斯的Python应用
  • 5. 源码仓库地址

1. 贝叶斯定理

先验概率:即基于统计的概率,是基于以往历史经验和分析得到的结果,不需要依赖当前发生的条件。

后验概率:则是从条件概率而来,由因推果,是基于当下发生了事件之后计算的概率,依赖于当前发生的条件。

条件概率:记事件A发生的概率为P(A),事件B发生的概率为P(B),则在B事件发生的前提下,A事件发生的概率即为条件概率,记为P(A|B)。

在这里插入图片描述

贝叶斯公式:贝叶斯公式便是基于条件概率,通过P(B|A)来求P(A|B),如下:

在这里插入图片描述

将A看成“规律”,B看成“现象”,那么贝叶斯公式可以看成:

在这里插入图片描述

全概率公式:表示若事件A1,A2,…,An构成一个完备事件组且都有正概率,则对任意一个事件B都有公式成立:

在这里插入图片描述

将全概率公式带入贝叶斯公式中,得到:

在这里插入图片描述

2. 朴素贝叶斯

2.1 朴素贝叶斯原理

特征条件假设:假设每个特征之间没有联系,给定训练数据集,其中每个样本x都包括n维特征,即x = (x1,x2,…,xn),类标记集合含有k种类别,即y = (y1,y2,…,yk)。

对于给定的新样本x,判断其属于哪个标记的类别,根据贝叶斯定理,可以得到x属于yk类别的概率P(yk|x):

在这里插入图片描述

最大的类别记为预测类别,即:在这里插入图片描述

朴素贝叶斯算法对条件概率分布作出了独立性的假设,通俗地讲就是说假设各个维度的特征x1,x2,…,xn互相独立,在这个假设的前提上,条件概率可以转化为:

在这里插入图片描述

代入上面贝叶斯公式中,得到:

在这里插入图片描述

于是,朴素贝叶斯分类器可表示为:

在这里插入图片描述

因为对所有的yk,上式中的分母的值都是一样的,所以可以忽略分母部分,朴素贝叶斯分类器最终表示为:

在这里插入图片描述

2.2 朴素贝叶斯适用范围

朴素贝叶斯只适用于特征之间是条件独立的情况下,否则分类效果不好,这里的朴素指的就是条件独立。

朴素贝叶斯主要被广泛地使用在文档分类中。

2.3 朴素贝叶斯常用模型

朴素贝叶斯常用的模型如下:
(1)高斯模型:处理特征是连续型变量的情况。
(2)多项式模型:最常见,要求特征是离散数据。
(3)伯努利模型:要求特征是离散的,且为布尔类型,即true和false,或者1和0。

3. 朴素贝叶斯算法的特点

优点:
1、朴素贝叶斯模型有稳定的分类效率。
2、对小规模的数据表现很好,能处理多分类任务,适合增量式训练,尤其是数据量超出内存时,可以一批批的去增量训练。
3、对缺失数据不太敏感,算法也比较简单,常用于文本分类。

缺点:
1、需要知道先验概率,且先验概率很多时候取决于假设,假设的模型可以有很多种,因此在某些时候会由于假设的先验模型的原因导致预测效果不佳。
2、对输入数据的表达形式很敏感(离散、连续,值极大极小之类的)。

4. 朴素贝叶斯的Python应用

在sklearn库中提供了GaussianNB、MultinomialNB和BernoulliNB 3种朴素贝叶斯模型,下面以GaussianNB为例。

测试代码如下:

# 导入包
from sklearn.naive_bayes import GaussianNB  # 高斯分布,假定特征服从正态分布的
from sklearn.model_selection import train_test_split # 数据集划分
from sklearn.metrics import accuracy_score

# 导入数据集
from sklearn import datasets
iris = datasets.load_iris()

# 拆分数据集,random_state:随机数种子
train_x,test_x,train_y,test_y = train_test_split(iris.data,iris.target,random_state=12) 

# 建模
gnb_clf = GaussianNB()
gnb_clf.fit(train_x,train_y)

# 对测试集进行预测
# predict():直接给出预测的类别
# predict_proba():输出的是每个样本属于某种类别的概率
predict_class = gnb_clf.predict(test_x)
# predict_class_proba = gnb_clf.predict_proba(test_x)
print("测试集准确率为:",accuracy_score(test_y,predict_class))

输出结果如下:

测试集准确率为: 0.9736842105263158

5. 源码仓库地址

图像处理、机器学习的常用算法汇总

你可能感兴趣的:(机器学习,算法,机器学习,人工智能)