介绍朴素贝叶斯分类器的文章已经很多了。本文的目的是通过基本概念和微小实例的复述,巩固对于朴素贝叶斯分类器的理解。

一 朴素贝叶斯分类器基础回顾

朴素贝叶斯分类器基于贝叶斯定义,特别适用于输入数据维数较高的情况。虽然朴素贝叶斯分类器很简单,但是它确经常比一些复杂的方法表现还好。

为了简单阐述贝叶斯分类的基本原理,我们使用上图所示的例子来说明。作为先验,我们知道一个球要么是红球要么是绿球。我们的任务是当有新的输入(New Cases)时,我们给出新输入的物体的类别(红或者绿)。这是贝叶斯分类器的典型应用-Label,即给出物体标记。

从图中我们 还看到,绿球的数量明显比红球大,那么我们有理由认为:一个新输入(New case)更有可能是绿球。假如绿球的数量是红球的二倍,那么对于一个新输入,它是绿球的概率是它是红球的概率的二倍。

因此,我们知道:

                                                

假设一共有60个球,其中40个是绿球,20个是红球,那么类别的先验概率为:

有了先验概率之后,我们就可以准备对新来的物体(New Object),图中白色圈所示,进行分类。如果要取得比较准确的分类结果,那么我们猜测它是绿球比较保险,也就是新物体与绿球的likelihood比与红球的likelihood更大。那么我们接下来衡量这种相似性-likelihood(似然)。

通过上面的公式,我们可以看出X是绿球的似然比X是红球的似然小,因为在X周围邻域内,有3个红球但是只有1个绿球。因此:

因此,尽管对于先验概率来说,X是绿球的可能性比其是红球的可能性大,但是似然(Likelihood)表现的结果却相反。在贝叶斯分析中,最后的类别是有上述两个概率 (先验和似然),这就是贝叶斯准则:

注:在实际使用时,概率要经过归一化(Normalized)。

二 技术推广

对于一组变量X={x1,x2,x3,,,,,,xd},我们希望构造输出C={c1,c2,c3,,,,,cd}的一个具体取值Cj(比如Cj是一个分类的情况)的先验概率。利用贝叶斯定理可知:

此处p(Cj|x1,x2,,,,,xd)就是Cj的显眼高铝,或者说是X属于Cj这类的概率。朴素贝叶斯假设相互独立变量的条件概率也相互独立。因此:

并且,先验可以写成如下的形式:

通过贝叶斯定义,我们可以在类别向量Cj的条件下估计X的类别标签。

朴素贝叶斯模型可以通过多种形式建模:正态分布,log正态分布,gamma分布和泊松分布(poisson)

注:此处的泊松分布被认为连续分布,当变量是离散值的时候另作处理。

三 例子

假设我们已经有如下数据:

这些数据可以归纳如下:

那么,对于一组新数据:

我们来计算两类的似然:

"yes" = 2/9 * 3/9 * 3/9 * 3/9 * 9/14 = 0.0053
           "no" = 3/5 * 1/5 * 4/5 * 3/5 * 5/14 = 0.0206
    归一化:
          P("yes") = 0.0053 / (0.0053 + 0.0206) = 0.205
          P("no") = 0.0206 / (0.0053 + 0.0206) = 0.795

那么,结论是我们今天 Not play。

四  代码

  1. <span style="font-size: 12px;" abp="387">from __future__ import division
  2. def calc_prob_cls(train, cls_val, cls_name='class'):
  3. '''''
  4. calculate the prob. of class: cls
  5. '''
  6. cnt = 0
  7. for e in train:
  8. if e[cls_name] == cls_val:
  9. cnt += 1
  10. return cnt / len(train)
  11. def calc_prob(train, cls_val, attr_name, attr_val, cls_name='class'):
  12. '''''
  13. calculate the prob(attr|cls)
  14. '''
  15. cnt_cls, cnt_attr = 0, 0
  16. for e in train:
  17. if e[cls_name] == cls_val:
  18. cnt_cls += 1
  19. if e[attr_name] == attr_val:
  20. cnt_attr += 1
  21. return cnt_attr / cnt_cls
  22. def calc_NB(train, test, cls_y, cls_n):
  23. '''''
  24. calculate the naive bayes
  25. '''
  26. prob_y = calc_prob_cls(train, cls_y)
  27. prob_n = calc_prob_cls(train, cls_n)
  28. for key, val in test.items():
  29. print '%10s: %s' % (key, val)
  30. prob_y *= calc_prob(train, cls_y, key, val)
  31. prob_n *= calc_prob(train, cls_n, key, val)
  32. return {cls_y: prob_y, cls_n: prob_n}
  33. if __name__ == '__main__':
  34. #train data
  35. train = [
  36. {"outlook":"sunny", "temp":"hot", "humidity":"high", "wind":"weak", "class":"no" },
  37. {"outlook":"sunny", "temp":"hot", "humidity":"high", "wind":"strong", "class":"no" },
  38. {"outlook":"overcast", "temp":"hot", "humidity":"high", "wind":"weak", "class":"yes" },
  39. {"outlook":"rain", "temp":"mild", "humidity":"high", "wind":"weak", "class":"yes" },
  40. {"outlook":"rain", "temp":"cool", "humidity":"normal", "wind":"weak", "class":"yes" },
  41. {"outlook":"rain", "temp":"cool", "humidity":"normal", "wind":"strong", "class":"no" },
  42. {"outlook":"overcast", "temp":"cool", "humidity":"normal", "wind":"strong", "class":"yes" },
  43. {"outlook":"sunny", "temp":"mild", "humidity":"high", "wind":"weak", "class":"no" },
  44. {"outlook":"sunny", "temp":"cool", "humidity":"normal", "wind":"weak", "class":"yes" },
  45. {"outlook":"rain", "temp":"mild", "humidity":"normal", "wind":"weak", "class":"yes" },
  46. {"outlook":"sunny", "temp":"mild", "humidity":"normal", "wind":"strong", "class":"yes" },
  47. {"outlook":"overcast", "temp":"mild", "humidity":"high", "wind":"strong", "class":"yes" },
  48. {"outlook":"overcast", "temp":"hot", "humidity":"normal", "wind":"weak", "class":"yes" },
  49. {"outlook":"rain", "temp":"mild", "humidity":"high", "wind":"strong", "class":"no" },
  50. ]
  51. #test data
  52. test = {"outlook":"sunny","temp":"cool","humidity":"high","wind":"strong"}
  53. #calculate
  54. print calc_NB(train, test, 'yes', 'no')</span>
