[ML学习笔记] 朴素贝叶斯算法(Naive Bayesian)

## 贝叶斯公式

\[P(A\mid B) = \frac{P(B\mid A)P(A)}{P(B)}
\]

我们把P(A)称为"先验概率"(Prior probability),即在B事件发生之前,对A事件概率的一个判断。P(A|B)称为"后验概率"(Posterior probability),即在B事件发生之后,对A事件概率的重新评估。P(B|A)/P(B)称为"可能性函数"(Likelyhood),这是一个调整因子,使得预估概率更接近真实概率。

所以,条件概率可以理解成式子:后验概率 = 先验概率 x 调整因子。这就是贝叶斯推断的含义。先预估一个"先验概率",然后加入实验结果,看这个实验到底是增强还是削弱了"先验概率",由此得到更接近事实的"后验概率"。

而分类问题的目标是,根据给定特征得出类别。代入到贝叶斯公式中就是:

\[P(类别\mid 特征) = \frac{P(特征\mid 类别)P(类别)}{P(特征)}
\]

##拼写纠正实例

需求:当用户输入一个不在字典中的单词,推测他想输入的单词

猜测用户想输入的单词为h,而实际输入的单词D,根据公式有:

\[P(h\mid D) = \frac{P(h)P(D\mid h)}{P(D)}
\]

对于不同的猜测词h1、h2、h3...,P(h)为词频,P(D|h)可用不同字母的个数 / 键盘上的字母键位距离等评估,P(D)为一常数,在比较时可忽略。

于是有 \(P(h\mid D) \propto{P(h)P(D\mid h)}\) ,比较多种猜测中哪个概率最大则可以判断纠正为这个正确的单词。

### 模型比较理论

  • 最大似然:最符合观测数据的(即P(D|h)最大的)最有优势
  • 奥卡姆剃刀:P(h)较大的模型有较大的优势(越常见的最好 如在拟合曲线中不会使用高阶函数去拟合因为出现概率少)

### 代码

import re, collections

def words(text):
return re.findall('[a-z]+', text.lower()) #findall(pattern, string, flags=0) 返回string中所有与pattern相匹配的全部子串 def train(features):
model = collections.defaultdict(lambda: 1) #py2.7中的常用集合模块collections
for f in features:
model[f] += 1
return model NWORDS = train(words(open('big.txt').read())) alphabet = 'abcdefghijklmnopqrstuvwxyz' #两个词之间的编辑距离定义为 使用了几次插入、删除、交换、替换 def edits1(word): #编辑距离为1
n = len(word)
return set([word[0:i]+word[i+1:] for i in range(n)] + #删除
[word[0:i]+word[i+1]+word[i]+word[i+2:] for i in range(n)] + #交换
[word[0:i]+c+word[i+1:] for i in range(n) for c in alphabet] + #替换
[word[0:i]+c+word[i:] for i in range(n) for c in alphabet] #插入
) def edits2(word): #编辑距离为2
return set(e2 for e1 in edits1(word) for e2 in edits1(e1)) #只返回正确的单词
def known(words):
return set(w for w in words if w in NWORDS) #如果known(set)非空 则不再计算后面的
def correct(word):
candidates = known([word]) or known(edits1(word)) or known(edits2(word)) or [word]
return max(candidates, key=lambda w: NWORDS[w]) #返回概率最大的值 # argmaxc P(c|w) -> argmaxc P(w|c)P(c)/P(w)
# P(c) c的词频 P(w|c) 在想键入c的情况下敲成w的概率

## 垃圾邮件过滤实例

这是一个典型的二分类问题。设邮件内容为D,h+表示垃圾邮件 h-表示正常邮件。

于是有

P(h+|D) = P(h+)P(D|h+)/P(D)

P(h-|D) = P(h-)P(D|h-)/P(D)

假设D里面含有N个单词d1,d2,d3...,

P(D|h+) = P(d1,d2,...,dn|h+) = P(d1|h+) * P(d2|d1,h+) * P(d3|d2,d1,h+) * ...

由于朴素贝叶斯分类器基于一个简单的假定:给定目标值时属性之间相互条件独立,于是可化为 P(d1|h+) * P(d2|h+) * P(d3|h+) * ... 也即统计词频

