From d50bf69d67fc44403a9dc2a288eb5ca2a64a3e18 Mon Sep 17 00:00:00 2001 From: jiangzhonglian Date: Wed, 30 Aug 2017 19:51:33 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=204.=E8=B4=9D=E5=8F=B6?= =?UTF-8?q?=E6=96=AF=E7=9A=84=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/4.朴素贝叶斯.md | 10 +++++----- src/python/4.NaiveBayes/bayes.py | 6 +++++- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/docs/4.朴素贝叶斯.md b/docs/4.朴素贝叶斯.md index b459102f..1b48db99 100644 --- a/docs/4.朴素贝叶斯.md +++ b/docs/4.朴素贝叶斯.md @@ -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. 在文档分类中,整个文档(如一封电子邮件)是实例,而电子邮件中的某些元素则构成特征。我们可以观察文档中出现的词,并把每个词的出现或者不出现作为一个特征,这样得到的特征数目就会跟词汇表中的数目一样多。 diff --git a/src/python/4.NaiveBayes/bayes.py b/src/python/4.NaiveBayes/bayes.py index 5ace46fd..6d614a57 100755 --- a/src/python/4.NaiveBayes/bayes.py +++ b/src/python/4.NaiveBayes/bayes.py @@ -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: