朴素贝叶斯

朴素贝叶斯是经典的机器学习算法之一,也是为数不多的基于概率论的分类算法。在机器学习分类算法中,朴素贝叶斯和其他绝多大的分类算法都不同,比如决策树,KNN,逻辑回归,支持向量机等,他们都是判别方法,也就是直接学习出特征输出Y和特征X之间的关系,要么是决策函数,要么是条件分布。但是朴素贝叶斯却是生成方法,这种算法简单,也易于实现。

1.基本概念

朴素贝叶斯:贝叶斯分类是一类分类算法的总称,这类算法均以贝叶斯定理为基础,故统称为贝叶斯分类。而朴素贝叶斯分类时贝叶斯分类中最简单,也是最常见的一种分类方法。

贝叶斯公式

python 朴素贝叶斯算法 权重 朴素贝叶斯算法分类_朴素贝叶斯

先验概率P(X):先验概率是指根据以往经验和分析得到的概率。

后验概率P(Y|X):事情已经发生,要求这件事情发生的原因是由某个因素引起的可能性的大小,后验分布P(Y|X)表示事件X已经发生的前提下,事件Y发生的概率,叫做事件X发生下事件Y的条件概率。

后验概率P(X|Y):在已知Y发生后X的条件概率,也由于知道Y的取值而被称为X的后验概率。

朴素:朴素贝叶斯算法是假设各个特征之间相互独立,也是朴素这词的意思,那么贝叶斯公式中的P(X|Y)可写成:

python 朴素贝叶斯算法 权重 朴素贝叶斯算法分类_分类算法_02

朴素贝叶斯公式

python 朴素贝叶斯算法 权重 朴素贝叶斯算法分类_编辑距离_03

2,贝叶斯算法简介

  贝叶斯方法源域它生前为解决一个“逆概”问题写的一篇文章。其要解决的问题:

  正向概率:假设袋子里面有N个白球,M个黑球,你伸手进去摸一把,摸出黑球的概率是多大

  逆向概率:如果我们事先不知道袋子里面黑白球的比例,而是闭着眼睛摸出一个(或者好几个)球,观察这些取出来的球的颜色之后,那么我们可以就此对袋子里面的黑白球的比例做出什么样的推测。

  那么什么是贝叶斯呢?

  • 1,现实世界本身就是不确定的,人类的观察能力是有局限性的
  • 2,我们日常观察到的只是事物表明上的结果,因此我们需要提供一个猜测

  NaiveBayes算法,又称朴素贝叶斯算法。朴素:特征条件独立;贝叶斯:基于贝叶斯定理。属于监督学习的生成模型,实现监督,没有迭代,并有坚实的数学理论(即贝叶斯定理)作为支撑。在大量样本下会有较好的表现,不适用于输入向量的特征条件有关联的场景。

  朴素贝叶斯会单独考量每一维独立特征被分类的条件概率,进而综合这些概率并对其所在的特征向量做出分类预测。因此,朴素贝叶斯的基本数据假设是:各个维度上的特征被分类的条件概率之间是相互独立的。它经常被用于文本分类中,包括互联网新闻的分类,垃圾邮件的筛选。

  朴素贝叶斯分类时一种十分简单的分类算法,叫他朴素贝叶斯分类时因为这种方法的思想真的很朴素,朴素贝叶斯的思想基础是这样的:对于给出的待分类项,求解在此项出现的条件下各个类别出现的概率,哪个最大,即认为此待分类项属于哪个类别。

3.贝叶斯算法的推导过程

联合概率:表示两件事共同发生(数学概念上的交集)的概念,A和B的联合概率表示为

P(AnB)。

  根据条件概率的定义,在事件B发生的条件下事件A发生的概率为:

python 朴素贝叶斯算法 权重 朴素贝叶斯算法分类_python 朴素贝叶斯算法 权重_04

  同样地,在事件A发生的条件下事件B发生的概率为:

python 朴素贝叶斯算法 权重 朴素贝叶斯算法分类_朴素贝叶斯_05

  结合这两个方程式,我们可以得到:

python 朴素贝叶斯算法 权重 朴素贝叶斯算法分类_分类算法_06

  这个引理有时称为概率乘法规则。上式两边同时除以P(A),若P(A)是非零的,我们可以得到贝叶斯定理:

