斯坦福机器学习实现与分析之六(朴素贝叶斯)

  朴素贝叶斯(Naive Bayes)适用于离散特征的分类问题,对于连续问题则需将特征离散化后使用。朴素贝叶斯有多元伯努利事件模型和多项式事件模型,在伯努利事件模型中,特征每一维的值只能是0或1,而多项式模型中特征每一维的值可取0到N之间的整数,因此伯努利模型是多项式模型的一种特例,下面的推导就直接使用伯努利模型。

朴素贝叶斯原理推导



  与GDA类似,朴素贝叶斯对一个测试样本分类时,通过比较p(y=0|x)和p(y=1|x)来进行决策。根据贝叶斯公式:

\( \begin{aligned} p(y=1|x)=\frac{p(x|y=1)p(y=1)}{p(x)} \end{aligned}\)

  其中x是一个多维向量,\(x=(x_1,x_2,…,x_n)\),则

\( \begin{aligned} p(x|y)=p(x_1|y)p(x_2|y,x_1)p(x_3|y,x_1,x_2)…p(x_n|y,x_1,x_2,…,x_{n-1}) \end{aligned}\)

  上面这个式子如此多的条件概率,可没法求呀。那么就限定一下条件,使得特殊情况下可以求解,于是就有了下面这个很Naive的假设:

  在给定类别y的条件下,\(x_i\;(i=1,2,…,n)\)直接相互独立。

  这个假设表达的意思是在每个类别内部,特征x的每一维与其他维没有关系,需要注意的是此条件独立并不等价于完全独立。这个假设的直观表达是:

\( \begin{aligned} p(x_i|y,x_j)= p(x_i|y,x_j)\;(all\; i \neq j) \end{aligned}\)

  基于此假设,上面的公式就可写成:

\( \begin{aligned} p(x|y)=p(x_1|y)p(x_2|y)p(x_3|y)…p(x_n|y)=\prod_{i=1}^n{p(x_i|y)} \end{aligned}\)

  对于一个训练样本集合\( \{(x^{(1)},y^{(1)}), (x^{(2)},y^{(2)}),...,(x^{(m)},y^{(m)})\}\),\(x^{(i)}=(x^{(i)}_1,x^{(i)}_2,...,x^{(i)}_n)\),\( n_i=\sum_{j=1}^n{x^{(i)}_j}\),其似然函数为:

\( \begin{aligned} L&=\prod_{i=1}^m{p(x^{(i)},y^{(i)})} \\&=\prod_{i=1}^m{p(x^{(i)}|y^{(i)})p(y^{(i)})} \\&=\prod_{i=1}^m{\prod_{j=1}^{n_i}p(x^{(i)}_j|y^{(i)})p(y^{(i)})}    \end{aligned} \)

  与高斯判别分析中的推导类似,对似然函数取对数并最大化,通过求导可求解出:

\( \begin{aligned} \phi_{k|y=1}=p(x^{(i)}=k|y=1)=\frac{\sum_{i=1}^m{\sum_{j=1}^{n_i}I(x^{(i)}_j=k\;and\;y^{(i)}=1)}}{\sum_{i=1}^m{I(y^{(i)}=1)n_i}}\end{aligned}\)

\( \begin{aligned} \phi_{k|y=0}=p(x^{(i)}=k|y=0)=\frac{\sum_{i=1}^m{\sum_{j=1}^{n_i}I(x^{(i)}_j=k\;and\;y^{(i)}=0)}}{\sum_{i=1}^m{I(y^{(i)}=0)n_i}}\end{aligned}\)

\( \begin{aligned} \phi_y=p(y=1)=\frac{\sum_{i=1}^m{I(y^{(i)}=1)}}{m} \end{aligned}\)

  式中I为指示函数。

