对于有两个类别c1,c1的分类问题来说,其特征为w1,⋯,wn,特征之间是相互独立的,属于类别c1的贝叶斯模型的基本过程为:
P(c1∣w1,⋯,wn)=P(w1,⋯,wn∣c1)⋅P(c1) / P(w1,⋯,wn) 如果做句子分类,可以认为是出现了w1, w2, ..., wn这些词之后,该句子被归纳到c1类的概率。其中:
P(w1,⋯,wn)=P(w1,⋯,wn∣c1)⋅P(c1) + P(w1,⋯,wn∣c2)⋅P(c2)预测的过程使用到了上述的公式,即:
\[
P(c1∣w1,⋯,wn)=\frac{P(w1,⋯,wn∣c1)⋅P(c1)}{P(w1,⋯,wn∣c1)⋅P(c1)+P(w1,⋯,wn∣c2)⋅P(c2)}
\]
对上述的公式简化:
\[
P(c1∣w1,⋯,wn)=\frac{P(w1,⋯,wn∣c1)⋅P(c1)}{P(w1,⋯,wn∣c1)⋅P(c1)+P(w1,⋯,wn∣c2)⋅P(c2)}
\]
\[ =\frac{1}{1+\frac{P(w1,⋯,wn∣c2)⋅P(c2)}{P(w1,⋯,wn∣c1)⋅P(c1)}} \]
\[ =\frac{1}{1+exp[log(\frac{P(w1,⋯,wn∣c2)⋅P(c2)}{P(w1,⋯,wn∣c1)⋅P(c1)})]} \]
\[ =\frac{1}{1+exp[log(P(w1,⋯,wn∣c2)⋅P(c2))−log(P(w1,⋯,wn∣c1)⋅P(c1))]} \]
其中,分母中的1可以改写为:
\[
1=exp[log(P(w1,⋯,wn∣c1)⋅P(c1))−log(P(w1,⋯,wn∣c1)⋅P(c1))]
\]
根据上面的公式,针对c1, c2,我们需要
a. 先求\[ P(w1,⋯,wn∣c1)⋅P(c1) \]
b. 再求\[ P(c1) \]
结合代码
p(Ck) = k这类词出现的概率 = self.d[k].getsum() / self.total p(w1|Ck) = w1这个词在Ck类出现的概率 = self.d[k].freq(word) k = 1,2 c. 再计算\[ log(P(w1,⋯,wn∣c1)⋅P(c1)) \]
这个公式就是
\[
log(P(w1|c1)...p(wn∣c1)⋅P(c1))
\]
这个公式的结果就是:
\[
log(sum_{p(w1|C1)...p(wn|C1)}) + log(P(c1))
\]
最后展开:
\[
log(sum_{p(w1|C1)...p(wn|C1)}) + log(self.d[1].getsum()) - log(self.total))
\]
这个就是下面的 tmp[k]。其中,第一个for循环中的tmp[k]对应了公式中的log(P(ck)),第二个for循环中的tmp[k]对应了公式中的log(P(w1,⋯,wn∣ck)⋅P(ck))。两个for循环的结果就是最终的tmp[k]。
朴素贝叶斯分类模型(一)
朴素贝叶斯分类——大道至简
带你搞懂朴素贝叶斯分类算法
snownlp情感分析源码解析
朴素贝叶斯详解及中文舆情分析
[数据挖掘]朴素贝叶斯分类
NLP系列(2)_用朴素贝叶斯进行文本分类(上)
情感分析——深入snownlp原理和实践