一般地,贝叶斯算法可用于新闻分类,文本分类以及邮件分类

贝叶斯统计学方法 = 总体信息 + 样本信息 + 先验信息

  • 总体信息:当前总体样本符合某种分布。比如抛硬币,二项分布。学生某一科的成绩符合正态分布
  • 样本信息:通过抽样得到的部分样本的某种分布。
  • 先验信息:抽样之前,有关推断问题中位置参数的一些信息,通常来源于经验或历史资料(比如让一个音乐家猜某歌曲的作者和让一个小学生猜某歌曲的作者,音乐家具有先验信息)

古典学派和贝叶斯学派的矛盾:是否承认先验知识

贝叶斯定理:

【ML笔记】贝叶斯算法_先验概率


对公式的分析: 后验概率 = 先验概率 * 调整因子

  • 如果调整因子>1,意味着’先验概率’被增强,事件A的发生的可能性变大;
  • 如果调整因子=1,意味着B事件无助于判断事件A的可能性;
  • 如果调整因子<1,意味着"先验概率"被削弱,事件A的可能性变小

在邮件分类的应用中:

  • P(A):是垃圾邮件的概率
  • P(B):带有某特征的邮件的概率
  • P(A|B):已知一封邮件具有某特征,该邮件为垃圾邮件的概率

朴素贝叶斯:

X1,X2,…,Xn之间相互独立,则

【ML笔记】贝叶斯算法_先验概率_02

我们大脑中也是有贝叶斯算法的:

【ML笔记】贝叶斯算法_先验概率_03


在Line1中,由于我们的大脑认识A、C,存在先验信息,因此我们会把Line1的图案当作字母“B”。而Line2中,由于两侧是12、14,我们的大脑会帮我们把图案理解为数字“13”。由于有了“样本信息”和“先验信息”,我们会将相同的图案理解为不同的含义。

利用朴素贝叶斯进行文档分类

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


def navieBayes():
"""
朴素贝叶斯进行文本分类
:return: None
"""
news = fetch_20newsgroups(subset='all')
# 进行数据分割,分成训练集和测试集
x_train, x_test, y_train, y_test = train_test_split(news.data, news.target, test_size=0.25)
# 对数据集进行特征抽取
tfidf = TfidfVectorizer()
# 抽取训练集的特征,x_train由文本变成特征矩阵
x_train = tfidf.fit_transform(x_train)
print(tfidf.get_feature_names())
print('训练集统计结果为:', x_train.toarray())
# x_train由文本变成特征矩阵
x_test = tfidf.transform(x_test)
# 实例化朴素贝叶斯对象,alpha表示拉普拉斯平滑系数,确保概率不为0
mlt = MultinomialNB(alpha=1.0)
# 将训练集的特征值和目标值传入API进行计算,计算每个词在特定类别文章中出现的次数
mlt.fit(x_train, y_train)
# 给测试数据,得到文章分类的预测结果
y_predict = mlt.predict(x_test)
print('预测的文章类别为:', y_predict)
# 得出准确率
print('准确率为:',mlt.score(x_test, y_test))


if __name__ == '__main__':
navieBayes()

朴素贝叶斯的优缺点

优点:

  1. 朴素贝叶斯发源于古典数学理论,有稳定的分类效率
  2. 对缺失数据不敏感,算法较简单,常用于文本分类
  3. 分类准确度高,速度快

缺点:

  1. 由于使用了样本属性独立性的假设,所以如果样本属性有关联试效果不好