拉普拉斯平滑



  对于上面推导的公式,假设\(x_i\)的理论取值范围是0~99,但我们的训练样本中,没有任何一个样本中出现过99这个值,那么按照上面贝叶斯公式计算,会出现0/0的情况。基于这一点,对上面公式做一点修正,如下所示:

\( \begin{aligned} \phi_{k|y=1}=p(x_i=k|y=1)=\frac{\sum_{i=1}^m{\sum_{j=1}^{n_i}I(x^{(i)}_j=k\;and\;y^{(i)}=1)}+1}{\sum_{i=1}^m{I(y^{(i)}=1)n_i}+N} \end{aligned}\)

\( \begin{aligned} \phi_{k|y=0}=p(x_i=k|y=0)=\frac{\sum_{i=1}^m{\sum_{j=1}^{n_i}I(x^{(i)}_j=k\;and\;y^{(i)}=0)}+1}{\sum_{i=1}^m{I(y^{(i)}=0)n_i}+N} \end{aligned}\)

  式中N即是\(x_i\)理论取值数。如此修正意义何在?做上述修正,对于理论上可能存在的状态,基本其多次试验没有发生,但我们也不否认其存在的可能性,只是认为其出现的可能性很小而已。一个直观的例子,我们都知道抛硬币正反面的概率都为0.5,但你抛100次却每次都是正面,即便如此相信你也不会认为抛出反面的概率是0吧?不过出现如此现象则可能让我怀疑此硬币设计有什么问题导致出现反面的概率如此之低。

朴素贝叶斯实现



  到这里算法实现基本就是按照上面的公式来进行训练和判别了,在matlab的训练代码为:

 1 %phi_0(k)=p(x_i=k|y=0) for any i
 2 %phi_1(k)=p(x_i=k|y=1) for any i
 3 %phi=p(y=1)
 4 function [phi_0, phi_1, phi] = NaiveBayesTrain(Feature, Label, V)
 5     idx0 = find(Label == 0);
 6     idx1 = find(Label == 1);
 7
 8     %calc phi_y
 9     phi = length(idx1) / length(Label);
10
11     n = sum(Feature, 2);
12     n0 = sum(n(idx0));
13     n1 = sum(n(idx1));
14
15     phi_0 = (sum(Feature(idx0, :), 1) + 1) / (n0 + V);
16     phi_1 = (sum(Feature(idx1, :), 1) + 1) / (n1 + V);
17 end

  在判别时,理论上需要计算出p(y=0|x)和p(y=1|x)的值,但实际应用时,只需比较二者大小即可,他们分母都相同,可以忽略,分子部分两边取对数可简化为判断\( log\;p(x|y=1)+log\;p(y=1)\)和\( log\;p(x|y=0)+log\;p(y=0)\)的大小,具体代码如下:

1 function label = NaiveBayesDiscriminate(phi_0, phi_1, phi, Feature)
2     log_p0 = Feature * (log(phi_0))‘ + log(1 - phi);
3     log_p1 = Feature * (log(phi_1))‘ + log(phi);
4     label = log_p0 < log_p1;
5 end

  测试数据采用Andrew Ng网站上给出的垃圾邮件特征,特征如下:

      

  第1列代表邮件编号,第二列代表单词在词典的次序,第三列代表该单词出现的次数,对应的训练和测试样本数据在这里。测试代码为:

 1 clear all; clc
 2
 3 %训练样本数
 4 numTrainDocs = 700;
 5 %字典单词数,即每个x_i取值范围
 6 numTokens = 2500;
 7
 8 %读取训练样本特征文件以及标签,转换为700x2500的矩阵,每行代表一封邮件
 9 train_labels = dlmread(‘train-labels.txt‘);
