更新 4.贝叶斯的注释

This commit is contained in:
jiangzhonglian
2017-08-30 19:51:33 +08:00
parent 21b11c97ed
commit d50bf69d67
2 changed files with 10 additions and 6 deletions

View File

@@ -25,7 +25,7 @@
如果你对 p(x,y|c1) 符号很熟悉,那么可以跳过本小节。
有一个装了 7 块石头的罐子,其中 3 块是色的4 块是黑色的。如果从罐子中随机去除一块石头,那么是色石头的可能性是多少?由于取石头有 7 可能,其中 3 种为色,所以取出色石头的概率为 3/7 。那么取到黑色石头的概率又是多少呢?很显然,是 4/7 。我们使用 P(gray) 来表示取到色石头的概率,其概率值可以通过色石头数目除以总的石头数目来得到。
有一个装了 7 块石头的罐子,其中 3 块是色的4 块是黑色的。如果从罐子中随机取出一块石头,那么是色石头的可能性是多少?由于取石头有 7 可能,其中 3 种为色,所以取出色石头的概率为 3/7 。那么取到黑色石头的概率又是多少呢?很显然,是 4/7 。我们使用 P(white) 来表示取到色石头的概率,其概率值可以通过色石头数目除以总的石头数目来得到。
![包含 7 块石头的集合](/images/4.NaiveBayesian/NB_2.png)
@@ -33,13 +33,13 @@
![7块石头放入两个桶中](/images/4.NaiveBayesian/NB_3.png)
计算 P(gray) 或者 P(black) 如果事先我们知道石头所在桶的信息是会改变结果的。这就是所谓的条件概率conditional probablity。假定计算的是从 B 桶取到色石头的概率,这个概率可以记作 P(gray|bucketB) ,我们称之为“在已知石头出自 B 桶的条件下,取出色石头的概率”。不难得到P(gray|bucketA) 值为 2/4 P(gray|bucketB) 的值为 1/3 。
计算 P(white) 或者 P(black) 如果事先我们知道石头所在桶的信息是会改变结果的。这就是所谓的条件概率conditional probablity。假定计算的是从 B 桶取到色石头的概率,这个概率可以记作 P(white|bucketB) ,我们称之为“在已知石头出自 B 桶的条件下,取出色石头的概率”。不难得到P(white|bucketA) 值为 2/4 P(white|bucketB) 的值为 1/3 。
条件概率的计算公式如下:
P(gray|bucketB) = P(gray and bucketB) / P(bucketB)
P(white|bucketB) = P(white and bucketB) / P(bucketB)
首先,我们用 B 桶中色石头的个数除以两个桶中总的石头数,得到 P(gray and bucketB) = 1/7 .其次,由于 B 桶中有 3 块石头,而总石头数为 7 ,于是 P(bucketB) 就等于 3/7 。于是又 P(gray|bucketB) = P(gray and bucketB) / P(bucketB) = (1/7) / (3/7) = 1/3 。
首先,我们用 B 桶中色石头的个数除以两个桶中总的石头数,得到 P(white and bucketB) = 1/7 .其次,由于 B 桶中有 3 块石头,而总石头数为 7 ,于是 P(bucketB) 就等于 3/7 。于是又 P(white|bucketB) = P(white and bucketB) / P(bucketB) = (1/7) / (3/7) = 1/3 。
另外一种有效计算条件概率的方法称为贝叶斯准则。贝叶斯准则告诉我们如何交换条件概率中的条件与结果,即如果已知 P(x|c),要求 P(c|x),那么可以使用下面的计算方法:
@@ -57,7 +57,7 @@ P(gray|bucketB) = P(gray and bucketB) / P(bucketB)
使用上面这些定义,可以定义贝叶斯分类准则为:
* 如果 P(c1|x, y) > P(c2|x, y), 那么属于类别 c1;
* 如果 P(c1|x, y) > P(c2|x, y), 那么属于类别 c2.
* 如果 P(c2|x, y) > P(c1|x, y), 那么属于类别 c2.
在文档分类中,整个文档(如一封电子邮件)是实例,而电子邮件中的某些元素则构成特征。我们可以观察文档中出现的词,并把每个词的出现或者不出现作为一个特征,这样得到的特征数目就会跟词汇表中的数目一样多。

View File

@@ -90,8 +90,10 @@ def _trainNB0(trainMatrix, trainCategory):
p0Num += trainMatrix[i]
p0Denom += sum(trainMatrix[i])
# 类别1即侮辱性文档的[P(F1|C1),P(F2|C1),P(F3|C1),P(F4|C1),P(F5|C1)....]列表
# 即 在1类别下每个单词出现次数的占比
p1Vect = p1Num / p1Denom# [1,2,3,5]/90->[1/90,...]
# 类别0即正常文档的[P(F1|C0),P(F2|C0),P(F3|C0),P(F4|C0),P(F5|C0)....]列表
# 即 在0类别下每个单词出现次数的占比
p0Vect = p0Num / p0Denom
return p0Vect, p1Vect, pAbusive
@@ -111,7 +113,8 @@ def trainNB0(trainMatrix, trainCategory):
pAbusive = sum(trainCategory) / float(numTrainDocs)
# 构造单词出现次数列表
# p0Num 正常的统计
# p1Num 侮辱的统计
# p1Num 侮辱的统计
# 避免单词列表中的任何一个单词为0而导致最后的乘积为0所以将每个单词的出现次数初始化为 1
p0Num = ones(numWords)#[0,0......]->[1,1,1,1,1.....]
p1Num = ones(numWords)
@@ -151,6 +154,7 @@ def classifyNB(vec2Classify, p0Vec, p1Vec, pClass1):
# 计算公式 log(P(F1|C))+log(P(F2|C))+....+log(P(Fn|C))+log(P(C))
# 使用 NumPy 数组来计算两个向量相乘的结果这里的相乘是指对应元素相乘即先将两个向量中的第一个元素相乘然后将第2个元素相乘以此类推。
# 我的理解是:这里的 vec2Classify * p1Vec 的意思就是将每个词与其对应的概率相关联起来
# 可以理解为 1.单词在词汇表中的条件下文件是good 类别的概率 也可以理解为 2.在整个空间下文件既在词汇表中又是good类别的概率
p1 = sum(vec2Classify * p1Vec) + log(pClass1)
p0 = sum(vec2Classify * p0Vec) + log(1.0 - pClass1)
if p1 > p0: