机器学习-朴素贝叶斯实例分析
本节主要给出一个朴素贝叶斯的实例。
引文:由于之前讲过了朴素贝叶斯的理论Stanford机器学习[第五讲]-生成学习算法第四部分,同时朴素贝叶斯的算法实现也讲过了,见机器学习算法-朴素贝叶斯Python实现。那么这节课打算讲解一下朴素贝叶斯算法的具体计算流程,通过一个具体的实例来讲解。
PS:为了专注于某一个细节,本章节只抽取了视频的一部分来讲解,只讲解一个贝叶斯算法的计算流程,关于视频里面的具体内容请参考下面的视频链接。
讲解的实例是一个文本分类的例子,区分一句话是粗鲁的还是文明的,类别标签只有Yes或No,表示是粗鲁的和不是粗鲁的语句。
1.给定一个训练集
| Words | Label |
|---|---|
| my name is Devin. | No |
| you are stupid. | Yes |
| my boyfriend is SB. | Yes |
| you looks very smart,I like you very much. | No |
上面这个数据集是我随机取的,label表示的是是否粗鲁。
2.处理数据
首先根据上面给出的数据构建出一个词库出来,如下:
【”my”,“name”,“is”,“Devin”,“you”,“are”,“stupid”,“boyfriend”,“SB”,“looks”,
“very”,“smart”,”like”,”much”】
这个词库总单词个数只有14个,相对而言比较少,这里只做个例子,单词多的情况下同样处理。
然后将每个样本映射到词库中,得到一个大的矩阵
| my | name | is | Devin | you | are | stupid | boyfriend | SB | looks | very | smart | like | much | classLabel |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
| 1 | 0 | 1 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 1 |
| 1 | 0 | 0 | 0 | 2 | 0 | 0 | 0 | 0 | 1 | 2 | 1 | 1 | 1 | 0 |
上面是得到的一个词频矩阵,最后一栏表示的是类标号,下面通过这个词频举证来计算不同类标号下每个词发生的概率,即条件概率
p(xi|y=1)
<script type="math/tex" id="MathJax-Element-1"> p(x_i|y=1) </script> 和
p(xi|y=0)
<script type="math/tex" id="MathJax-Element-2"> p(x_i|y=0)</script>。
实际的处理中为了防止0概率的发生,通常是将词频矩阵初始化为1,这里就不这么做了,简单化计算吧。
3.计算
设几个变量:
- numWords <script type="math/tex" id="MathJax-Element-3">numWords</script>:表示单词的总数
- p1Mat <script type="math/tex" id="MathJax-Element-4">p1Mat</script>:表示正样本中各单词出现的次数矩阵
- p0Num <script type="math/tex" id="MathJax-Element-5">p0Num</script>:表示负样本中各单词出现的次数矩阵
- p1Vec <script type="math/tex" id="MathJax-Element-6">p1Vec</script>:表示正负样本条件下的各单词的出现的概率,即条件概率 p(xi|y=0) <script type="math/tex" id="MathJax-Element-7">p(x_i|y=0)</script>
- p0Vec <script type="math/tex" id="MathJax-Element-8">p0Vec</script>:表示在负样本条件下的各单词的出现的概率,即条件概率 p(xi|y=0) <script type="math/tex" id="MathJax-Element-9">p(x_i|y=0)</script>
- pPos <script type="math/tex" id="MathJax-Element-10">pPos</script>:表示正样本概率
- pNeg <script type="math/tex" id="MathJax-Element-11">pNeg</script>:表示负样本概率
可以根据上面的词频表计算得到:
numWords=14
<script type="math/tex" id="MathJax-Element-12">numWords=14</script>
p1Num=[1,0,1,0,1,1,1,1,1,0,0,0,0,0]
<script type="math/tex" id="MathJax-Element-13">p1Num=[1,0 ,1 ,0 ,1 , 1, 1,1 , 1,0 , 0, 0, 0, 0 ]</script>
p0Num=[2,1,1,1,2,0,0,0,0,1,2,1,1,1]
<script type="math/tex" id="MathJax-Element-14">p0Num=[2,1 ,1 ,1,2 , 0, 0,0 , 0,1 , 2, 1, 1, 1 ]</script>
样本中在类标签为1的单词出现的总次数p1Count=7
样本中在类标签为0的单词出现的总次数p0Count=12
让举证p1Num和p0Num分别除以p1Count和p0Count,即可以得到各自的条件概率:
p1Vec=[1/7,0,1/7,0,1/7,1/7,1/7,1/7,1/7,0,0,0,0,0]
<script type="math/tex" id="MathJax-Element-15">p1Vec=[1/7,0 ,1/7 ,0 ,1/7 , 1/7, 1/7,1/7 , 1/7,0 , 0, 0, 0, 0 ]</script>
p0Vec=[2/12,1/12,1/12,1/12,2/12,0,0,0,0,1/12,2/12,1/12,1/12,1/12]
<script type="math/tex" id="MathJax-Element-16">p0Vec=[2/12,1/12 ,1/12 ,1/12,2/12 , 0, 0,0 , 0,1 /12, 2/12, 1/12, 1/12, 1/12 ]</script>
条件概率求出来了,那么怎么来计算区分类别呢?
根据贝叶斯公式
因为预测一句话所属的类别,我们的 p(x) <script type="math/tex" id="MathJax-Element-18">p(x)</script>是一样的所以比较 p(y=1|x) <script type="math/tex" id="MathJax-Element-19">p(y=1|x)</script>和 p(y=0|x) <script type="math/tex" id="MathJax-Element-20">p(y=0|x)</script>时,我们实际上只需要比较分子就可以了。
由于x有多个特征,上面分子子中的
p(x|y)
<script type="math/tex" id="MathJax-Element-21">p(x|y)</script>事实上是这样的
所以在处理时,通常是对分子取对数后再进行比较,转变为
和
的大小比较。对于分子 p(y)p(x|y) <script type="math/tex" id="MathJax-Element-25">p(y)p(x|y)</script>, p(y) <script type="math/tex" id="MathJax-Element-26">p(y)</script>可以直接求出来,而 p(x|y) <script type="math/tex" id="MathJax-Element-27">p(x|y)</script>是上面的条件概率 p1Vec <script type="math/tex" id="MathJax-Element-28">p1Vec</script>和 p0Vec <script type="math/tex" id="MathJax-Element-29">p0Vec</script>。
最后比较两个大小,如果
p1>p0
<script type="math/tex" id="MathJax-Element-30">p1>p0</script>,表示这句话是脏话,如果
p1<p0
<script type="math/tex" id="MathJax-Element-31">p1 假设我现在要测试下面一句话:“I like you.” 则通过预测比较 可以得到结果是
p1<p0
<script type="math/tex" id="MathJax-Element-34">p1 [1] 机器学习实战 4.测试
和
Reference
[2]视频链接:http://open.163.com/movie/2008/1/7/H/M6SGF6VB4_M6SGJVV7H.html
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)