10 M = dlmread(‘train-features.txt‘, ‘ ‘);
11 spmatrix = sparse(M(:,1), M(:,2), M(:,3), numTrainDocs, numTokens);
12 train_matrix = full(spmatrix);
13
14 %naivebayes训练
15 [phi_0, phi_1, phi] = NaiveBayesTrain(train_matrix, train_labels, numTokens);
16
17 %读取测试样本,格式同上
18 test_labels = dlmread(‘test-labels.txt‘);
19 N = dlmread(‘test-features.txt‘, ‘ ‘);
20 spmatrix = sparse(N(:,1), N(:,2), N(:,3));
21 test_matrix = full(spmatrix);
22
23 %naivebayes测试
24 label = NaiveBayesDiscriminate(phi_0, phi_1, phi, test_matrix);
25
26 %计算正确率
27 err = sum(abs(label - test_labels));
28 str = sprintf(‘result:err/all: %d / %d [%.2f%%]‘, err, length(test_labels), 100 * err / length(test_labels));
29 disp(str)

  测试输出结果为:

  即错误率仅为1.9%。

算法分析



  1.朴素贝叶斯那个很朴素的假设是条件独立而非独立,这一点必须要明确。实际上这是一个强假设,大多情况下问题不满足该假设却表现良好,这也算贝叶斯理论的一个特色吧。

  2.算法计算了样本类别的先验分布,因此训练集正负样本数量需要符合其先验分布,这一点与GDA是类似。更进一步,所有的生成学习算法都要计算先验概率,故而对训练样本都有类似的要求。

时间: 2024-10-13 00:12:46

斯坦福机器学习实现与分析之六(朴素贝叶斯)的相关文章

机器学习基础——带你实战朴素贝叶斯模型文本分类

本文始发于个人公众号:TechFlow 上一篇文章当中我们介绍了朴素贝叶斯模型的基本原理. 朴素贝叶斯的核心本质是假设样本当中的变量服从某个分布,从而利用条件概率计算出样本属于某个类别的概率.一般来说一个样本往往会含有许多特征,这些特征之间很有可能是有相关性的.为了简化模型,朴素贝叶斯模型假设这些变量是独立的.这样我们就可以很简单地计算出样本的概率. 想要回顾其中细节的同学,可以点击链接回到之前的文章: 机器学习基础--让你一文学会朴素贝叶斯模型 在我们学习算法的过程中,如果只看模型的原理以及理

C#编程实现朴素贝叶斯算法下的情感分析

C#编程实现 这篇文章做了什么 朴素贝叶斯算法是机器学习中非常重要的分类算法,用途十分广泛,如垃圾邮件处理等.而情感分析(Sentiment Analysis)是自然语言处理(Natural Language Progressing)中的重要问题,用以对文本进行正负面的判断,以及情感度评分和意见挖掘.本文借助朴素贝叶斯算法,针对文本正负面进行判别,并且利用C#进行编程实现. 不先介绍点基础? 朴素贝叶斯,真的很朴素 朴素贝叶斯分类算法,是一种有监督学习算法,通过对训练集的学习,基于先验概率与贝叶

实现 | 朴素贝叶斯模型算法研究与实例分析

实现 | 朴素贝叶斯模型算法研究与实例分析(白宁超2018年9月4日09:03:21) 导读:朴素贝叶斯模型是机器学习常用的模型算法之一,其在文本分类方面简单易行,且取得不错的分类效果.所以很受欢迎,对于朴素贝叶斯的学习,本文首先介绍理论知识即朴素贝叶斯相关概念和公式推导,为了加深理解,采用一个维基百科上面性别分类例子进行形式化描述.然后通过编程实现朴素贝叶斯分类算法,并在屏蔽社区言论.垃圾邮件.个人广告中获取区域倾向等几个方面进行应用,包括创建数据集.数据预处理.词集模型和词袋模型.朴素贝叶斯

(笔记)斯坦福机器学习第六讲--朴素贝叶斯