[ML学习笔记] 朴素贝叶斯算法(Naive Bayesian)的更多相关文章

  1. Andrew Ng机器学习公开课笔记 -- 朴素贝叶斯算法

    网易公开课,第5,6课 notes,http://cs229.stanford.edu/notes/cs229-notes2.pdf 前面讨论了高斯判别分析,是一种生成学习算法,其中x是连续值 这里要 ...

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

    这篇文章做了什么 朴素贝叶斯算法是机器学习中非常重要的分类算法,用途十分广泛,如垃圾邮件处理等.而情感分析(Sentiment Analysis)是自然语言处理(Natural Language Pr ...

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

    C#编程实现 这篇文章做了什么 朴素贝叶斯算法是机器学习中非常重要的分类算法,用途十分广泛,如垃圾邮件处理等.而情感分析(Sentiment Analysis)是自然语言处理(Natural Lang ...

  4. 朴素贝叶斯算法(Naive Bayes)

    朴素贝叶斯算法(Naive Bayes) 阅读目录 一.病人分类的例子 二.朴素贝叶斯分类器的公式 三.账号分类的例子 四.性别分类的例子 生活中很多场合需要用到分类,比如新闻分类.病人分类等等. 本 ...

  5. 【十大算法实现之naive bayes】朴素贝叶斯算法之文本分类算法的理解与实现

    关于bayes的基础知识,请参考: 基于朴素贝叶斯分类器的文本聚类算法 (上) http://www.cnblogs.com/phinecos/archive/2008/10/21/1315948.h ...

  6. Python机器学习笔记:朴素贝叶斯算法

    朴素贝叶斯是经典的机器学习算法之一,也是为数不多的基于概率论的分类算法.对于大多数的分类算法,在所有的机器学习分类算法中,朴素贝叶斯和其他绝大多数的分类算法都不同.比如决策树,KNN,逻辑回归,支持向 ...

  7. Python机器学习算法 — 朴素贝叶斯算法(Naive Bayes)

    朴素贝叶斯算法 -- 简介 朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法.最为广泛的两种分类模型是决策树模型(Decision Tree Model)和朴素贝叶斯模型(Naive Baye ...

  8. 机器学习---用python实现朴素贝叶斯算法(Machine Learning Naive Bayes Algorithm Application)

    在<机器学习---朴素贝叶斯分类器(Machine Learning Naive Bayes Classifier)>一文中,我们介绍了朴素贝叶斯分类器的原理.现在,让我们来实践一下. 在 ...

  9. Naive Bayes(朴素贝叶斯算法)[分类算法]

    Naïve Bayes(朴素贝叶斯)分类算法的实现 (1) 简介: (2)   算法描述: (3) <?php /* *Naive Bayes朴素贝叶斯算法(分类算法的实现) */ /* *把. ...

随机推荐

  1. input输入框file类型第二次不触发onchange事件的解决办法,简单有效

    在网上看了很多办法,现在将网上大部分说法总结如下: 网上说法: 原因:选择一次后onchange事件没有绑定到input标签上:    解决办法:拷贝一份input标签的副本,每次选择后对原input ...

  2. b'driver "overlay" failed to remove root filesystem 的解决方法

    1.docker-compose启的nexus仓库意外dead   公司的maven私服nexus是通过docker-compose启动的,不知道什么原因意外死掉了.再次启动的时候报错: [root@ ...

  3. params关键字、工具辅助类与、加密与解密

    一.params关键字 在C#中如果给方法的参数加上关键字params则会形成可变参数,在传递时可以是0-n个对象. 示例: using System; using System.Collection ...

  4. c++/c 获取cpp文件行号跟文件名

    编译器内置宏: 先介绍几个编译器内置的宏定义,这些宏定义不仅可以帮助我们完成跨平台的源码编写,灵活使用也可以巧妙地帮我们输出非常有用的调试信息. ANSI C标准中有几个标准预定义宏(也是常用的): ...

  5. MVC在filter中如何获取控制器名称和Action名称

    使用ActionExecutingContext对象可以获取控制器名称.Action名称.参数名称以及参数值.路由和Action返回值不影响结果. 在代码中 [AttributeUsage(Attri ...

  6. js中Date 方法

    Date (对象) Date 对象能够使你获得相对于国际标准时间(格林威治标准时间,现在被称为 UTC-Universal Coordinated Time)或者是 Flash 播放器正运行的操作系统 ...

  7. 集合框架二(Collection接口实现类常用遍历方法)

    四种常用遍历方式 Collection coll = new ArrayList(); coll.add("123"); coll.add("456"); co ...

  8. JS UNIX 时间戳与时间格式转换

    上代码,不多说了,这个没啥说的,记录一下: var date = new Date() // Date 2019-03-05T13:50:39.775Z // 获取1970 至今的毫秒数 var ti ...

  9. python乐观锁、悲观锁

    二.乐观锁总是认为不会产生并发问题,每次去取数据的时候总认为不会有其他线程对数据进行修改,因此不会上锁,但是在更新时会判断其他线程在这之前有没有对数据进行修改 三.悲观锁总是假设最坏的情况,每次取数据 ...

  10. dubbo 图片服务器(FastDFS) redis solr ActiveMQ等简单配置使用

    一.dubbo 项目基于soa的架构,表现层和服务层是不同的工程.所以要实现商品列表查询需要两个系统之间进行通信. 1.1如何实现远程通信? 1.Webservice:效率不高基于soap协议.项目中 ...