Python教程

「机器学习算法的数学解析与Python实现」朴素贝叶斯算法

本文主要是介绍「机器学习算法的数学解析与Python实现」朴素贝叶斯算法,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

朴素贝叶斯分类算法应该是统计学味道最浓的一款算法。统计学有两大学派,分别是频率学派和贝叶斯学派。

朴素贝叶斯分类算法的核心要义正是贝叶斯学派中的贝叶斯公式。

朴素贝叶斯:用骰子选择

贝叶斯公式的4个重要概念:

  • 条件概率
  • 先验概率
  • 后验概率
  • 似然度

朴素贝叶斯(Naive Bayes)由两部分组成,”Naive“是一种带有假设的限定条件,”Bayes“指贝叶斯公式,因此朴素贝叶斯指的是在”朴素“假设条件下使用”贝叶斯公式“。

贝叶斯的核心是条件概率,\(P(B|A)\) 越大,说明一旦发生了 \(A\) ,就越有可能发生 \(B\) ,两者可能存在较高的相关性,相关性就是贝叶斯要表达的思想。

相关性并非因果性。

用贝叶斯进行选择

举例

班上10位女同学,其中一位叫“安吉”,光看背影猜中的谁是安吉利的概率是 \(P(安吉)=10\%\) ,这就是先验概率

班上女同学一共三种发型,扎马尾的概率大概为 \(P(马尾) = 30\%\) ,而安吉非常喜欢扎马尾,概率 \(P(马尾|安吉) = 70\%\) 。

如果此时从背影看到一位扎马尾的女同学,根据贝叶斯公式:

\[P(马尾) \cdot P(安吉|马尾) = P(安吉) \cdot P(马尾|安吉) \]

可以得出:

\[P(安吉|马尾) = \frac{P(安吉) \cdot P(马尾|安吉)}{P(马尾)} = \frac{10\% \cdot 70\%}{30\%} = 23.3\% \]

朴素贝叶斯分类的算法原理

基本思路

如果把例子中的“扎马尾”看作女同学数据样本的一种特征,把“是不是安吉”看作分类问题,那么其实就是用贝叶斯公式解决分类问题的基本思路。

当然,例子中只有“是否扎马尾”一个特征,而现实中特征数量远不止这一个。

“Naive”就是简单的认为特征之间彼此独立,使得贝叶斯公式的计算可以大大简化。

数学解析

贝叶斯公式:

\[P(y|x) = \frac{P(y)P(x|y)}{P(x)} \]

在公式中,\(P(y)\)称为先验概率,\(P(y|x)\)称为后验概率,而\(P(x|y)\)则称作似然度。

把贝叶斯公式中的\(y\)看作某个类别,把\(x\)当做特征,那么公式变成:

\[P(y|x_1,\cdots,x_n) = \frac{P(y)P(x_1,\cdots,x_n|y)}{P(x_1,\cdots,x_n)} \]

特征值越多,要统计这些特征同时出现的概率就越困难。因此朴素贝叶斯做了一个“naive”的假设,即特征之间是相互独立、互不影响的

如此一来,式子就能化简。某个特征的似然度就能简化为:

\[P(x_i|x_1,\cdots,x_{i-1},x_{i+1},\cdots,x_n) = P(x_i|y) \]

所以,在“naive”假设下,求后验概率就变成了:

\[P(y|x_1,\cdots,x_n) \propto P(y) \prod_{i=1}^n P(x_i|y) \]

这里不太理解为啥就直接变成正比了,解释的看不懂。

朴素贝叶斯的优化方法

朴素贝叶斯的学习过程是通过比较不同特征与类之间的似然关系,最后把似然度最大的那个类作为预测结果。

数学表达式如下:

\[\hat{y} = \arg \max_y P(y) \prod_{i=1}^n P(x_i|y) \]

不太理解。。。

具体步骤

朴素贝叶斯分类算法信息表

album_temp_1612593056

使用朴素贝叶斯算法,需要三步:

  1. 从样本数据中统计先验概率\(P(y)\)和似然度\(P(x|y)\)。

在Python中使用朴素贝叶斯分类算法

基于贝叶斯的算法模型相关类库都在sklearn.naive_bayes包中。

根据似然度计算方法不同,朴素贝叶斯可分为4种子算法类,本文介绍多项式朴素贝叶斯(Multinomial NaiveBayes)的类MultinomialNB

用法如下:

from sklearn.datasets import load_iris

# 导入朴素贝叶斯模型中的多项式朴素贝叶斯分类算法
from sklearn.naive_bayes import MultinomialNB

# 鸢尾花数据集
X, y = load_iris(return_X_y=True)

# 训练模型
clf = MultinomialNB().fit(X, y)

# 使用模型进行分类预测
clf.predict(X)

预测结果如下:

array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 2, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 1,
       2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])

使用默认的性能评估器评分:

clf.score(X, y)

性能得分如下:

0.9533333333333334

朴素贝叶斯分类算法的使用场景

朴素贝叶斯分类算法以统计学概率论为数学基础,可解释性较强。在垃圾邮件筛选、文本分类领域效果较好。如果数据分布情况与朴素的假设冲突,特征之间具有明显关联性时,就不适合使用朴素贝叶斯算法。

朴素贝叶斯分类算法特点

album_temp_1612593725

算法使用案例

朴素贝叶斯算法用于垃圾邮件识别效果良好。

这篇关于「机器学习算法的数学解析与Python实现」朴素贝叶斯算法的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!