本讲内容 1. Naive Bayes(朴素贝叶斯) 2.Event models(朴素贝叶斯的事件模型) 3.Neural network (神经网络) 4.Support vector machines(支持向量机) 1.朴素贝叶斯 上讲中的垃圾邮件问题有几个需要注意的地方: (1)  一个单词只有出现和不出现两种可能,因此每个特征x只有两个取值 (2) 特征向量x的个数应该等于词典的长度,比如  将该算法一般化: (1) 让 可以取更多的值 此时  服从多项式分布,而不再是伯努利分布.一种

斯坦福《机器学习》Lesson5感想———2、朴素贝叶斯算法

朴素贝叶斯算法与上篇中写到到生成学习算法的思想是一致的.它不需要像线性回归等算法一样去拟合各种假设的可能,只需要计算各种假设的概率,然后选择概率最高的那种假设分类类别.其中还添入了一个贝叶斯假定:在给定目标值y时属性值x之间相互独立.这样的分类算法被称为朴素贝叶斯分类器(Naive Bayes classifier)  . 1.朴素贝叶斯算法 在朴素贝叶斯算法的模型里,给定的训练集为, 可计算,.因为贝叶斯假定,可以计算出联合似然概率函数: 最大化联合似然概率函数可得到: 然后我们就可以对新的数

斯坦福CS229机器学习课程笔记四:GDA、朴素贝叶斯、多项事件模型

生成学习与判别学习 像逻辑回归,用hθ(x) = g(θTx) 直接地来建模 p(y|x; θ) :或者像感知机,直接从输入空间映射到输出空间(0或1),它们都被称作判别学习(discriminative learning).与之相对的是生成学习(generative learning),先对 p(x|y) 与 p(y) 建模,然后通过贝叶斯法则导出后验条件概率分布分母的计算规则为全概率公式:p(x) = p(x|y = 1)p(y = 1) + p(x|y =0)p(y = 0).这一节介绍的

《机器学习实战》学习笔记:基于朴素贝叶斯的分类方法

概率是许多机器学习算法的基础,在前面生成决策树的过程中使用了一小部分关于概率的知识,即统计特征在数据集中取某个特定值的次数,然后除以数据集的实例总数,得到特征取该值的概率. 目录: 一.基于贝叶斯理论的分类方法 二.关于朴素贝叶斯的应用场景 三.基于Python和朴素贝叶斯的文本分类 1.准备数据 2.训练算法 3.测试算法 四.小结 以下进入正文: 一.基于贝叶斯理论的分类方法 假设有两类数据组成的数据集如下: 其中,假设两个概率分布的参数已知,并用p1(x,y)表示当前数据点(x,y)属于类

[机器学习&amp;数据挖掘]朴素贝叶斯数学原理

1.准备: (1)先验概率:根据以往经验和分析得到的概率,也就是通常的概率,在全概率公式中表现是“由因求果”的果 (2)后验概率:指在得到“结果”的信息后重新修正的概率,通常为条件概率(但条件概率不全是后验概率),在贝叶斯公式中表现为“执果求因”的因 例如:加工一批零件,甲加工60%,乙加工40%,甲有0.1的概率加工出次品,乙有0.15的概率加工出次品,求一个零件是不是次品的概率即为先验概率,已经得知一个零件是次品,求此零件是甲或乙加工的概率是后验概率 (3)全概率公式:设E为随机试验,B1,

《机器学习实战》学习笔记:基于朴素贝叶斯的垃圾邮件过滤

概率是许多机器学习算法的基础,在前面生成决策树的过程中使用了一小部分关于概率的知识,即统计特征在数据集中取某个特定值的次数,然后除以数据集的实例总数,得到特征取该值的概率. 之前的基础实验中简单实现了朴素贝叶斯分类器,并正确执行了文本分类,这一节将贝叶斯运用到实际场景,垃圾邮件过滤这一实际应用. 实例:使用朴素贝叶斯过滤垃圾邮件 在上一节:http://blog.csdn.net/liyuefeilong/article/details/48383175中,使用了简单的文本文件,并从中提取了字符