python 朴素贝叶斯算法 权重 朴素贝叶斯算法分类_python 朴素贝叶斯算法 权重_07

事件X在事件Y发生的条件下的概率,与事件Y在事件X发生的条件下的概率是不一样的;然而这两者是有确定关系的,贝叶斯定理就是这种关系的陈述。

python 朴素贝叶斯算法 权重 朴素贝叶斯算法分类_分类算法_08

4.朴素贝叶斯分类的优缺点

优点:

(1) 算法逻辑简单,易于实现

(2)分类过程中时空开销小

缺点:

理论上,朴素贝叶斯模型与其他分类方法相比具有最小的误差率。但是实际上并非总是如此,这是因为朴素贝叶斯模型假设属性之间相互独立,这个假设在实际应用中往往是不成立的,在属性个数比较多或者属性之间相关性较大时,分类效果不好。

而在属性相关性较小时,朴素贝叶斯性能最为良好。对于这一点,有半朴素贝叶斯之类的算法通过考虑部分关联性适度改进。

5.代码实现

import re, collections
把语料中的单词全部抽取出来, 转成小写, 并且去除单词中间的特殊符号
def words(text): return re.findall('[a-z]+', text.lower())
我们用的是big.text这个语料库
要是遇到我们从来没有过见过的新词怎么办. 假如说一个词拼写完全正确, 但是语料库中没有包含这个词, 从而这个词也永远不会出现在训练集中.
于是, 我们就要返回出现这个词的概率是0. 这个情况不太妙, 因为概率为0这个代表了这个事件绝对不可能发生, 而在我们的概率模型中, 我们期望用一个很小的概率来代表这种情况.

lambda: 1

def train(features):

model = collections.defaultdict(lambda: 1)

for f in features:

model[f] += 1

return modelNWORDS = train(words(open('big.txt').read()))
alphabet = 'abcdefghijklmnopqrstuvwxyz'


返回所有与单词 w 编辑距离为 1 的集合
编辑距离是指使用了插入(在词中插入一个单字母), 删除(删除一个单字母), 交换(交换相邻两个字母), 替换(把一个字母换成另一个)的操作从一个词变到另一个词的次数.

def edits1(word):
n = len(word)
return set([word[0:i]+word[i+1:] for i in range(n)] +                     # deletion
[word[0:i]+word[i+1]+word[i]+word[i+2:] for i in range(n-1)] + # transposition
[word[0:i]+c+word[i+1:] for i in range(n) for c in alphabet] + # alteration
[word[0:i]+c+word[i:] for i in range(n+1) for c in alphabet])  # insertion


返回所有与单词 w 编辑距离为 2 的集合
在这些编辑距离小于2的词中间, 只把那些正确的词作为候选词
正常来说把一个元音拼成另一个的概率要大于辅音 (因为人常常把 hello 打成 hallo 这样); 把单词的第一个字母拼错的概率会相对小, 等等.但是为了简单起见, 选择了一个简单的方法: 编辑距离为1的正确单词比编辑距离为2的优先级高, 而编辑距离为0的正确单词优先级比编辑距离为1的高.

def known_edits2(word):
return set(e2 for e1 in edits1(word) for e2 in edits1(e1) if e2 in NWORDS)
def known(words): return set(w for w in words if w in NWORDS)
def correct(word):
candidates = known([word]) or known(edits1(word)) or known_edits2(word) or [word]
return max(candidates, key=lambda w: NWORDS[w])
print (correct("wort"))#这里是对wort修改,想测试其他的单词直接修改这一个单词就好了

6.数据

链接:https://pan.baidu.com/s/1SjqjhtLIRthaaoCViRHFIQ?pwd=6666 提取码:6666

1.[Python机器学习笔记:朴素贝叶斯算法(机器学习笔记:朴素贝叶斯算法. 朴素贝叶斯是经典的机器学习算法之一,也是为数不多的基于概率论的分类算法。.,对于大多数的分类算法,在所有的机器学习分类算法中,朴素贝叶斯和其他绝大多数的分类算法都不同。. 比如决策树,KNN,逻辑回归,支持向量机等,他们都是判别方法,也就是直接学习出特征输出Y和特征X之间的关系,要么是决策函数,要么是条件分布。. 但是朴素贝叶斯却是生成方法,该算法原理简单,也易于实现。.)

2.带你理解朴素贝叶斯分类算法