from __future__ import division

def calc_prob_cls(train, cls_val, cls_name='class'):
'''
calculate the prob. of class: cls
'''
cnt = 0
for e in train:
if e[cls_name] == cls_val:
cnt += 1 return cnt / len(train) def calc_prob(train, cls_val, attr_name, attr_val, cls_name='class'):
'''
calculate the prob(attr|cls)
'''
cnt_cls, cnt_attr = 0, 0
for e in train:
if e[cls_name] == cls_val:
cnt_cls += 1
if e[attr_name] == attr_val:
cnt_attr += 1 return cnt_attr / cnt_cls def calc_NB(train, test, cls_y, cls_n):
'''
calculate the naive bayes
'''
prob_y = calc_prob_cls(train, cls_y)
prob_n = calc_prob_cls(train, cls_n)
for key, val in test.items():
print '%10s: %s' % (key, val)
prob_y *= calc_prob(train, cls_y, key, val)
prob_n *= calc_prob(train, cls_n, key, val) return {cls_y: prob_y, cls_n: prob_n} if __name__ == '__main__':
#train data
train = [
{"outlook":"sunny", "temp":"hot", "humidity":"high", "wind":"weak", "class":"no" },
{"outlook":"sunny", "temp":"hot", "humidity":"high", "wind":"strong", "class":"no" },
{"outlook":"overcast", "temp":"hot", "humidity":"high", "wind":"weak", "class":"yes" },
{"outlook":"rain", "temp":"mild", "humidity":"high", "wind":"weak", "class":"yes" },
{"outlook":"rain", "temp":"cool", "humidity":"normal", "wind":"weak", "class":"yes" },
{"outlook":"rain", "temp":"cool", "humidity":"normal", "wind":"strong", "class":"no" },
{"outlook":"overcast", "temp":"cool", "humidity":"normal", "wind":"strong", "class":"yes" },
{"outlook":"sunny", "temp":"mild", "humidity":"high", "wind":"weak", "class":"no" },
{"outlook":"sunny", "temp":"cool", "humidity":"normal", "wind":"weak", "class":"yes" },
{"outlook":"rain", "temp":"mild", "humidity":"normal", "wind":"weak", "class":"yes" },
{"outlook":"sunny", "temp":"mild", "humidity":"normal", "wind":"strong", "class":"yes" },
{"outlook":"overcast", "temp":"mild", "humidity":"high", "wind":"strong", "class":"yes" },
{"outlook":"overcast", "temp":"hot", "humidity":"normal", "wind":"weak", "class":"yes" },
{"outlook":"rain", "temp":"mild", "humidity":"high", "wind":"strong", "class":"no" },
]
#test data
test = {"outlook":"sunny","temp":"cool","humidity":"high","wind":"strong"} #calculate
print calc_NB(train, test, 'yes', 'no')

输出为:

   outlook: sunny
           wind: strong
           temp: cool
          humidity: high
{'yes': 0.0052910052910052907, 'no': 0.020571428571428574}

PGM学习之三 朴素贝叶斯分类器(Naive Bayes Classifier)的更多相关文章

  1. 数据挖掘十大经典算法(9) 朴素贝叶斯分类器 Naive Bayes

    贝叶斯分类器 贝叶斯分类器的分类原理是通过某对象的先验概率,利用贝叶斯公式计算出其后验概率,即该对象属于某一类的概率,选择具有最大后验概率的类作为该对象所属的类.眼下研究较多的贝叶斯分类器主要有四种, ...

  2. 十大经典数据挖掘算法(9) 朴素贝叶斯分类器 Naive Bayes

    贝叶斯分类器 贝叶斯分类分类原则是一个对象的通过先验概率.贝叶斯后验概率公式后计算,也就是说,该对象属于一类的概率.选择具有最大后验概率的类作为对象的类属.现在更多的研究贝叶斯分类器,有四个,每间:N ...

  3. 朴素贝叶斯分类法 Naive Bayes ---R

    朴素贝叶斯算法 [转载时请注明来源]:http://www.cnblogs.com/runner-ljt/ Ljt   勿忘初心  无畏未来 作为一个初学者,水平有限,欢迎交流指正. 朴素贝叶斯分类法 ...

  4. 机器学习---朴素贝叶斯分类器(Machine Learning Naive Bayes Classifier)

    朴素贝叶斯分类器是一组简单快速的分类算法.网上已经有很多文章介绍,比如这篇写得比较好:https://blog.csdn.net/sinat_36246371/article/details/6014 ...

  5. 朴素贝叶斯分类器(Naive Bayes)

    1. 贝叶斯定理 如果有两个事件,事件A和事件B.已知事件A发生的概率为p(A),事件B发生的概率为P(B),事件A发生的前提下.事件B发生的概率为p(B|A),事件B发生的前提下.事件A发生的概率为 ...

  6. 朴素贝叶斯分类器的应用 Naive Bayes classifier

    一.病人分类的例子 让我从一个例子开始讲起,你会看到贝叶斯分类器很好懂,一点都不难. 某个医院早上收了六个门诊病人,如下表. 症状 职业 疾病 打喷嚏 护士 感冒  打喷嚏 农夫 过敏  头痛 建筑工 ...

  7. (数据科学学习手札30)朴素贝叶斯分类器的原理详解&Python与R实现

    一.简介 要介绍朴素贝叶斯(naive bayes)分类器,就不得不先介绍贝叶斯决策论的相关理论: 贝叶斯决策论(bayesian decision theory)是概率框架下实施决策的基本方法.对分 ...

  8. 朴素贝叶斯分类器(Naive Bayesian Classifier)

    本博客是基于对周志华教授所著的<机器学习>的"第7章 贝叶斯分类器"部分内容的学习笔记. 朴素贝叶斯分类器,顾名思义,是一种分类算法,且借助了贝叶斯定理.另外,它是一种 ...

  9. 用scikit-learn实现朴素贝叶斯分类器 转

    原文:http://segmentfault.com/a/1190000002472791 朴素贝叶斯(Naive Bayes Classifier)是一种「天真」的算法(假定所有特征发生概率是独立的 ...

随机推荐

  1. Spring学习(十八)----- Spring AOP+AspectJ注解实例

    我们将向你展示如何将AspectJ注解集成到Spring AOP框架.在这个Spring AOP+ AspectJ 示例中,让您轻松实现拦截方法. 常见AspectJ的注解: @Before – 方法 ...

  2. Cloud Native Weekly | 华为云抢先发布Redis5.0,红帽宣布收购混合云提供商 NooBaa

    1——华为云抢先发布Redis5.0 2——DigitalOcean K8s服务正式上线 3——红帽宣布收购混合云提供商 NooBaa 4——微软发布多项 Azure Kubernetes 服务更新 ...

  3. GitHub笔记(二)——远程仓库的操作

    二 远程仓库 1 创建联系 第1步:创建SSH Key.在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一 ...

  4. ats缓存规则

    一. 用户访问过程:1. ats收到一个用户对web对象的请求;2. 使用该地址, ats尝试着在其对象数据库(缓存)中用被请求对象的地址来定位该对象;3. 如果对象在缓存中, ats会检查该对象是否 ...

  5. CsvReader和CsvWriter操作csv文件

    使用方法: 提供把实例数据输出到磁盘csv文件的功能 提供读取csv文件,并封装成指定实例的功能 小工具自己依赖了slf4j+logbak,以及fastJson,如果与系统冲突,可以在pom文件中去除 ...

  6. Notes of Daily Scrum Meeting(11.13)

    Notes of Daily Scrum Meeting(11.13) 今天邹欣老师给我们讲课大家还是很有收获的,大家课堂的参与度确实有了很大的提升,而且邹欣老师关于项目Scrum Meeting报告 ...

  7. Software Defined Networking(Week 2, part 2)

    History of SDN 1.3 - 1.4 课程地址 Network Virtualization 网络可虚拟化,可以说是SDN的一项核心内容,同样也源自很多先前的技术和思想.我们先讨论何为网络 ...

  8. jquery前端第一讲

    1.bootstrap里面的文件是什么意思: bootstrap.cssbootstrap.min.cssbootstrap-responsive.cssbootstrap-responsive.mi ...

  9. 团队作业8——测试与发布(Beta阶段)之展示博客

    展示博客 1. 团队成员的简介和个人博客地址,团队的源码仓库地址. a.陈福鹏 擅长技术:java.web等网站方面技术: 博客:http://www.cnblogs.com/royalchen/b. ...

  10. Current request is not a multipart request

    1. 文件上传需要在form表单中添加<form enctype="multipart/form-data"> 2. SpringMVC默认是关闭fileupload功 ...